From b3540d10efec1c3d27d0206d67635eaeb39141ec Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 7 Dec 2011 09:01:26 -0800 Subject: * eval.c (eval_init): New character functions registered. * lib.c (c_num): Generalized to convert characters to numbers also. This allows functions like gt and lt to work with characters. (chr_isalnum, chr_isalpha, chr_isascii, chr_iscntrl, chr_isdigit, chr_isgraph, chr_islower, chr_isprint, chr_ispunct, chr_isspace, chr_isupper, chr_isxdigit): New functions added. * lib.h: (chr_isalnum, chr_isalpha, chr_isascii, chr_iscntrl, * chr_isdigit, chr_isgraph, chr_islower, chr_isprint, chr_ispunct, * chr_isspace, chr_isupper, chr_isxdigit): New functions declared. (c_true): New macro. --- ChangeLog | 15 ++++++++++++++ eval.c | 12 ++++++++++++ lib.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- lib.h | 14 +++++++++++++ 4 files changed, 106 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index da3cb05a..0ff4650a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2011-12-07 Kaz Kylheku + + * eval.c (eval_init): New character functions registered. + + * lib.c (c_num): Generalized to convert characters to numbers also. + This allows functions like gt and lt to work with characters. + (chr_isalnum, chr_isalpha, chr_isascii, chr_iscntrl, chr_isdigit, + chr_isgraph, chr_islower, chr_isprint, chr_ispunct, chr_isspace, + chr_isupper, chr_isxdigit): New functions added. + + * lib.h: (chr_isalnum, chr_isalpha, chr_isascii, chr_iscntrl, + * chr_isdigit, chr_isgraph, chr_islower, chr_isprint, chr_ispunct, + * chr_isspace, chr_isupper, chr_isxdigit): New functions declared. + (c_true): New macro. + 2011-12-07 Kaz Kylheku * eval.c (progn_s): New symbol variable. diff --git a/eval.c b/eval.c index 59d0d36b..f54795aa 100644 --- a/eval.c +++ b/eval.c @@ -1187,6 +1187,18 @@ void eval_init(void) reg_fun(intern(lit("string-lt"), user_package), func_n2(string_lt)); reg_fun(intern(lit("int-str"), user_package), func_n2(int_str)); reg_fun(intern(lit("chrp"), user_package), func_n1(chrp)); + reg_fun(intern(lit("chr-isalnum"), user_package), func_n1(chr_isalnum)); + reg_fun(intern(lit("chr-isalpha"), user_package), func_n1(chr_isalpha)); + reg_fun(intern(lit("chr-isascii"), user_package), func_n1(chr_isascii)); + reg_fun(intern(lit("chr-iscntrl"), user_package), func_n1(chr_iscntrl)); + reg_fun(intern(lit("chr-isdigit"), user_package), func_n1(chr_isdigit)); + reg_fun(intern(lit("chr-isgraph"), user_package), func_n1(chr_isgraph)); + reg_fun(intern(lit("chr-islower"), user_package), func_n1(chr_islower)); + reg_fun(intern(lit("chr-isprint"), user_package), func_n1(chr_isprint)); + reg_fun(intern(lit("chr-ispunct"), user_package), func_n1(chr_ispunct)); + reg_fun(intern(lit("chr-isspace"), user_package), func_n1(chr_isspace)); + reg_fun(intern(lit("chr-isupper"), user_package), func_n1(chr_isupper)); + reg_fun(intern(lit("chr-isxdigit"), user_package), func_n1(chr_isxdigit)); reg_fun(intern(lit("chr-str"), user_package), func_n2(chr_str)); reg_fun(intern(lit("chr-str-set"), user_package), func_n3(chr_str_set)); reg_fun(intern(lit("span-str"), user_package), func_n2(span_str)); diff --git a/lib.c b/lib.c index 672efa4a..82ab73a1 100644 --- a/lib.c +++ b/lib.c @@ -794,9 +794,12 @@ val num(cnum n) cnum c_num(val num) { - if (!is_num(num)) + switch (tag(num)) { + case TAG_CHR: case TAG_NUM: + return ((cnum) num) >> TAG_SHIFT; + default: type_mismatch(lit("~s is not a number"), num, nao); - return ((cnum) num) >> TAG_SHIFT; + } } val nump(val num) @@ -1465,6 +1468,66 @@ wchar_t c_chr(val chr) return (wchar_t) ((cnum) chr >> TAG_SHIFT); } +val chr_isalnum(val ch) +{ + return c_true(iswalnum(c_chr(ch))); +} + +val chr_isalpha(val ch) +{ + return c_true(iswalpha(c_chr(ch))); +} + +val chr_isascii(val ch) +{ + return c_true(c_chr(ch) >= 0 && c_chr(ch) < 128); +} + +val chr_iscntrl(val ch) +{ + return c_true(iswcntrl(c_chr(ch))); +} + +val chr_isdigit(val ch) +{ + return c_true(iswdigit(c_chr(ch))); +} + +val chr_isgraph(val ch) +{ + return c_true(iswgraph(c_chr(ch))); +} + +val chr_islower(val ch) +{ + return c_true(iswlower(c_chr(ch))); +} + +val chr_isprint(val ch) +{ + return c_true(iswprint(c_chr(ch))); +} + +val chr_ispunct(val ch) +{ + return c_true(iswpunct(c_chr(ch))); +} + +val chr_isspace(val ch) +{ + return c_true(iswspace(c_chr(ch))); +} + +val chr_isupper(val ch) +{ + return c_true(iswupper(c_chr(ch))); +} + +val chr_isxdigit(val ch) +{ + return c_true(iswxdigit(c_chr(ch))); +} + val chr_str(val str, val index) { bug_unless (length_str_gt(str, index)); diff --git a/lib.h b/lib.h index 414e7726..776f1221 100644 --- a/lib.h +++ b/lib.h @@ -395,6 +395,18 @@ val string_lt(val astr, val bstr); val int_str(val str, val base); val chrp(val chr); wchar_t c_chr(val chr); +val chr_isalnum(val ch); +val chr_isalpha(val ch); +val chr_isascii(val ch); +val chr_iscntrl(val ch); +val chr_isdigit(val ch); +val chr_isgraph(val ch); +val chr_islower(val ch); +val chr_isprint(val ch); +val chr_ispunct(val ch); +val chr_isspace(val ch); +val chr_isupper(val ch); +val chr_isxdigit(val ch); val chr_str(val str, val index); val chr_str_set(val str, val index, val chr); val span_str(val str, val set); @@ -522,6 +534,8 @@ INLINE val eq(val a, val b) { return ((a) == (b) ? t : nil); } #define or4(a, b, c, d) or2(a, or3(b, c, d)) +#define c_true(c_cond) ((c_cond) ? t : nil) + #define list_collect_decl(OUT, PTAIL) \ obj_t *OUT = nil, **PTAIL = &OUT -- cgit v1.2.3