rewrite strstr to do c-style comparisons, to avoid js regexp search artifacts
This commit is contained in:
Родитель
a148e63c4c
Коммит
4cdda28289
|
@ -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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче