X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fstr%2Fstr.h;h=d4ced0d8914386b04034a439a3309c8cd9f46da7;hp=ae51cdcc998e85b6a5014239bbd5cadc1bc9cda8;hb=049ae7d0ade969c44d0ffab043f507fa7827bf09;hpb=082d651ffd87f78f20d56aa477c3c75d7361c1e1 diff --git a/ccan/str/str.h b/ccan/str/str.h index ae51cdcc..d4ced0d8 100644 --- a/ccan/str/str.h +++ b/ccan/str/str.h @@ -1,8 +1,10 @@ +/* Placed into the public domain. */ #ifndef CCAN_STR_H #define CCAN_STR_H #include "config.h" #include #include +#include #include /** @@ -71,6 +73,33 @@ static inline bool strends(const char *str, const char *postfix) */ 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(i)]; + * + * sprintf(str, "%i", i); + */ +#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