C99 %z (was: [PATCH v7 2/5] object-file API: add a format_object_header() function)
From: Ævar Arnfjörð Bjarmason <hidden>
Date: 2022-02-01 14:30:39
On Tue, Dec 21 2021, René Scharfe wrote:
Am 21.12.21 um 12:51 schrieb Han Xin:quoted
From: Ævar Arnfjörð Bjarmason <redacted> [...] the_hash_algo->init_fn(&c); the_hash_algo->update_fn(&c, hdr, hdrlen); } elsediff --git a/bulk-checkin.c b/bulk-checkin.c index 8785b2ac80..1733a1de4f 100644 --- a/bulk-checkin.c +++ b/bulk-checkin.c@@ -220,8 +220,8 @@ static int deflate_to_pack(struct bulk_checkin_state *state, if (seekback == (off_t) -1) return error("cannot find the current offset"); - header_len = xsnprintf((char *)obuf, sizeof(obuf), "%s %" PRIuMAX, - type_name(type), (uintmax_t)size) + 1; + header_len = format_object_header((char *)obuf, sizeof(obuf), + type, (uintmax_t)size);^^^^^^^^^^^ Same here, just that size is already of type size_t, so a cast makes even less sense.
Thanks, this and the below is something I made sure to include in a re-roll I'm about to send (to do these cleanups in object-file.c separately from Han Xin's series).
quoted
+int format_object_header_extended(char *str, size_t size, enum object_type type, + const char *typestr, size_t objsize) +{ + const char *s = type == OBJ_NONE ? typestr : type_name(type); + + return xsnprintf(str, size, "%s %"PRIuMAX, s, (uintmax_t)objsize) + 1;^^^^^^^^^^^ This cast is necessary to match PRIuMAX. And that is used because the z modifier (as in e.g. printf("%zu", sizeof(size_t));) was only added in C99 and not all platforms may have it. (Perhaps this cautious approach is worth revisiting separately, now that some time has passed, but this patch series should still use PRIuMAX, as it does.)
I tried to use %z recently and found that the CI breaks on Windows, but this was a few months ago. But I think the status of that particular C99 feature is that we can't use it freely, unfortunately. I may be wrong about that, I haven't looked it any detail beyond running those CI errors.