/*
* Helper functions for outputting text.
- * Copyright © 2011, 2021, 2023 Nick Bowler
+ * Copyright © 2011, 2021, 2023-2024 Nick Bowler
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include <config.h>
#include <stdio.h>
+#include <limits.h>
#include <assert.h>
#include "cdecl.h"
return cdecl__advance(dst, rc);
}
-/*
- * 31 decimal digits is enough for values up to 2^102 - 1.
- * 63 decimal digits is enough for values up to 2^209 - 1.
- *
- * We can't portably write numbers this large in preprocessor conditionals,
- * but since the maximum values of unsigned integer types are always one
- * less than a power of two, we can use a sequence of small shifts to infer
- * the bounds.
- *
- * All known implementations have 64-bit uintmax_t. Leave some headroom
- * to support a possible future implementatons with 128-bit uintmax_t.
- */
enum {
-#if (UINTMAX_MAX >> 27 >> 27 >> 26 >> 26) == 0
- MAX_UINT_DIGITS = 31
-#elif (UINTMAX_MAX >> 27 >> 26 >> 26 >> 26 >> 26 >> 26 >> 26 >> 26) == 0
- MAX_UINT_DIGITS = 63
-#else
-# error UINTMAX_MAX is too large, please report a bug.
-#endif
+ /*
+ * upper bound on number of decimal digits required to convert
+ * cdecl_uintmax.
+ */
+ MAX_UINT_DIGITS = (CHAR_BIT * sizeof (cdecl_uintmax) + 2)/3
};
-size_t cdecl__emit_uint(struct output_state *dst, uintmax_t val)
+size_t cdecl__emit_uint(struct output_state *dst, cdecl_uintmax val)
{
char buf[MAX_UINT_DIGITS + 1], *p = &buf[sizeof buf];