diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-07-19 16:48:01 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-07-19 16:48:01 -0700 |
commit | 4cdda28289211a182df51aaf2c7305d37989c3fc (patch) | |
tree | 8f191289a8dc4e87c7cf93ac08b5472e8de0e655 | |
parent | a148e63c4cc952b9f4fbc24bdffffba132c9ef09 (diff) |
rewrite strstr to do c-style comparisons, to avoid js regexp search artifacts
-rw-r--r-- | src/library.js | 18 | ||||
-rwxr-xr-x | tests/runner.py | 58 |
2 files changed, 72 insertions, 4 deletions
diff --git a/src/library.js b/src/library.js index a3628179..0f37e097 100644 --- a/src/library.js +++ b/src/library.js @@ -4286,10 +4286,20 @@ LibraryManager.library = { }, strstr: function(ptr1, ptr2) { - var str1 = Pointer_stringify(ptr1); - var str2 = Pointer_stringify(ptr2); - var ret = str1.search(str2); - return ret >= 0 ? ptr1 + ret : 0; + var check = 0, start; + do { + var curr1 = {{{ makeGetValue('ptr1++', 0, 'i8') }}}; + if (!check) check = start = ptr2; + var curr2 = {{{ makeGetValue('check++', 0, 'i8') }}}; + if (curr2 == 0) return start; + if (curr2 != curr1) { + // rewind to one character after start, to find ez in eeez + var diff = check - start - 1; + ptr1 -= diff; + check = 0; + } + } while (curr1); + return 0; }, strchr: function(ptr, chr) { diff --git a/tests/runner.py b/tests/runner.py index 156299db..46caef9a 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -3979,6 +3979,64 @@ at function.:blag ''' self.do_run(src, '0*0*0*0*6*5*4*3*3*9*8') + def test_strstr(self): + src = r''' + #include <stdio.h> + #include <string.h> + + int main() + { + printf("%d\n", !!strstr("\\n", "\\n")); + printf("%d\n", !!strstr("cheezy", "ez")); + printf("%d\n", !!strstr("cheeezy", "ez")); + printf("%d\n", !!strstr("cheeeeeeeeeezy", "ez")); + printf("%d\n", !!strstr("cheeeeeeeeee1zy", "ez")); + printf("%d\n", !!strstr("che1ezy", "ez")); + printf("%d\n", !!strstr("che1ezy", "che")); + printf("%d\n", !!strstr("ce1ezy", "che")); + printf("%d\n", !!strstr("ce1ezy", "ezy")); + printf("%d\n", !!strstr("ce1ezyt", "ezy")); + printf("%d\n", !!strstr("ce1ez1y", "ezy")); + printf("%d\n", !!strstr("cheezy", "a")); + printf("%d\n", !!strstr("cheezy", "b")); + printf("%d\n", !!strstr("cheezy", "c")); + printf("%d\n", !!strstr("cheezy", "d")); + printf("%d\n", !!strstr("cheezy", "g")); + printf("%d\n", !!strstr("cheezy", "h")); + printf("%d\n", !!strstr("cheezy", "i")); + printf("%d\n", !!strstr("cheezy", "e")); + printf("%d\n", !!strstr("cheezy", "x")); + printf("%d\n", !!strstr("cheezy", "y")); + printf("%d\n", !!strstr("cheezy", "z")); + printf("%d\n", !!strstr("cheezy", "_")); + return 0; + } + ''' + self.do_run(src, '''1 +1 +1 +1 +0 +1 +1 +0 +1 +1 +0 +0 +0 +1 +0 +0 +1 +0 +1 +0 +1 +1 +0 +''') + def test_sscanf(self): src = r''' #include <stdio.h> |