aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-07-19 16:48:01 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-07-19 16:48:01 -0700
commit4cdda28289211a182df51aaf2c7305d37989c3fc (patch)
tree8f191289a8dc4e87c7cf93ac08b5472e8de0e655
parenta148e63c4cc952b9f4fbc24bdffffba132c9ef09 (diff)
rewrite strstr to do c-style comparisons, to avoid js regexp search artifacts
-rw-r--r--src/library.js18
-rwxr-xr-xtests/runner.py58
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>