]> git.ozlabs.org Git - ccan/blobdiff - ccan/str/str.h
str: fix unused var warning with gcc
[ccan] / ccan / str / str.h
index ae51cdcc998e85b6a5014239bbd5cadc1bc9cda8..f9326085ae8da0a2c7bfcff51a8855570d1eb7e8 100644 (file)
@@ -1,8 +1,10 @@
+/* Placed into the public domain. */
 #ifndef CCAN_STR_H
 #define CCAN_STR_H
 #include "config.h"
 #include <string.h>
 #include <stdbool.h>
+#include <limits.h>
 #include <ctype.h>
 
 /**
@@ -64,13 +66,39 @@ static inline bool strends(const char *str, const char *postfix)
  * @needle: a substring
  *
  * Example:
- *     int i;
- *      i = strcount("aaa aaa", "a");  // i = 6;
- *      i = strcount("aaa aaa", "ab"); // i = 0;
- *      i = strcount("aaa aaa", "aa"); // i = 2;
+ *      assert(strcount("aaa aaa", "a") == 6);
+ *      assert(strcount("aaa aaa", "ab") == 0);
+ *      assert(strcount("aaa aaa", "aa") == 2);
  */
 size_t strcount(const char *haystack, const char *needle);
 
+/**
+ * STR_MAX_CHARS - Maximum possible size of numeric string for this type.
+ * @type_or_expr: a pointer or integer type or expression.
+ *
+ * This provides enough space for a nul-terminated string which represents the
+ * largest possible value for the type or expression.
+ *
+ * Note: The implementation adds extra space so hex values or negative
+ * values will fit (eg. sprintf(... "%p"). )
+ *
+ * Example:
+ *     char str[STR_MAX_CHARS(int)];
+ *
+ *     sprintf(str, "%i", 7);
+ */
+#define STR_MAX_CHARS(type_or_expr)                            \
+       ((sizeof(type_or_expr) * CHAR_BIT + 8) / 9 * 3 + 2      \
+        + STR_MAX_CHARS_TCHECK_(type_or_expr))
+
+#if HAVE_TYPEOF
+/* Only a simple type can have 0 assigned, so test that. */
+#define STR_MAX_CHARS_TCHECK_(type_or_expr)            \
+       ({ typeof(type_or_expr) x = 0; (void)x; 0; })
+#else
+#define STR_MAX_CHARS_TCHECK_(type_or_expr) 0
+#endif
+
 /**
  * cisalnum - isalnum() which takes a char (and doesn't accept EOF)
  * @c: a character