rewrite strstr to do c-style comparisons, to avoid js regexp search artifacts

This commit is contained in:
Alon Zakai 2012-07-19 16:48:01 -07:00
Родитель a148e63c4c
Коммит 4cdda28289
2 изменённых файлов: 72 добавлений и 4 удалений

Просмотреть файл

@ -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) {

Просмотреть файл

@ -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>