tutil.c - ploot - simple plotting tools
(HTM) git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
tutil.c (1510B)
---
1 #include "util.h"
2
3 #include <ctype.h>
4 #include <errno.h>
5 #include <limits.h>
6 #include <stdarg.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 size_t
12 strlcpy(char *buf, const char *str, size_t sz)
13 {
14 size_t len, cpy;
15
16 cpy = ((len = strlen(str)) > sz) ? (sz) : (len);
17 memcpy(buf, str, cpy);
18 buf[sz - 1] = '\0';
19 return len;
20 }
21
22 void
23 put3utf(long rune)
24 {
25 putchar((char)(0xe0 | (0x0f & (rune >> 12)))); /* 1110xxxx */
26 putchar((char)(0x80 | (0x3f & (rune >> 6)))); /* 10xxxxxx */
27 putchar((char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */
28 }
29
30 char *
31 strsep(char **strp, const char *sep)
32 {
33 char *s, *prev;
34
35 if (*strp == NULL)
36 return NULL;
37 for (s = prev = *strp; strchr(sep, *s) == NULL; s++);
38 if (*s == '\0') {
39 *strp = NULL;
40 return prev;
41 }
42 *s = '\0';
43 *strp = s + 1;
44
45 return prev;
46 }
47
48 void
49 strchomp(char *s)
50 {
51 char *x = s + strlen(s);
52
53 while (--x >= s && (*x == '\r' || *x == '\n'))
54 *x = '\0';
55 }
56
57 /*
58 * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for
59 * the '\0' terminator). Buffer overflow is ensured not to happen due to the
60 * max size of a double. Return the exponent.
61 */
62 int
63 humanize(char *str, double val)
64 {
65 int exp, precision;
66 char label[] = { '\0', 'M', 'G', 'T', 'E' };
67
68 for (exp = 0; ABS(val) > 1000; exp++)
69 val /= 1000;
70
71 precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0;
72 precision += (exp == 0);
73
74 snprintf(str, 9, "%+.*f %c", precision, val, label[exp]);
75 str[8] = '\0';
76 if (val >= 0)
77 str[0] = ' ';
78
79 return exp * 3;
80 }