Not generic enough
[llpp.git] / cutils.c
blob13a176ec53c8dd7046d9c0420e1f3b24ecb6483f
1 #include <ctype.h>
2 #include <stdio.h>
3 #include <errno.h>
4 #include <stdarg.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <inttypes.h>
9 #include <sys/time.h>
10 #include <sys/ioctl.h>
12 #include "cutils.h"
14 extern void NORETURN_ATTR GCC_FMT_ATTR (2, 3)
15 err (int exitcode, const char *fmt, ...);
16 extern void NORETURN_ATTR GCC_FMT_ATTR (2, 3)
17 errx (int exitcode, const char *fmt, ...);
19 void NORETURN_ATTR GCC_FMT_ATTR (2, 3) err (int exitcode, const char *fmt, ...)
21 va_list ap;
22 int savederrno;
24 savederrno = errno;
25 va_start (ap, fmt);
26 vfprintf (stderr, fmt, ap);
27 va_end (ap);
28 fprintf (stderr, ": %s\n", strerror (savederrno));
29 fflush (stderr);
30 _exit (exitcode);
33 void NORETURN_ATTR GCC_FMT_ATTR (2, 3) errx (int exitcode, const char *fmt, ...)
35 va_list ap;
37 va_start (ap, fmt);
38 vfprintf (stderr, fmt, ap);
39 va_end (ap);
40 fputc ('\n', stderr);
41 fflush (stderr);
42 _exit (exitcode);
45 void *parse_pointer (const char *cap, const char *s)
47 int ret;
48 void *ptr;
50 ret = sscanf (s, "%" SCN_ptr, (uintptr_t *) &ptr);
51 if (ret != 1) {
52 errx (1, "%s: cannot parse pointer in `%s'", cap, s);
54 return ptr;
57 double now (void)
59 struct timeval tv;
60 gettimeofday (&tv, NULL);
61 return tv.tv_sec + tv.tv_usec*1e-6;
64 /* slightly tweaked fmt_ulong by D.J. Bernstein */
65 void fmt_linkn (char *s, unsigned int u)
67 unsigned int len; unsigned int q;
68 unsigned int zma = 'z' - 'a' + 1;
69 len = 1; q = u;
70 while (q > zma - 1) { ++len; q /= zma; }
71 if (s) {
72 s += len;
73 do { *--s = (char)('a' + (u % zma) - (u < zma && len > 1));
74 u /= zma; } while(u);
75 /* handles u == 0 */
77 s[len] = 0;
80 char *ystrdup (const char *s)
82 size_t len = strlen (s);
83 if (len > 0) {
84 char *r = malloc (len+1);
85 if (!r) errx (1, "malloc %zu", len+1);
86 memcpy (r, s, len+1);
87 return r;
89 return NULL;