#if defined(UNICODE) || defined(_UNICODE)
#define _tcsistr wcsistr
#else
#define _tcsistr stristr
#endif
char * __stdcall stristr(const char *src, const char *fnd)
{
const char *p, *q;
char a, b;
for (; ; ++src)
{
for (p = src, q = fnd; *q; ++p, ++q) // 빠른 실행 위해 *p 조건은 넣지 않는다. 안의 문자 불일치 조건으로 처리된다.
{
if (*p <= 'Z' && *p >= 'A') {a = *p + 0x20;} else {a = *p;} // 'A' 이상인 경우가 훨씬 많으므로 'Z' 이하 조건을 앞에 두는게 효율적이다.
if (*q <= 'Z' && *q >= 'A') {b = *q + 0x20;} else {b = *q;}
if (a != b)
break;
}
if (!*q)
return (char *)src;
if (!*src)
break;
}
return NULL;
}
wchar_t * __stdcall wcsistr(const wchar_t *src, const wchar_t *fnd)
{
const wchar_t *p, *q;
wchar_t a, b;
for (; ; ++src)
{
for (p = src, q = fnd; *q; ++p, ++q)
{
if (*p <= 'Z' && *p >= 'A') {a = *p + 0x20;} else {a = *p;}
if (*q <= 'Z' && *q >= 'A') {b = *q + 0x20;} else {b = *q;}
if (a != b)
break;
}
if (!*q)
return (wchar_t *)src;
if (!*src)
break;
}
return NULL;
}