-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rewrite test-ctype to use a global variable and a macro instead of wrapper functions for each character class and complicated structs with loops going through them. The resulting code may be uglier, but that's OK for a test program, and it's actually easier to read and extend. And much shorter. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
René Scharfe
authored and
Junio C Hamano
committed
Oct 3, 2011
1 parent
f696543
commit c37c004
Showing
1 changed file
with
21 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,78 +1,41 @@ | ||
#include "cache.h" | ||
|
||
static int rc; | ||
|
||
static int test_isdigit(int c) | ||
static void report_error(const char *class, int ch) | ||
{ | ||
return isdigit(c); | ||
printf("%s classifies char %d (0x%02x) wrongly\n", class, ch, ch); | ||
rc = 1; | ||
} | ||
|
||
static int test_isspace(int c) | ||
static int is_in(const char *s, int ch) | ||
{ | ||
return isspace(c); | ||
/* We can't find NUL using strchr. It's classless anyway. */ | ||
if (ch == '\0') | ||
return 0; | ||
return !!strchr(s, ch); | ||
} | ||
|
||
static int test_isalpha(int c) | ||
{ | ||
return isalpha(c); | ||
} | ||
|
||
static int test_isalnum(int c) | ||
{ | ||
return isalnum(c); | ||
} | ||
|
||
static int test_is_glob_special(int c) | ||
{ | ||
return is_glob_special(c); | ||
} | ||
|
||
static int test_is_regex_special(int c) | ||
{ | ||
return is_regex_special(c); | ||
#define TEST_CLASS(t,s) { \ | ||
int i; \ | ||
for (i = 0; i < 256; i++) { \ | ||
if (is_in(s, i) != t(i)) \ | ||
report_error(#t, i); \ | ||
} \ | ||
} | ||
|
||
#define DIGIT "0123456789" | ||
#define LOWER "abcdefghijklmnopqrstuvwxyz" | ||
#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | ||
|
||
static const struct ctype_class { | ||
const char *name; | ||
int (*test_fn)(int); | ||
const char *members; | ||
} classes[] = { | ||
{ "isdigit", test_isdigit, DIGIT }, | ||
{ "isspace", test_isspace, " \n\r\t" }, | ||
{ "isalpha", test_isalpha, LOWER UPPER }, | ||
{ "isalnum", test_isalnum, LOWER UPPER DIGIT }, | ||
{ "is_glob_special", test_is_glob_special, "*?[\\" }, | ||
{ "is_regex_special", test_is_regex_special, "$()*+.?[\\^{|" }, | ||
{ NULL } | ||
}; | ||
|
||
static int test_class(const struct ctype_class *test) | ||
{ | ||
int i, rc = 0; | ||
|
||
for (i = 0; i < 256; i++) { | ||
int expected = i ? !!strchr(test->members, i) : 0; | ||
int actual = test->test_fn(i); | ||
|
||
if (actual != expected) { | ||
rc = 1; | ||
printf("%s classifies char %d (0x%02x) wrongly\n", | ||
test->name, i, i); | ||
} | ||
} | ||
return rc; | ||
} | ||
|
||
int main(int argc, char **argv) | ||
{ | ||
const struct ctype_class *test; | ||
int rc = 0; | ||
|
||
for (test = classes; test->name; test++) | ||
rc |= test_class(test); | ||
TEST_CLASS(isdigit, DIGIT); | ||
TEST_CLASS(isspace, " \n\r\t"); | ||
TEST_CLASS(isalpha, LOWER UPPER); | ||
TEST_CLASS(isalnum, LOWER UPPER DIGIT); | ||
TEST_CLASS(is_glob_special, "*?[\\"); | ||
TEST_CLASS(is_regex_special, "$()*+.?[\\^{|"); | ||
|
||
return rc; | ||
} |