inline size_t has_zero_byte( const size_t n ) // 32bit 전용
{
const size_t finder = (size_t)0x01010101;
const size_t masker = (size_t)0x80808080;
return ( n - finder ) & ( ~n & masker );
}
char lower_ascii[ 0x100 ];
inline char* strstr_i( const char *src, const char *sub )
{
char* s = (char*)src;
char* r = (char*)sub;
char* o = s;
while( *s )
{
if( lower_ascii[ *s ] == lower_ascii[ *r ] )
{
s++;
r++;
if ( !*r ) return o - 1;
}
else
{
s = o++;
r = (char*)sub;
}
}
return NULL;
}
char* strstr_i2( const char *src, const char *sub )
{
if( !lower_ascii[ 0xFF ] ) // NULL parameter 를 이용해 초기화할 수 있게 해주지뭐.
{
size_t i;
for( i = 0; i < 'A'; ++i ) lower_ascii[ i ] = i;
for( ; i <= 'Z'; ++i ) lower_ascii[ i ] = i | 0x20;
for( ; i < 0x100; ++i ) lower_ascii[ i ] = i;
}
if( !( (size_t)src | (size_t)sub ) ) return NULL;
char* s = (char*)src;
char* r = (char*)sub;
char* o = s;
while( !has_zero_byte(*(size_t*)s) )
{
if( lower_ascii[ *s ] == lower_ascii[ *r ] )
{
s++, r++;
if( !*r ) return o - 1;
}
else
s = o++, r = (char*)sub;
if( lower_ascii[ *s ] == lower_ascii[ *r ] )
{
s++, r++;
if( !*r ) return o - 1;
}
else
s = o++, r = (char*)sub;
if( lower_ascii[ *s ] == lower_ascii[ *r ] )
{
s++, r++;
if( !*r ) return o - 1;
}
else
s = o++, r = (char*)sub;
if( lower_ascii[ *s ] == lower_ascii[ *r ] )
{
s++, r++;
if( !*r ) return o - 1;
}
else
s = o++, r = (char*)sub;
}
return strstr_i(s, sub);
}
좀 더 놀아보자.
어엌 역시 10대는 틀림.
지치지도 않으심 ㅋ
ㅋㅋㅋ