str: replacements for ctype functions.
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 17 Mar 2011 11:42:22 +0000 (22:12 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 17 Mar 2011 11:42:22 +0000 (22:12 +1030)
The standard ctype.h variants will make you go insane if you
contemplate them for too long.

ccan/str/str.h

index 54afca0f21c2afc671a7d0f5ad356e4fe1604b0f..293bba282044551c98b2b4158aa84da832eb9886 100644 (file)
@@ -71,6 +71,67 @@ static inline bool strends(const char *str, const char *postfix)
  */
 size_t strcount(const char *haystack, const char *needle);
 
+/**
+ * cisalnum - isalnum() which takes a char (and doesn't accept EOF)
+ * @c: a character
+ *
+ * Surprisingly, the standard ctype.h isalnum() takes an int, which
+ * must have the value of EOF (-1) or an unsigned char.  This variant
+ * takes a real char, and doesn't accept EOF.
+ */
+static inline bool cisalnum(char c)
+{
+       return isalnum((unsigned char)c);
+}
+static inline bool cisalpha(char c)
+{
+       return isalpha((unsigned char)c);
+}
+static inline bool cisascii(char c)
+{
+       return isascii((unsigned char)c);
+}
+static inline bool cisblank(char c)
+{
+       return isblank((unsigned char)c);
+}
+static inline bool ciscntrl(char c)
+{
+       return iscntrl((unsigned char)c);
+}
+static inline bool cisdigit(char c)
+{
+       return isdigit((unsigned char)c);
+}
+static inline bool cisgraph(char c)
+{
+       return isgraph((unsigned char)c);
+}
+static inline bool cislower(char c)
+{
+       return islower((unsigned char)c);
+}
+static inline bool cisprint(char c)
+{
+       return isprint((unsigned char)c);
+}
+static inline bool cispunct(char c)
+{
+       return ispunct((unsigned char)c);
+}
+static inline bool cisspace(char c)
+{
+       return isspace((unsigned char)c);
+}
+static inline bool cisupper(char c)
+{
+       return isupper((unsigned char)c);
+}
+static inline bool cisxdigit(char c)
+{
+       return isxdigit((unsigned char)c);
+}
+
 #include <ccan/str/str_debug.h>
 
 /* These checks force things out of line, hence they are under DEBUG. */