diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2012-03-18 01:48:39 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2013-05-22 23:13:58 -0700 |
commit | 6c450b1b253072f4d567cabd489a61a48d355788 (patch) | |
tree | 375cecf5bf20946bb47f344812b8ee3b428f85c5 | |
parent | aa5aed38f16aa15dc3c3d2fe4547fb86e26cd6e6 (diff) | |
download | txr-6c450b1b253072f4d567cabd489a61a48d355788.tar.gz txr-6c450b1b253072f4d567cabd489a61a48d355788.tar.bz2 txr-6c450b1b253072f4d567cabd489a61a48d355788.zip |
* eval.c (eval_init): lazy string related functions become intrinsics.
* lib.c (string_cmp): New function.
* lib.h (TYPE_SHIFT, TYPE_PAIR): New macros.
(string_cmp): Declared.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | eval.c | 10 | ||||
-rw-r--r-- | lib.c | 39 | ||||
-rw-r--r-- | lib.h | 3 |
4 files changed, 60 insertions, 1 deletions
@@ -1834,6 +1834,15 @@ 2012-03-18 Kaz Kylheku <kaz@kylheku.com> + * eval.c (eval_init): lazy string related functions become intrinsics. + + * lib.c (string_cmp): New function. + + * lib.h (TYPE_SHIFT, TYPE_PAIR): New macros. + (string_cmp): Declared. + +2012-03-18 Kaz Kylheku <kaz@kylheku.com> + * eval.c (eval_init): url_decode has two parameters now, so we make the second one optional. @@ -2400,6 +2400,16 @@ void eval_init(void) reg_fun(intern(lit("compl-span-str"), user_package), func_n2(compl_span_str)); reg_fun(intern(lit("break-str"), user_package), func_n2(break_str)); + reg_fun(intern(lit("lazy-stream-cons"), user_package), func_n1(lazy_stream_cons)); + reg_fun(intern(lit("lazy-str"), user_package), func_n3(lazy_str)); + reg_fun(intern(lit("lazy-str-force-upto"), user_package), func_n2(lazy_str_force_upto)); + reg_fun(intern(lit("lazy-str-force"), user_package), func_n1(lazy_str_force)); + reg_fun(intern(lit("lazy-str-get-trailing-list"), user_package), func_n2(lazy_str_get_trailing_list)); + reg_fun(intern(lit("length-str-gt"), user_package), func_n2(length_str_gt)); + reg_fun(intern(lit("length-str-ge"), user_package), func_n2(length_str_ge)); + reg_fun(intern(lit("length-str-lt"), user_package), func_n2(length_str_lt)); + reg_fun(intern(lit("length-str-le"), user_package), func_n2(length_str_le)); + reg_fun(intern(lit("vector"), user_package), func_n1(vector)); reg_fun(intern(lit("vectorp"), user_package), func_n1(vectorp)); reg_fun(intern(lit("vec-set-length"), user_package), func_n2(vec_set_length)); @@ -2116,6 +2116,45 @@ val trim_str(val str) } } +val string_cmp(val astr, val bstr) +{ + switch (TYPE_PAIR(tag(astr), tag(bstr))) { + case TYPE_PAIR(LIT, LIT): + case TYPE_PAIR(STR, STR): + case TYPE_PAIR(LIT, STR): + case TYPE_PAIR(STR, LIT): + return num_fast(wcscmp(c_str(astr), c_str(bstr))); + case TYPE_PAIR(LSTR, LIT): + case TYPE_PAIR(LSTR, STR): + case TYPE_PAIR(LIT, LSTR): + case TYPE_PAIR(STR, LSTR): + case TYPE_PAIR(LSTR, LSTR): + { + val i; + for (i = zero; + length_str_lt(astr, i) && length_str_lt(bstr, i); + i = plus(i, one)) + { + val ach = chr_str(astr, i); + val bch = chr_str(bstr, i); + + if (ach < bch) + return num_fast(-1); + else if (ach < bch) + return num_fast(1); + } + if (length_str_lt(bstr, i)) + return num_fast(-1); + if (length_str_lt(astr, i)) + return num_fast(1); + return zero; + } + default: + uw_throwf(error_s, lit("string-cmp: invalid operands ~s ~s"), + astr, bstr, nao); + } +} + val string_lt(val astr, val bstr) { return wcscmp(c_str(astr), c_str(bstr)) < 0 ? t : nil; @@ -42,7 +42,7 @@ typedef int_ptr_t cnum; typedef enum type { NIL, NUM = TAG_NUM, CHR = TAG_CHR, LIT = TAG_LIT, CONS, STR, SYM, PKG, FUN, VEC, LCONS, LSTR, COBJ, ENV, - BGNUM, FLNUM + BGNUM, FLNUM /* If extending, check TYPE_SHIFT */ } type_t; #define TYPE_SHIFT 4 @@ -504,6 +504,7 @@ val split_str_set(val str, val set); val tok_str(val str, val tok_regex); val list_str(val str); val trim_str(val str); +val string_cmp(val astr, val bstr); val string_lt(val astr, val bstr); val int_str(val str, val base); val flo_str(val str); |