From: William Lallemand Date: Fri, 3 Oct 2025 14:04:55 +0000 (+0200) Subject: CLEANUP: mjson: remove MJSON_ENABLE_PRINT code X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a4eeeeeb077290db2e1c5664800382cff970fbc8;p=thirdparty%2Fhaproxy.git CLEANUP: mjson: remove MJSON_ENABLE_PRINT code Remove the code used under #if MJSON_ENABLE_PRINT, which is not used within haproxy, to ease the maintenance of mjson. --- diff --git a/include/import/mjson.h b/include/import/mjson.h index 7cd666e52..55c1995d4 100644 --- a/include/import/mjson.h +++ b/include/import/mjson.h @@ -108,36 +108,6 @@ int mjson_get_base64(const char *s, int len, const char *path, char *to, int n); int mjson_base64_dec(const char *src, int n, char *dst, int dlen); #endif -#if MJSON_ENABLE_PRINT -typedef int (*mjson_print_fn_t)(const char *buf, int len, void *userdata); -typedef int (*mjson_vprint_fn_t)(mjson_print_fn_t, void *, va_list *); - -struct mjson_fixedbuf { - char *ptr; - int size, len; -}; - -int mjson_printf(mjson_print_fn_t, void *, const char *fmt, ...); -int mjson_vprintf(mjson_print_fn_t, void *, const char *fmt, va_list ap); -int mjson_print_str(mjson_print_fn_t, void *, const char *s, int len); -int mjson_print_int(mjson_print_fn_t, void *, int value, int is_signed); -int mjson_print_long(mjson_print_fn_t, void *, long value, int is_signed); -int mjson_print_buf(mjson_print_fn_t fn, void *, const char *buf, int len); - -int mjson_print_null(const char *ptr, int len, void *userdata); -int mjson_print_fixed_buf(const char *ptr, int len, void *userdata); -int mjson_print_dynamic_buf(const char *ptr, int len, void *userdata); - -#if MJSON_ENABLE_PRETTY -int mjson_pretty(const char *, int, const char *, mjson_print_fn_t, void *); -#endif - -#if MJSON_ENABLE_MERGE -int mjson_merge(const char *, int, const char *, int, mjson_print_fn_t, void *); -#endif - -#endif // MJSON_ENABLE_PRINT - #ifdef __cplusplus } #endif diff --git a/src/mjson.c b/src/mjson.c index bdd1e3c7f..1a1733fbf 100644 --- a/src/mjson.c +++ b/src/mjson.c @@ -466,257 +466,6 @@ int mjson_next(const char *s, int n, int off, int *koff, int *klen, int *voff, } #endif -#if MJSON_ENABLE_PRINT -int mjson_print_fixed_buf(const char *ptr, int len, void *fndata) { - struct mjson_fixedbuf *fb = (struct mjson_fixedbuf *) fndata; - int i, left = fb->size - 1 - fb->len; - if (left < len) len = left; - for (i = 0; i < len; i++) fb->ptr[fb->len + i] = ptr[i]; - fb->len += len; - fb->ptr[fb->len] = '\0'; - return len; -} - -// This function allocates memory in chunks of size MJSON_DYNBUF_CHUNK -// to decrease memory fragmentation, when many calls are executed to -// print e.g. a base64 string or a hex string. -int mjson_print_dynamic_buf(const char *ptr, int len, void *fndata) { - char *s, *buf = *(char **) fndata; - size_t curlen = buf == NULL ? 0 : strlen(buf); - size_t new_size = curlen + len + 1 + MJSON_DYNBUF_CHUNK; - new_size -= new_size % MJSON_DYNBUF_CHUNK; - - if ((s = (char *) realloc(buf, new_size)) == NULL) { - return 0; - } else { - memcpy(s + curlen, ptr, len); - s[curlen + len] = '\0'; - *(char **) fndata = s; - return len; - } -} - -int mjson_print_null(const char *ptr, int len, void *userdata) { - (void) ptr; - (void) userdata; - return len; -} - -int mjson_print_buf(mjson_print_fn_t fn, void *fnd, const char *buf, int len) { - return fn(buf, len, fnd); -} - -int mjson_print_long(mjson_print_fn_t fn, void *fnd, long val, int is_signed) { - unsigned long v = val, s = 0, n, i; - char buf[20], t; - if (is_signed && val < 0) { - buf[s++] = '-', v = -val; - } - // This loop prints a number in reverse order. I guess this is because we - // write numbers from right to left: least significant digit comes last. - // Maybe because we use Arabic numbers, and Arabs write RTL? - for (n = 0; v > 0; v /= 10) buf[s + n++] = "0123456789"[v % 10]; - // Reverse a string - for (i = 0; i < n / 2; i++) - t = buf[s + i], buf[s + i] = buf[s + n - i - 1], buf[s + n - i - 1] = t; - if (val == 0) buf[n++] = '0'; // Handle special case - return fn(buf, s + n, fnd); -} - -int mjson_print_int(mjson_print_fn_t fn, void *fnd, int v, int s) { - return mjson_print_long(fn, fnd, s ? (long) v : (unsigned) v, s); -} - -static int addexp(char *buf, int e, int sign) { - int n = 0; - buf[n++] = 'e'; - buf[n++] = sign; - if (e > 400) return 0; - if (e < 10) buf[n++] = '0'; - if (e >= 100) buf[n++] = (e / 100) + '0', e -= 100 * (e / 100); - if (e >= 10) buf[n++] = (e / 10) + '0', e -= 10 * (e / 10); - buf[n++] = e + '0'; - return n; -} - -int mjson_print_dbl(mjson_print_fn_t fn, void *fnd, double d, int width) { - char buf[40]; - int i, s = 0, n = 0, e = 0; - double t, mul, saved; - if (d == 0.0) return fn("0", 1, fnd); - if (isinf(d)) return fn(d > 0 ? "inf" : "-inf", d > 0 ? 3 : 4, fnd); - if (isnan(d)) return fn("nan", 3, fnd); - if (d < 0.0) d = -d, buf[s++] = '-'; - - // Round - saved = d; - mul = 1.0; - while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0; - while (d <= 1.0 && d / mul <= 1.0) mul /= 10.0; - for (i = 0, t = mul * 5; i < width; i++) t /= 10.0; - d += t; - // Calculate exponent, and 'mul' for scientific representation - mul = 1.0; - while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0, e++; - while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--; - // printf(" --> %g %d %g %g\n", saved, e, t, mul); - - if (e >= width) { - struct mjson_fixedbuf fb = {buf + s, (int) sizeof(buf) - s, 0}; - n = mjson_print_dbl(mjson_print_fixed_buf, &fb, saved / mul, width); - // printf(" --> %.*g %d [%.*s]\n", 10, d / t, e, fb.len, fb.ptr); - n += addexp(buf + s + n, e, '+'); - return fn(buf, s + n, fnd); - } else if (e <= -width) { - struct mjson_fixedbuf fb = {buf + s, (int) sizeof(buf) - s, 0}; - n = mjson_print_dbl(mjson_print_fixed_buf, &fb, saved / mul, width); - // printf(" --> %.*g %d [%.*s]\n", 10, d / mul, e, fb.len, fb.ptr); - n += addexp(buf + s + n, -e, '-'); - return fn(buf, s + n, fnd); - } else { - for (i = 0, t = mul; d >= 1.0 && s + n < (int) sizeof(buf); i++) { - int ch = (int) (d / t); - if (n > 0 || ch > 0) buf[s + n++] = ch + '0'; - d -= ch * t; - t /= 10.0; - } - // printf(" --> [%g] -> %g %g (%d) [%.*s]\n", saved, d, t, n, s + n, buf); - if (n == 0) buf[s++] = '0'; - while (t >= 1.0 && n + s < (int) sizeof(buf)) buf[n++] = '0', t /= 10.0; - if (s + n < (int) sizeof(buf)) buf[n + s++] = '.'; - // printf(" 1--> [%g] -> [%.*s]\n", saved, s + n, buf); - for (i = 0, t = 0.1; s + n < (int) sizeof(buf) && n < width; i++) { - int ch = (int) (d / t); - buf[s + n++] = ch + '0'; - d -= ch * t; - t /= 10.0; - } - } - while (n > 0 && buf[s + n - 1] == '0') n--; // Trim trailing zeros - if (n > 0 && buf[s + n - 1] == '.') n--; // Trim trailing dot - return fn(buf, s + n, fnd); -} - -int mjson_print_str(mjson_print_fn_t fn, void *fnd, const char *s, int len) { - int i, n = fn("\"", 1, fnd); - for (i = 0; i < len; i++) { - char c = mjson_escape(s[i]); - if (c) { - n += fn("\\", 1, fnd); - n += fn(&c, 1, fnd); - } else { - n += fn(&s[i], 1, fnd); - } - } - return n + fn("\"", 1, fnd); -} - -#if MJSON_ENABLE_BASE64 -int mjson_print_b64(mjson_print_fn_t fn, void *fnd, const unsigned char *s, - int n) { - const char *t = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - int i, len = fn("\"", 1, fnd); - for (i = 0; i < n; i += 3) { - int a = s[i], b = i + 1 < n ? s[i + 1] : 0, c = i + 2 < n ? s[i + 2] : 0; - char buf[4] = {t[a >> 2], t[(a & 3) << 4 | (b >> 4)], '=', '='}; - if (i + 1 < n) buf[2] = t[(b & 15) << 2 | (c >> 6)]; - if (i + 2 < n) buf[3] = t[c & 63]; - len += fn(buf, sizeof(buf), fnd); - } - return len + fn("\"", 1, fnd); -} -#endif /* MJSON_ENABLE_BASE64 */ - -int mjson_vprintf(mjson_print_fn_t fn, void *fnd, const char *fmt, - va_list xap) { - int i = 0, n = 0; - va_list ap; - va_copy(ap, xap); - while (fmt[i] != '\0') { - if (fmt[i] == '%') { - char fc = fmt[++i]; - int is_long = 0; - if (fc == 'l') { - is_long = 1; - fc = fmt[i + 1]; - } - if (fc == 'Q') { - char *buf = va_arg(ap, char *); - n += mjson_print_str(fn, fnd, buf ? buf : "", - buf ? (int) strlen(buf) : 0); - } else if (strncmp(&fmt[i], ".*Q", 3) == 0) { - int len = va_arg(ap, int); - char *buf = va_arg(ap, char *); - n += mjson_print_str(fn, fnd, buf, len); - i += 2; - } else if (fc == 'd' || fc == 'u') { - int is_signed = (fc == 'd'); - if (is_long) { - long val = va_arg(ap, long); - n += mjson_print_long(fn, fnd, val, is_signed); - i++; - } else { - int val = va_arg(ap, int); - n += mjson_print_int(fn, fnd, val, is_signed); - } - } else if (fc == 'B') { - const char *s = va_arg(ap, int) ? "true" : "false"; - n += mjson_print_buf(fn, fnd, s, (int) strlen(s)); - } else if (fc == 's') { - char *buf = va_arg(ap, char *); - n += mjson_print_buf(fn, fnd, buf, (int) strlen(buf)); - } else if (strncmp(&fmt[i], ".*s", 3) == 0) { - int len = va_arg(ap, int); - char *buf = va_arg(ap, char *); - n += mjson_print_buf(fn, fnd, buf, len); - i += 2; - } else if (fc == 'g') { - n += mjson_print_dbl(fn, fnd, va_arg(ap, double), 6); - } else if (strncmp(&fmt[i], ".*g", 3) == 0) { - int width = va_arg(ap, int); - n += mjson_print_dbl(fn, fnd, va_arg(ap, double), width); - i += 2; -#if MJSON_ENABLE_BASE64 - } else if (fc == 'V') { - int len = va_arg(ap, int); - const char *buf = va_arg(ap, const char *); - n += mjson_print_b64(fn, fnd, (unsigned char *) buf, len); -#endif - } else if (fc == 'H') { - const char *hex = "0123456789abcdef"; - int i, len = va_arg(ap, int); - const unsigned char *p = va_arg(ap, const unsigned char *); - n += fn("\"", 1, fnd); - for (i = 0; i < len; i++) { - n += fn(&hex[(p[i] >> 4) & 15], 1, fnd); - n += fn(&hex[p[i] & 15], 1, fnd); - } - n += fn("\"", 1, fnd); - } else if (fc == 'M') { - mjson_vprint_fn_t vfn = va_arg(ap, mjson_vprint_fn_t); - n += vfn(fn, fnd, &ap); - } - i++; - } else { - n += mjson_print_buf(fn, fnd, &fmt[i++], 1); - } - } - va_end(xap); - va_end(ap); - return n; -} - -int mjson_printf(mjson_print_fn_t fn, void *fnd, const char *fmt, ...) { - va_list ap; - int len; - va_start(ap, fmt); - len = mjson_vprintf(fn, fnd, fmt, ap); - va_end(ap); - return len; -} -#endif /* MJSON_ENABLE_PRINT */ - static int is_digit(int c) { return c >= '0' && c <= '9'; }