aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devel.but11
-rw-r--r--puzzles.h3
2 files changed, 14 insertions, 0 deletions
diff --git a/devel.but b/devel.but
index e915a2d..7bf2242 100644
--- a/devel.but
+++ b/devel.but
@@ -4819,6 +4819,17 @@ returns the one which compares greater or less respectively.
These macros may evaluate their arguments multiple times. Avoid side
effects.
+\S{utils-max-digits} \cw{MAX_DIGITS()}
+
+The \cw{MAX_DIGITS()} macro, defined in the main Puzzles header file,
+takes a type (or a variable of that type) and expands to an integer
+constant representing a reasonable upper bound on the number of
+characters that a number of that type could expand to when formatted
+as a decimal number using the \c{%u} or \c{%d} format of
+\cw{printf()}. This is useful for allocating a fixed-size buffer
+that's guaranteed to be big enough to \cw{sprintf()} a value into.
+Don't forget to add one for the trailing \cw{'\\0'}!
+
\S{utils-pi} \cw{PI}
The main Puzzles header file defines a macro \cw{PI} which expands
diff --git a/puzzles.h b/puzzles.h
index cbe7f88..2f49613 100644
--- a/puzzles.h
+++ b/puzzles.h
@@ -18,6 +18,9 @@
#define STR_INT(x) #x
#define STR(x) STR_INT(x)
+/* An upper bound on the length of sprintf'ed integers (signed or unsigned). */
+#define MAX_DIGITS(x) (sizeof(x) * CHAR_BIT / 3 + 2)
+
/* NB not perfect because they evaluate arguments multiple times. */
#ifndef max
#define max(x,y) ( (x)>(y) ? (x) : (y) )