|
@@ -1,7 +1,9 @@
|
|
|
#ifndef CCAN_STR_H
|
|
#ifndef CCAN_STR_H
|
|
|
#define CCAN_STR_H
|
|
#define CCAN_STR_H
|
|
|
|
|
+#include "config.h"
|
|
|
#include <string.h>
|
|
#include <string.h>
|
|
|
#include <stdbool.h>
|
|
#include <stdbool.h>
|
|
|
|
|
+#include <ctype.h>
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* streq - Are two strings equal?
|
|
* streq - Are two strings equal?
|
|
@@ -69,4 +71,65 @@ static inline bool strends(const char *str, const char *postfix)
|
|
|
*/
|
|
*/
|
|
|
size_t strcount(const char *haystack, const char *needle);
|
|
size_t strcount(const char *haystack, const char *needle);
|
|
|
|
|
|
|
|
|
|
+#include <ccan/str/str_debug.h>
|
|
|
|
|
+
|
|
|
|
|
+/* These checks force things out of line, hence they are under DEBUG. */
|
|
|
|
|
+#ifdef CCAN_STR_DEBUG
|
|
|
|
|
+#include <ccan/build_assert/build_assert.h>
|
|
|
|
|
+
|
|
|
|
|
+/* These are commonly misused: they take -1 or an *unsigned* char value. */
|
|
|
|
|
+#undef isalnum
|
|
|
|
|
+#undef isalpha
|
|
|
|
|
+#undef isascii
|
|
|
|
|
+#undef isblank
|
|
|
|
|
+#undef iscntrl
|
|
|
|
|
+#undef isdigit
|
|
|
|
|
+#undef isgraph
|
|
|
|
|
+#undef islower
|
|
|
|
|
+#undef isprint
|
|
|
|
|
+#undef ispunct
|
|
|
|
|
+#undef isspace
|
|
|
|
|
+#undef isupper
|
|
|
|
|
+#undef isxdigit
|
|
|
|
|
+
|
|
|
|
|
+/* You can use a char if char is unsigned. */
|
|
|
|
|
+#if HAVE_BUILTIN_TYPES_COMPATIBLE_P && HAVE_TYPEOF
|
|
|
|
|
+#define str_check_arg_(i) \
|
|
|
|
|
+ ((i) + BUILD_ASSERT_OR_ZERO(!__builtin_types_compatible_p(typeof(i), \
|
|
|
|
|
+ char) \
|
|
|
|
|
+ || (char)255 > 0))
|
|
|
|
|
+#else
|
|
|
|
|
+#define str_check_arg_(i) (i)
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+#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))
|
|
|
|
|
+#define isblank(i) str_isblank(str_check_arg_(i))
|
|
|
|
|
+#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))
|
|
|
|
|
+#define islower(i) str_islower(str_check_arg_(i))
|
|
|
|
|
+#define isprint(i) str_isprint(str_check_arg_(i))
|
|
|
|
|
+#define ispunct(i) str_ispunct(str_check_arg_(i))
|
|
|
|
|
+#define isspace(i) str_isspace(str_check_arg_(i))
|
|
|
|
|
+#define isupper(i) str_isupper(str_check_arg_(i))
|
|
|
|
|
+#define isxdigit(i) str_isxdigit(str_check_arg_(i))
|
|
|
|
|
+
|
|
|
|
|
+#if HAVE_TYPEOF
|
|
|
|
|
+/* With GNU magic, we can make const-respecting standard string functions. */
|
|
|
|
|
+#undef strstr
|
|
|
|
|
+#undef strchr
|
|
|
|
|
+#undef strrchr
|
|
|
|
|
+
|
|
|
|
|
+/* + 0 is needed to decay array into pointer. */
|
|
|
|
|
+#define strstr(haystack, needle) \
|
|
|
|
|
+ ((typeof((haystack) + 0))str_strstr((haystack), (needle)))
|
|
|
|
|
+#define strchr(haystack, c) \
|
|
|
|
|
+ ((typeof((haystack) + 0))str_strchr((haystack), (c)))
|
|
|
|
|
+#define strrchr(haystack, c) \
|
|
|
|
|
+ ((typeof((haystack) + 0))str_strrchr((haystack), (c)))
|
|
|
|
|
+#endif
|
|
|
|
|
+#endif /* CCAN_STR_DEBUG */
|
|
|
|
|
+
|
|
|
#endif /* CCAN_STR_H */
|
|
#endif /* CCAN_STR_H */
|