Introduction
Introduction Statistics Contact Development Disclaimer Help
tutil.c - ploot - simple plotting tools
git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65…
Log
Files
Refs
Tags
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)))); /* 1110xxx…
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 …
59 * the '\0' terminator). Buffer overflow is ensured not to happen due t…
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 }
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.