summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-03-18 01:48:39 -0700
committerKaz Kylheku <kaz@kylheku.com>2013-05-22 23:13:58 -0700
commit6c450b1b253072f4d567cabd489a61a48d355788 (patch)
tree375cecf5bf20946bb47f344812b8ee3b428f85c5 /lib.c
parentaa5aed38f16aa15dc3c3d2fe4547fb86e26cd6e6 (diff)
downloadtxr-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.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index a1e505c8..d5f5dd32 100644
--- a/lib.c
+++ b/lib.c
@@ -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;