C, C++ 문법

대소문자 구별 없이 소스 문자열에서 특정 문자열 찾기

디버그정 2012. 3. 5. 11:16
#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;
}