From 81fe23c11da5f7e528846e8b3d5aaa9ae0f7aadd Mon Sep 17 00:00:00 2001 From: Marian Buschsieweke Date: Wed, 9 Oct 2024 22:17:05 +0200 Subject: [PATCH] fix(pretty): fix compilation with newlib and GCC 13.2.1 newlib (nano) is missing 64 bit support in stdio and inttypes.h. This works around the issue. --- src/cborpretty.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/cborpretty.c b/src/cborpretty.c index 49d3cae..4397f39 100644 --- a/src/cborpretty.c +++ b/src/cborpretty.c @@ -374,12 +374,26 @@ static CborError value_to_pretty(CborStreamFunction stream, void *out, CborValue cbor_value_get_raw_integer(it, &val); /* can't fail */ if (cbor_value_is_unsigned_integer(it)) { +#ifdef PRIu64 err = stream(out, "%" PRIu64, val); +#else + err = stream(out, "%" PRIu32, (uint32_t)val); + if (!err && ((uint32_t)val != val)) { + err = stream(out, "!trunc!"); + } +#endif } else { /* CBOR stores the negative number X as -1 - X * (that is, -1 is stored as 0, -2 as 1 and so forth) */ if (++val) { /* unsigned overflow may happen */ +#ifdef PRIu64 err = stream(out, "-%" PRIu64, val); +#else + err = stream(out, "-%" PRIu32, (uint32_t)val); + if (!err && ((uint32_t)val != val)) { + err = stream(out, "!trunc!"); + } +#endif } else { /* overflown * 0xffff`ffff`ffff`ffff + 1 = @@ -450,7 +464,13 @@ static CborError value_to_pretty(CborStreamFunction stream, void *out, CborValue case CborTagType: { CborTag tag; cbor_value_get_tag(it, &tag); /* can't fail */ +#ifdef PRIu64 err = stream(out, "%" PRIu64 "%s(", tag, get_indicator(it, flags)); +#else + err = stream(out, "%" PRIu32 "%s%s(", (uint32_t)tag, + ((uint32_t)tag != tag) ? "!trunc!" : "", + get_indicator(it, flags)); +#endif if (!err) err = cbor_value_advance_fixed(it); if (!err && recursionsLeft) @@ -490,7 +510,6 @@ static CborError value_to_pretty(CborStreamFunction stream, void *out, CborValue const char *suffix; double val; int r; - uint64_t ival; if (false) { float f; @@ -521,14 +540,19 @@ static CborError value_to_pretty(CborStreamFunction stream, void *out, CborValue suffix = ""; } +#ifdef PRIu64 + uint64_t ival; if (convertToUint64(val, &ival)) { /* this double value fits in a 64-bit integer, so show it as such * (followed by a floating point suffix, to disambiguate) */ err = stream(out, "%s%" PRIu64 ".%s", val < 0 ? "-" : "", ival, suffix); } else { +#endif /* this number is definitely not a 64-bit integer */ err = stream(out, "%." DBL_DECIMAL_DIG_STR "g%s", val, suffix); +#ifdef PRIu64 } +#endif break; } #else -- 2.43.0