summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--eval.c12
-rw-r--r--lib.c67
-rw-r--r--lib.h14
4 files changed, 106 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index da3cb05a..0ff4650a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
2011-12-07 Kaz Kylheku <kaz@kylheku.com>
+ * 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 <kaz@kylheku.com>
+
* eval.c (progn_s): New symbol variable.
(op_progn): New static function.
(eval_init): Initialize new variable, register progn operator.
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