msvcrt: Don't use strstr from C-library.
Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
225dad5d0d
commit
df60573653
|
@ -1211,7 +1211,7 @@ unsigned char* CDECL _mbscpy( unsigned char *dst, const unsigned char *src )
|
|||
*/
|
||||
unsigned char * CDECL _mbsstr(const unsigned char *haystack, const unsigned char *needle)
|
||||
{
|
||||
return (unsigned char *)strstr( (const char *)haystack, (const char *)needle );
|
||||
return (unsigned char *)MSVCRT_strstr( (const char *)haystack, (const char *)needle );
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
|
|
@ -1176,6 +1176,7 @@ int __cdecl MSVCRT__stricmp(const char*, const char*);
|
|||
int __cdecl MSVCRT__strnicmp(const char*, const char*, MSVCRT_size_t);
|
||||
int __cdecl MSVCRT__strnicoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t);
|
||||
int __cdecl MSVCRT__strncoll_l(const char*, const char*, MSVCRT_size_t, MSVCRT__locale_t);
|
||||
char* __cdecl MSVCRT_strstr(const char*, const char*);
|
||||
unsigned int __cdecl MSVCRT__get_output_format(void);
|
||||
char* __cdecl MSVCRT_strtok_s(char*, const char*, char**);
|
||||
|
||||
|
|
|
@ -2005,7 +2005,42 @@ int __cdecl MSVCRT__stricmp(const char *s1, const char *s2)
|
|||
*/
|
||||
char* __cdecl MSVCRT_strstr(const char *haystack, const char *needle)
|
||||
{
|
||||
return strstr(haystack, needle);
|
||||
MSVCRT_size_t i, j, len, needle_len, lps_len;
|
||||
BYTE lps[256];
|
||||
|
||||
needle_len = MSVCRT_strlen(needle);
|
||||
if (!needle_len) return (char*)haystack;
|
||||
lps_len = needle_len > ARRAY_SIZE(lps) ? ARRAY_SIZE(lps) : needle_len;
|
||||
|
||||
lps[0] = 0;
|
||||
len = 0;
|
||||
i = 1;
|
||||
while (i < lps_len)
|
||||
{
|
||||
if (needle[i] == needle[len]) lps[i++] = ++len;
|
||||
else if (len) len = lps[len-1];
|
||||
else lps[i++] = 0;
|
||||
}
|
||||
|
||||
i = j = 0;
|
||||
while (haystack[i])
|
||||
{
|
||||
while (j < lps_len && haystack[i] && haystack[i] == needle[j])
|
||||
{
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
|
||||
if (j == needle_len) return (char*)haystack + i - j;
|
||||
else if (j)
|
||||
{
|
||||
if (j == ARRAY_SIZE(lps) && !MSVCRT_strncmp(haystack + i, needle + j, needle_len - j))
|
||||
return (char*)haystack + i - j;
|
||||
j = lps[j-1];
|
||||
}
|
||||
else if (haystack[i]) i++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
|
|
@ -3897,6 +3897,39 @@ static void test_C_locale(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void test_strstr(void)
|
||||
{
|
||||
static char long_str[1024];
|
||||
const struct {
|
||||
const char *haystack;
|
||||
const char *needle;
|
||||
int off;
|
||||
} tests[] = {
|
||||
{ "", "", 0 },
|
||||
{ "", "a", -1 },
|
||||
{ "a", "", 0 },
|
||||
{ "aabc", "abc", 1 },
|
||||
{ "aaaa", "aaaa", 0 },
|
||||
{ "simple", "simple", 0 },
|
||||
{ "aaaaxaaaaxaaaa", "aaaaa", -1 },
|
||||
{ "aaaaxaaaaxaaaaa", "aaaaa", 10 },
|
||||
{ "abcabcdababcdabcdabde", "abcdabd", 13 },
|
||||
{ "abababababcabababcababbba", "abababcaba", 4 },
|
||||
{ long_str, long_str+1, 0 }
|
||||
};
|
||||
const char *r, *exp;
|
||||
int i;
|
||||
|
||||
memset(long_str, 'a', sizeof(long_str)-1);
|
||||
|
||||
for (i=0; i<ARRAY_SIZE(tests); i++)
|
||||
{
|
||||
r = strstr(tests[i].haystack, tests[i].needle);
|
||||
exp = tests[i].off == -1 ? NULL : tests[i].haystack + tests[i].off;
|
||||
ok(r == exp, "%d) strstr returned %p, expected %p\n", i, r, exp);
|
||||
}
|
||||
}
|
||||
|
||||
START_TEST(string)
|
||||
{
|
||||
char mem[100];
|
||||
|
@ -4036,4 +4069,5 @@ START_TEST(string)
|
|||
test__tcsnicoll();
|
||||
test___strncnt();
|
||||
test_C_locale();
|
||||
test_strstr();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue