1
/* CC0 (Public domain) - see LICENSE file for details */
11
* streq - Are two strings equal?
15
* This macro is arguably more readable than "!strcmp(a, b)".
18
* if (streq(somestring, ""))
19
* printf("String is empty!\n");
21
#define streq(a,b) (strcmp((a),(b)) == 0)
24
* strstarts - Does this string start with this prefix?
25
* @str: string to test
26
* @prefix: prefix to look for at start of str
29
* if (strstarts(somestring, "foo"))
30
* printf("String %s begins with 'foo'!\n", somestring);
32
#define strstarts(str,prefix) (strncmp((str),(prefix),strlen(prefix)) == 0)
35
* strends - Does this string end with this postfix?
36
* @str: string to test
37
* @postfix: postfix to look for at end of str
40
* if (strends(somestring, "foo"))
41
* printf("String %s end with 'foo'!\n", somestring);
43
static inline bool strends(const char *str, const char *postfix)
45
if (strlen(str) < strlen(postfix))
48
return streq(str + strlen(str) - strlen(postfix), postfix);
52
* stringify - Turn expression into a string literal
53
* @expr: any C expression
56
* #define PRINT_COND_IF_FALSE(cond) \
57
* ((cond) || printf("%s is false!", stringify(cond)))
59
#define stringify(expr) stringify_1(expr)
60
/* Double-indirection required to stringify expansions */
61
#define stringify_1(expr) #expr
64
* strcount - Count number of (non-overlapping) occurrences of a substring.
65
* @haystack: a C string
66
* @needle: a substring
69
* assert(strcount("aaa aaa", "a") == 6);
70
* assert(strcount("aaa aaa", "ab") == 0);
71
* assert(strcount("aaa aaa", "aa") == 2);
73
size_t strcount(const char *haystack, const char *needle);
76
* STR_MAX_CHARS - Maximum possible size of numeric string for this type.
77
* @type_or_expr: a pointer or integer type or expression.
79
* This provides enough space for a nul-terminated string which represents the
80
* largest possible value for the type or expression.
82
* Note: The implementation adds extra space so hex values or negative
83
* values will fit (eg. sprintf(... "%p"). )
86
* char str[STR_MAX_CHARS(int)];
88
* sprintf(str, "%i", 7);
90
#define STR_MAX_CHARS(type_or_expr) \
91
((sizeof(type_or_expr) * CHAR_BIT + 8) / 9 * 3 + 2 \
92
+ STR_MAX_CHARS_TCHECK_(type_or_expr))
95
/* Only a simple type can have 0 assigned, so test that. */
96
#define STR_MAX_CHARS_TCHECK_(type_or_expr) \
97
({ typeof(type_or_expr) x = 0; (void)x; 0; })
99
#define STR_MAX_CHARS_TCHECK_(type_or_expr) 0
102
/* These checks force things out of line, hence they are under DEBUG. */
103
#ifdef CCAN_STR_DEBUG
105
/* With GNU magic, we can make const-respecting standard string functions. */
110
/* + 0 is needed to decay array into pointer. */
111
#define strstr(haystack, needle) \
112
((typeof((haystack) + 0))str_strstr((haystack), (needle)))
113
#define strchr(haystack, c) \
114
((typeof((haystack) + 0))str_strchr((haystack), (c)))
115
#define strrchr(haystack, c) \
116
((typeof((haystack) + 0))str_strrchr((haystack), (c)))
118
#endif /* CCAN_STR_DEBUG */
120
#endif /* CCAN_STR_H */