tutil.c - ploot - simple plotting tools HTML 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 }