69,393
社区成员
发帖
与我相关
我的任务
分享
int StrcmpA(const char* p1,const char* p2)
{
#define RETURN_COMPARE(x,y)\
if(x>y) return 1;\
else if(x<y) return -1;\
else if(x=='\0') return 0;
RETURN_COMPARE(p1[0],p2[0]);
RETURN_COMPARE(p1[1],p2[1]);
RETURN_COMPARE(p1[2],p2[2]);
RETURN_COMPARE(p1[3],p2[3]);
#ifdef E_64
RETURN_COMPARE(p1[4],p2[4]);
RETURN_COMPARE(p1[5],p2[5]);
RETURN_COMPARE(p1[6],p2[6]);
RETURN_COMPARE(p1[7],p2[7]);
#endif
const size_t* pt1=(const size_t*)p1+1;
const size_t* pt2=(const size_t*)p2+1;
while(1)
{
if(*pt1!=*pt2)
{
//发现不相等的字符
p1=(const char*)pt1;
p2=(const char*)pt2;
RETURN_COMPARE(p1[0],p2[0]);
RETURN_COMPARE(p1[1],p2[1]);
RETURN_COMPARE(p1[2],p2[2]);
RETURN_COMPARE(p1[3],p2[3]);
#ifdef VE_64
RETURN_COMPARE(p1[4],p2[4]);
RETURN_COMPARE(p1[5],p2[5]);
RETURN_COMPARE(p1[6],p2[6]);
RETURN_COMPARE(p1[7],p2[7]);
#endif
}
else if((*pt1&0xff)==0
||
(*pt1&0xff00)==0
||
(*pt1&0xff0000)==0
||
(*pt1&0xff000000)==0
#ifdef VE_64
||
(*pt1&0xff00000000)==0
||
(*pt1&0xff0000000000)==0
||
(*pt1&0xff000000000000)==0
||
(*pt1&0xff00000000000000)==0
#endif
)
return 0;//检查结束
pt1++;
pt2++;
}
}
/* Compare characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strcmp
# if __GNUC_PREREQ (3, 2)
# define strcmp(s1, s2) \
__extension__ \
({ size_t __s1_len, __s2_len; \
(__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (__s1_len = strlen (s1), __s2_len = strlen (s2), \
(!__string2_1bptr_p (s1) || __s1_len >= 4) \
&& (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
? __builtin_strcmp (s1, s2) \
: (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
&& (__s1_len = strlen (s1), __s1_len < 4) \
? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
? __builtin_strcmp (s1, s2) \
: __strcmp_cg (s1, s2, __s1_len)) \
: (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
&& (__s2_len = strlen (s2), __s2_len < 4) \
? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
? __builtin_strcmp (s1, s2) \
: __strcmp_gc (s1, s2, __s2_len)) \
: __builtin_strcmp (s1, s2)))); })
# else
# define strcmp(s1, s2) \
__extension__ \
({ size_t __s1_len, __s2_len; \
(__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (__s1_len = strlen (s1), __s2_len = strlen (s2), \
(!__string2_1bptr_p (s1) || __s1_len >= 4) \
&& (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
? memcmp ((__const char *) (s1), (__const char *) (s2), \
(__s1_len < __s2_len ? __s1_len : __s2_len) + 1) \
: (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
&& (__s1_len = strlen (s1), __s1_len < 4) \
? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
? __strcmp_cc (s1, s2, __s1_len) \
: __strcmp_cg (s1, s2, __s1_len)) \
: (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
&& (__s2_len = strlen (s2), __s2_len < 4) \
? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
? __strcmp_cc (s1, s2, __s2_len) \
: __strcmp_gc (s1, s2, __s2_len)) \
: strcmp (s1, s2)))); })
# endif