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);

}


좀 더 놀아보자.