Browse Source

str: add stringify()

Rusty Russell 16 years ago
parent
commit
90e94990ef
2 changed files with 19 additions and 1 deletions
  1. 12 0
      ccan/str/str.h
  2. 7 1
      ccan/str/test/run.c

+ 12 - 0
ccan/str/str.h

@@ -43,4 +43,16 @@ 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
 #endif /* CCAN_STR_H */

+ 7 - 1
ccan/str/test/run.c

@@ -35,7 +35,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	plan_tests(n * n * 5);
+	plan_tests(n * n * 5 + 3);
 	for (i = 0; i < n; i++) {
 		for (j = 0; j < n; j++) {
 			unsigned int k, identical = 0;
@@ -76,5 +76,11 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	ok1(streq(stringify(NUM_SUBSTRINGS),
+		  "((sizeof(substrings) / sizeof(substrings[0])) - 1)"));
+	ok1(streq(stringify(ARRAY_SIZE(substrings)),
+		  "(sizeof(substrings) / sizeof(substrings[0]))"));
+	ok1(streq(stringify(i == 0), "i == 0"));
+
 	return exit_status();
 }