iutil.c - ploot - simple plotting tools Err bitreich.org 70 hgit clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot URL:git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot bitreich.org 70 1Log /scm/ploot/log.gph bitreich.org 70 1Files /scm/ploot/files.gph bitreich.org 70 1Refs /scm/ploot/refs.gph bitreich.org 70 1Tags /scm/ploot/tag bitreich.org 70 1README /scm/ploot/file/README.md.gph bitreich.org 70 1LICENSE /scm/ploot/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iutil.c (3219B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include "util.h" Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 char const *arg0; Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 static void Err bitreich.org 70 i 14 _log(char const *fmt, va_list va) Err bitreich.org 70 i 15 { Err bitreich.org 70 i 16 if (arg0 != NULL) Err bitreich.org 70 i 17 fprintf(stderr, "%s: ", arg0); Err bitreich.org 70 i 18 vfprintf(stderr, fmt, va); Err bitreich.org 70 i 19 fprintf(stderr, "\n"); Err bitreich.org 70 i 20 fflush(stderr); Err bitreich.org 70 i 21 } Err bitreich.org 70 i 22 Err bitreich.org 70 i 23 void Err bitreich.org 70 i 24 err(int e, char const *fmt, ...) Err bitreich.org 70 i 25 { Err bitreich.org 70 i 26 va_list va; Err bitreich.org 70 i 27 Err bitreich.org 70 i 28 va_start(va, fmt); Err bitreich.org 70 i 29 _log( fmt, va); Err bitreich.org 70 i 30 exit(e); Err bitreich.org 70 i 31 } Err bitreich.org 70 i 32 Err bitreich.org 70 i 33 void Err bitreich.org 70 i 34 warn(char const *fmt, ...) Err bitreich.org 70 i 35 { Err bitreich.org 70 i 36 va_list va; Err bitreich.org 70 i 37 Err bitreich.org 70 i 38 va_start(va, fmt); Err bitreich.org 70 i 39 _log(fmt, va); Err bitreich.org 70 i 40 } Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 void Err bitreich.org 70 i 43 debug(char const *fmt, ...) Err bitreich.org 70 i 44 { Err bitreich.org 70 i 45 static int verbose = -1; Err bitreich.org 70 i 46 va_list va; Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 if (verbose < 0) Err bitreich.org 70 i 49 verbose = (getenv("DEBUG") != NULL); Err bitreich.org 70 i 50 if (!verbose) Err bitreich.org 70 i 51 return; Err bitreich.org 70 i 52 va_start(va, fmt); Err bitreich.org 70 i 53 _log(fmt, va); Err bitreich.org 70 i 54 } Err bitreich.org 70 i 55 Err bitreich.org 70 i 56 size_t Err bitreich.org 70 i 57 strlcpy(char *buf, const char *str, size_t sz) Err bitreich.org 70 i 58 { Err bitreich.org 70 i 59 size_t len, cpy; Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 cpy = ((len = strlen(str)) > sz) ? (sz) : (len); Err bitreich.org 70 i 62 memcpy(buf, str, cpy); Err bitreich.org 70 i 63 buf[sz - 1] = '\0'; Err bitreich.org 70 i 64 return len; Err bitreich.org 70 i 65 } Err bitreich.org 70 i 66 Err bitreich.org 70 i 67 void Err bitreich.org 70 i 68 put3utf(long rune) Err bitreich.org 70 i 69 { Err bitreich.org 70 i 70 putchar((char)(0xe0 | (0x0f & (rune >> 12)))); /* 1110xxxx */ Err bitreich.org 70 i 71 putchar((char)(0x80 | (0x3f & (rune >> 6)))); /* 10xxxxxx */ Err bitreich.org 70 i 72 putchar((char)(0x80 | (0x3f & (rune)))); /* 10xxxxxx */ Err bitreich.org 70 i 73 } Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 char * Err bitreich.org 70 i 76 strsep(char **strp, const char *sep) Err bitreich.org 70 i 77 { Err bitreich.org 70 i 78 char *s, *prev; Err bitreich.org 70 i 79 Err bitreich.org 70 i 80 if (*strp == NULL) Err bitreich.org 70 i 81 return NULL; Err bitreich.org 70 i 82 for (s = prev = *strp; strchr(sep, *s) == NULL; s++); Err bitreich.org 70 i 83 if (*s == '\0') { Err bitreich.org 70 i 84 *strp = NULL; Err bitreich.org 70 i 85 return prev; Err bitreich.org 70 i 86 } Err bitreich.org 70 i 87 *s = '\0'; Err bitreich.org 70 i 88 *strp = s + 1; Err bitreich.org 70 i 89 Err bitreich.org 70 i 90 return prev; Err bitreich.org 70 i 91 } Err bitreich.org 70 i 92 Err bitreich.org 70 i 93 void Err bitreich.org 70 i 94 strchomp(char *s) Err bitreich.org 70 i 95 { Err bitreich.org 70 i 96 char *x = s + strlen(s); Err bitreich.org 70 i 97 Err bitreich.org 70 i 98 while (--x >= s && (*x == '\r' || *x == '\n')) Err bitreich.org 70 i 99 *x = '\0'; Err bitreich.org 70 i 100 } Err bitreich.org 70 i 101 Err bitreich.org 70 i 102 /* Err bitreich.org 70 i 103 * Set 'str' to a human-readable form of 'num' with always a width of 8 (+1 for Err bitreich.org 70 i 104 * the '\0' terminator). Buffer overflow is ensured not to happen due to the Err bitreich.org 70 i 105 * max size of a double. Return the exponent. Err bitreich.org 70 i 106 */ Err bitreich.org 70 i 107 int Err bitreich.org 70 i 108 humanize(char *str, double val) Err bitreich.org 70 i 109 { Err bitreich.org 70 i 110 int exp, precision; Err bitreich.org 70 i 111 char label[] = { '\0', 'M', 'G', 'T', 'E' }; Err bitreich.org 70 i 112 Err bitreich.org 70 i 113 for (exp = 0; ABS(val) > 1000; exp++) Err bitreich.org 70 i 114 val /= 1000; Err bitreich.org 70 i 115 Err bitreich.org 70 i 116 precision = (ABS(val) < 10) ? 2 : (ABS(val) < 100) ? 1 : 0; Err bitreich.org 70 i 117 precision += (exp == 0); Err bitreich.org 70 i 118 Err bitreich.org 70 i 119 snprintf(str, 9, "%+.*f %c", precision, val, label[exp]); Err bitreich.org 70 i 120 str[8] = '\0'; Err bitreich.org 70 i 121 if (val >= 0) Err bitreich.org 70 i 122 str[0] = ' '; Err bitreich.org 70 i 123 Err bitreich.org 70 i 124 return exp * 3; Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 Err bitreich.org 70 i 127 time_t Err bitreich.org 70 i 128 scale_time_t(time_t min, time_t max, int dots) Err bitreich.org 70 i 129 { Err bitreich.org 70 i 130 time_t dt, scale[] = { Err bitreich.org 70 i 131 1, 5, 2, 10, 20, 30, 60, 60*2, 60*5, 60*10, 60*20, 60*30, 3600, Err bitreich.org 70 i 132 3600*2, 3600*6, 3600*12, 3600*24, 3600*24*2, Err bitreich.org 70 i 133 3600*24*7, 3600*24*14, 3600*24*20, 3600*24*21, 3600*24*28, 3600*24*50, Err bitreich.org 70 i 134 3600*24*100, 3600*24*365, 0 Err bitreich.org 70 i 135 }; Err bitreich.org 70 i 136 Err bitreich.org 70 i 137 dt = max - min; Err bitreich.org 70 i 138 for (time_t *sc = scale; *sc > 0; sc++) Err bitreich.org 70 i 139 if (dt < *sc * dots) Err bitreich.org 70 i 140 return *sc; Err bitreich.org 70 i 141 return dt / dots; Err bitreich.org 70 i 142 } Err bitreich.org 70 i 143 Err bitreich.org 70 i 144 /* Err bitreich.org 70 i 145 * Make the value scale aligned with round values by changing the Err bitreich.org 70 i 146 * minimal and maximal values. Err bitreich.org 70 i 147 */ Err bitreich.org 70 i 148 double Err bitreich.org 70 i 149 scale_double(double min, double max, int rows) Err bitreich.org 70 i 150 { Err bitreich.org 70 i 151 double dv, step, scale[] = { 1, 2, 2.5, 5, }; Err bitreich.org 70 i 152 Err bitreich.org 70 i 153 dv = max - min; Err bitreich.org 70 i 154 step = 1; Err bitreich.org 70 i 155 if (dv > 1) { Err bitreich.org 70 i 156 for (double mant = 1;; mant *= 10) { Err bitreich.org 70 i 157 double *sc = scale; Err bitreich.org 70 i 158 for (; sc < scale + LEN(scale); sc++) { Err bitreich.org 70 i 159 step = mant * *sc; Err bitreich.org 70 i 160 if (dv < rows * step) Err bitreich.org 70 i 161 return step; Err bitreich.org 70 i 162 } Err bitreich.org 70 i 163 } Err bitreich.org 70 i 164 } else { Err bitreich.org 70 i 165 for (double mant = 1;; mant /= 10) { Err bitreich.org 70 i 166 double *sc = scale + LEN(scale) - 1; Err bitreich.org 70 i 167 for (; sc >= scale; sc--) { Err bitreich.org 70 i 168 double tmp = mant * *sc; Err bitreich.org 70 i 169 if (dv > rows * tmp) Err bitreich.org 70 i 170 return step; Err bitreich.org 70 i 171 step = tmp; Err bitreich.org 70 i 172 } Err bitreich.org 70 i 173 } Err bitreich.org 70 i 174 } Err bitreich.org 70 i 175 assert(!"not reached"); Err bitreich.org 70 i 176 return 0; Err bitreich.org 70 i 177 } Err bitreich.org 70 .