From 683b5989aef75ab0184571be708b6b56fe190db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Thu, 27 Mar 2014 15:31:03 +0000 Subject: [PATCH] fix sub_string and friends --- C/atomic.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/C/atomic.c b/C/atomic.c index f1b496d81..19ab6919c 100644 --- a/C/atomic.c +++ b/C/atomic.c @@ -736,6 +736,7 @@ p_get_string_code3( USES_REGS1 ) return FALSE; } } else { + indx -= 1; ns = utf8_skip(s,indx); if (ns == NULL) { return FALSE; @@ -1239,17 +1240,17 @@ build_new_atomic(int mask, wchar_t *wp, char *p, size_t min, size_t len USES_REG return MkAtomTerm(nat); } else { char *src = p; - int i, chr; Term t = init_tstring( PASS_REGS1 ); - for (i = 0; i < min; i++) src = utf8_get_char(src, &chr); - char *cp = src, *buf, *lim = cp+strlen(cp); + src = (char *)utf8_skip(src, min); + char *cp = src, *buf; LOCAL_TERM_ERROR( 4*(len+1) ); buf = buf_from_tstring(HR); - while (cp < lim) { + while (len) { int chr; cp = utf8_get_char(cp, &chr); buf = utf8_put_char(buf, chr); + len--; } *buf++ = '\0'; @@ -1300,15 +1301,10 @@ check_sub_atom_at(int min, Atom at, Atom nat) } static int -check_sub_string_at(int min, Term at, Term nat) +check_sub_string_at(int min, const char *p1, const char *p2, size_t len2) { - const char *p1, *p2; - int c1; - - p1 = utf8_skip(StringOfTerm(at), min); - p2 = StringOfTerm(nat); - while ( (c1 = *p1++) == *p2++ && c1); - return c1 == 0; + p1 = utf8_skip(p1, min); + return utf8_strncmp( p1, p2, len2 ) == 0; } static int @@ -1462,9 +1458,12 @@ cont_sub_atomic( USES_REGS1 ) } } } else { + const char *p = StringOfTerm( Deref(ARG1) ), *p1 = p; + const char *p5 = StringOfTerm( Deref(ARG5) ); + while (!found) { - p = (char *)utf8_skip(p, min); - if (utf8_strncmp(p, StringOfTerm(nat), len) == 0) { + p = utf8_skip(p1, min); + if (utf8_strncmp(p, p5, len) == 0) { Yap_unify(ARG2, MkIntegerTerm(min)); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG4, MkIntegerTerm(after)); @@ -1665,7 +1664,7 @@ init_sub_atomic( int sub_atom USES_REGS ) if (sub_atom) out = check_sub_atom_at(min, at, AtomOfTerm(nat)); else - out = check_sub_string_at(min, tat1, tout); + out = check_sub_string_at(min, p, StringOfTerm( nat ), len); } else if ((mask & (SUB_ATOM_HAS_AFTER|SUB_ATOM_HAS_VAL)) == (SUB_ATOM_HAS_AFTER|SUB_ATOM_HAS_VAL)) { if (sub_atom)