diff --git a/CMakeLists.txt b/CMakeLists.txt index da4461d..5f50f77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,8 @@ set(SOURCES src/widgets/flog.c src/widgets/gscreen.c # ctype - src/ctype/trivialties.c + src/ctype/charprops.c + src/ctype/classes.c # string src/string/memarray.c src/string/core.c diff --git a/include/ft/all-tests.h b/include/ft/all-tests.h index bf261b7..7fef70f 100644 --- a/include/ft/all-tests.h +++ b/include/ft/all-tests.h @@ -8,9 +8,8 @@ #include /* ctype */ -extern ft_test ft_ctype_trivial_success; -extern ft_test ft_ctype_trivial_failure; -extern ft_test ft_ctype_trivial_empty; +extern ft_test ft_ctype_macros; +extern ft_test ft_ctype_functions; /* string */ extern ft_test ft_string_memset; diff --git a/src/ctype/charprops.c b/src/ctype/charprops.c new file mode 100644 index 0000000..bf78706 --- /dev/null +++ b/src/ctype/charprops.c @@ -0,0 +1,134 @@ +#include +#include +#include "charprops.h" + +uint16_t charprops[128] = { + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL | CP_SPACE | CP_BLANK, + CP_CNTRL | CP_SPACE, + CP_CNTRL | CP_SPACE, + CP_CNTRL | CP_SPACE, + CP_CNTRL | CP_SPACE, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_CNTRL, + CP_PRINT | CP_SPACE | CP_BLANK, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_PRINT | CP_GRAPH | CP_PUNCT, + CP_CNTRL, +}; diff --git a/src/ctype/charprops.h b/src/ctype/charprops.h new file mode 100644 index 0000000..7b6986a --- /dev/null +++ b/src/ctype/charprops.h @@ -0,0 +1,29 @@ +//--- +// ctype.charprops: Utilities to validate properties of groups of characters +// +// These utilities simply factor in the common code in ctype macro vs function +// tests, and in a way implement the ctype specification in a naive way in +// order to compare results. +//--- + +#ifndef _CTYPE_CHARPROPS_H +#define _CTYPE_CHARPROPS_H + +#include + +#define CP_CNTRL 0x0001 +#define CP_PRINT 0x0002 +#define CP_SPACE 0x0004 +#define CP_BLANK 0x0008 +#define CP_GRAPH 0x0010 +#define CP_PUNCT 0x0020 +#define CP_ALNUM 0x0040 +#define CP_ALPHA 0x0080 +#define CP_UPPER 0x0100 +#define CP_LOWER 0x0200 +#define CP_DIGIT 0x0400 +#define CP_XDIGIT 0x0800 + +extern uint16_t charprops[128]; + +#endif /* _CTYPE_CHARPROPS_H */ diff --git a/src/ctype/classes.c b/src/ctype/classes.c new file mode 100644 index 0000000..7ee4176 --- /dev/null +++ b/src/ctype/classes.c @@ -0,0 +1,66 @@ +#include +#include +#include + +#include "charprops.h" + +static void _ctype_macros(ft_test *t) +{ + for(int c = 0; c < 128; c++) { + ft_assert(t, (isalnum(c) != 0) == ((charprops[c] & CP_ALNUM) != 0)); + ft_assert(t, (isalpha(c) != 0) == ((charprops[c] & CP_ALPHA) != 0)); + ft_assert(t, (isblank(c) != 0) == ((charprops[c] & CP_BLANK) != 0)); + ft_assert(t, (iscntrl(c) != 0) == ((charprops[c] & CP_CNTRL) != 0)); + ft_assert(t, (isdigit(c) != 0) == ((charprops[c] & CP_DIGIT) != 0)); + ft_assert(t, (islower(c) != 0) == ((charprops[c] & CP_LOWER) != 0)); + ft_assert(t, (isgraph(c) != 0) == ((charprops[c] & CP_GRAPH) != 0)); + ft_assert(t, (ispunct(c) != 0) == ((charprops[c] & CP_PUNCT) != 0)); + ft_assert(t, (isprint(c) != 0) == ((charprops[c] & CP_PRINT) != 0)); + ft_assert(t, (isspace(c) != 0) == ((charprops[c] & CP_SPACE) != 0)); + ft_assert(t, (isupper(c) != 0) == ((charprops[c] & CP_UPPER) != 0)); + ft_assert(t, (isxdigit(c) != 0) == ((charprops[c] & CP_XDIGIT) != 0)); + } +} + +ft_test ft_ctype_macros = { + .name = "Macro versions of functions", + .function = _ctype_macros, +}; + +#undef isalnum +#undef isalpha +#undef isblank +#undef iscntrl +#undef isdigit +#undef islower +#undef isgraph +#undef ispunct +#undef isprint +#undef isspace +#undef isupper +#undef isxdigit +#undef tolower +#undef toupper + +static void _ctype_functions(ft_test *t) +{ + for(int c = 0; c < 128; c++) { + ft_assert(t, (isalnum(c) != 0) == ((charprops[c] & CP_ALNUM) != 0)); + ft_assert(t, (isalpha(c) != 0) == ((charprops[c] & CP_ALPHA) != 0)); + ft_assert(t, (isblank(c) != 0) == ((charprops[c] & CP_BLANK) != 0)); + ft_assert(t, (iscntrl(c) != 0) == ((charprops[c] & CP_CNTRL) != 0)); + ft_assert(t, (isdigit(c) != 0) == ((charprops[c] & CP_DIGIT) != 0)); + ft_assert(t, (islower(c) != 0) == ((charprops[c] & CP_LOWER) != 0)); + ft_assert(t, (isgraph(c) != 0) == ((charprops[c] & CP_GRAPH) != 0)); + ft_assert(t, (ispunct(c) != 0) == ((charprops[c] & CP_PUNCT) != 0)); + ft_assert(t, (isprint(c) != 0) == ((charprops[c] & CP_PRINT) != 0)); + ft_assert(t, (isspace(c) != 0) == ((charprops[c] & CP_SPACE) != 0)); + ft_assert(t, (isupper(c) != 0) == ((charprops[c] & CP_UPPER) != 0)); + ft_assert(t, (isxdigit(c) != 0) == ((charprops[c] & CP_XDIGIT) != 0)); + } +} + +ft_test ft_ctype_functions = { + .name = "Pure functions", + .function = _ctype_functions, +}; diff --git a/src/ctype/trivialties.c b/src/ctype/trivialties.c deleted file mode 100644 index 9e3313f..0000000 --- a/src/ctype/trivialties.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -static void _ctype_trivial_success(ft_test *t) -{ - ft_assert(t, 1); - ft_assert(t, 1); -} - -ft_test ft_ctype_trivial_success = { - .name = "Trivialty (always succeeds)", - .function = _ctype_trivial_success, -}; - -static void _ctype_trivial_failure(ft_test *t) -{ - ft_assert(t, 0); -} - -ft_test ft_ctype_trivial_failure = { - .name = "Trivialty (always fails)", - .function = _ctype_trivial_failure, -}; - -ft_test ft_ctype_trivial_empty = { - .name = "Trivialty (no function)", - .function = NULL, -}; diff --git a/src/main.c b/src/main.c index ec08a71..ccd63fb 100644 --- a/src/main.c +++ b/src/main.c @@ -14,9 +14,8 @@ ft_list headers_libc[] = { { "", (ft_test*[]){ - &ft_ctype_trivial_success, - &ft_ctype_trivial_failure, - &ft_ctype_trivial_empty, + &ft_ctype_macros, + &ft_ctype_functions, NULL, }}, { "", NULL },