diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2010-02-28 17:03:11 +0900 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2010-02-28 17:03:11 +0900 |
commit | 0d20a5dd2d065c5dfa3fbc2079deef809289ecaf (patch) | |
tree | 2b76488b4716cfbcb6046255201b863b6c4de364 /lib.c | |
parent | 0bad0c321d51352bfb68c3759c7fd78489e7e254 (diff) | |
download | txr-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.c | 100 |
1 files changed, 64 insertions, 36 deletions
@@ -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"); + } } } |