X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fstr%2Fstr.h;h=85491bc7e33e2f2d6d7dd87fe606ec3e26c00d30;hb=e40f5c50a7a930fc98974936b7366b498ebf984c;hp=293bba282044551c98b2b4158aa84da832eb9886;hpb=02bdd9ac60b7edd2056fd52735b977b515c9b961;p=ccan diff --git a/ccan/str/str.h b/ccan/str/str.h index 293bba28..85491bc7 100644 --- a/ccan/str/str.h +++ b/ccan/str/str.h @@ -1,8 +1,10 @@ +/* CC0 (Public domain) - see LICENSE file for details */ #ifndef CCAN_STR_H #define CCAN_STR_H #include "config.h" #include #include +#include #include /** @@ -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 @@ -91,10 +119,12 @@ static inline bool cisascii(char c) { return isascii((unsigned char)c); } +#if HAVE_ISBLANK static inline bool cisblank(char c) { return isblank((unsigned char)c); } +#endif static inline bool ciscntrl(char c) { return iscntrl((unsigned char)c); @@ -166,7 +196,9 @@ static inline bool cisxdigit(char c) #define isalnum(i) str_isalnum(str_check_arg_(i)) #define isalpha(i) str_isalpha(str_check_arg_(i)) #define isascii(i) str_isascii(str_check_arg_(i)) +#if HAVE_ISBLANK #define isblank(i) str_isblank(str_check_arg_(i)) +#endif #define iscntrl(i) str_iscntrl(str_check_arg_(i)) #define isdigit(i) str_isdigit(str_check_arg_(i)) #define isgraph(i) str_isgraph(str_check_arg_(i))