* This macro is arguably more readable than "!strcmp(a, b)".
*
* Example:
- * if (streq(str, ""))
+ * if (streq(somestring, ""))
* printf("String is empty!\n");
*/
#define streq(a,b) (strcmp((a),(b)) == 0)
* @prefix: prefix to look for at start of str
*
* Example:
- * if (strstarts(str, "foo"))
- * printf("String %s begins with 'foo'!\n", str);
+ * if (strstarts(somestring, "foo"))
+ * printf("String %s begins with 'foo'!\n", somestring);
*/
#define strstarts(str,prefix) (strncmp((str),(prefix),strlen(prefix)) == 0)
* @postfix: postfix to look for at end of str
*
* Example:
- * if (strends(str, "foo"))
- * printf("String %s end with 'foo'!\n", str);
+ * if (strends(somestring, "foo"))
+ * printf("String %s end with 'foo'!\n", somestring);
*/
static inline bool strends(const char *str, const char *postfix)
{
return streq(str + strlen(str) - strlen(postfix), postfix);
}
+
+/**
+ * stringify - Turn expression into a string literal
+ * @expr: any C expression
+ *
+ * Example:
+ * #define PRINT_COND_IF_FALSE(cond) \
+ * ((cond) || printf("%s is false!", stringify(cond)))
+ */
+#define stringify(expr) stringify_1(expr)
+/* Double-indirection required to stringify expansions */
+#define stringify_1(expr) #expr
+
+/**
+ * strcount - Count number of (non-overlapping) occurrences of a substring.
+ * @haystack: a C string
+ * @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;
+ */
+size_t strcount(const char *haystack, const char *needle);
+
#endif /* CCAN_STR_H */