summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2010-02-28 17:03:11 +0900
committerKaz Kylheku <kaz@kylheku.com>2010-02-28 17:03:11 +0900
commit0d20a5dd2d065c5dfa3fbc2079deef809289ecaf (patch)
tree2b76488b4716cfbcb6046255201b863b6c4de364 /lib.c
parent0bad0c321d51352bfb68c3759c7fd78489e7e254 (diff)
downloadtxr-0d20a5dd2d065c5dfa3fbc2079deef809289ecaf.tar.gz
txr-0d20a5dd2d065c5dfa3fbc2079deef809289ecaf.tar.bz2
txr-0d20a5dd2d065c5dfa3fbc2079deef809289ecaf.zip
* lib.c (length_str_gt, length_str_ge, length_str_lt, length_str_le):
Added missing support for literal string type.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c100
1 files changed, 64 insertions, 36 deletions
diff --git a/lib.c b/lib.c
index 1d073a29..99edd835 100644
--- a/lib.c
+++ b/lib.c
@@ -1587,61 +1587,89 @@ val lazy_str_force_upto(val lstr, val index)
val length_str_gt(val str, val len)
{
- type_check2 (str, STR, LSTR);
+ if (is_lit(str)) {
+ const wchar_t *cstr = c_str(str);
+ size_t clen = c_num(len);
+ const wchar_t *nult = wmemchr(cstr, 0, clen + 1);
+ return nult == 0 ? t : nil;
+ } else {
+ type_check2 (str, STR, LSTR);
- switch (str->t.type) {
- case STR:
- return gt(length_str(str), len);
- case LSTR:
- lazy_str_force_upto(str, len);
- return gt(length_str(str->ls.prefix), len);
- default:
- internal_error("unexpected type value");
+ switch (str->t.type) {
+ case STR:
+ return gt(length_str(str), len);
+ case LSTR:
+ lazy_str_force_upto(str, len);
+ return gt(length_str(str->ls.prefix), len);
+ default:
+ internal_error("unexpected type value");
+ }
}
}
val length_str_ge(val str, val len)
{
- type_check2 (str, STR, LSTR);
+ if (is_lit(str)) {
+ const wchar_t *cstr = c_str(str);
+ size_t clen = c_num(len);
+ const wchar_t *nult = wmemchr(cstr, 0, clen);
+ return nult == 0 ? t : nil;
+ } else {
+ type_check2 (str, STR, LSTR);
- switch (str->t.type) {
- case STR:
- return ge(length_str(str), len);
- case LSTR:
- lazy_str_force_upto(str, len);
- return ge(length_str(str->ls.prefix), len);
- default:
- internal_error("unexpected type value");
+ switch (str->t.type) {
+ case STR:
+ return ge(length_str(str), len);
+ case LSTR:
+ lazy_str_force_upto(str, len);
+ return ge(length_str(str->ls.prefix), len);
+ default:
+ internal_error("unexpected type value");
+ }
}
}
val length_str_lt(val str, val len)
{
- type_check2 (str, STR, LSTR);
+ if (is_lit(str)) {
+ const wchar_t *cstr = c_str(str);
+ size_t clen = c_num(len);
+ const wchar_t *nult = wmemchr(cstr, 0, clen);
+ return nult != 0 ? t : nil;
+ } else {
+ type_check2 (str, STR, LSTR);
- switch (str->t.type) {
- case STR:
- return lt(length_str(str), len);
- case LSTR:
- lazy_str_force_upto(str, len);
- return lt(length_str(str->ls.prefix), len);
- default:
- internal_error("unexpected type value");
+ switch (str->t.type) {
+ case STR:
+ return lt(length_str(str), len);
+ case LSTR:
+ lazy_str_force_upto(str, len);
+ return lt(length_str(str->ls.prefix), len);
+ default:
+ internal_error("unexpected type value");
+ }
}
}
val length_str_le(val str, val len)
{
- type_check2 (str, STR, LSTR);
+ if (is_lit(str)) {
+ const wchar_t *cstr = c_str(str);
+ size_t clen = c_num(len);
+ const wchar_t *nult = wmemchr(cstr, 0, clen + 1);
+ return nult != 0 ? t : nil;
+ } else {
+ type_check2 (str, STR, LSTR);
- switch (str->t.type) {
- case STR:
- return le(length_str(str), len);
- case LSTR:
- lazy_str_force_upto(str, len);
- return le(length_str(str->ls.prefix), len);
- default:
- internal_error("unexpected type value");
+ switch (str->t.type) {
+ case STR:
+ return le(length_str(str), len);
+ case LSTR:
+ lazy_str_force_upto(str, len);
+ return le(length_str(str->ls.prefix), len);
+ default:
+ internal_error("unexpected type value");
+ }
}
}