X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=builtins%2Fbuiltins.c;h=026f8e2368d3507dc121b6361fd61f1c18fca616;hb=5c979e7cc73ea8b7c47ada5c1f84126a8a250868;hp=9b20ce9d639275eec77e921a1902f356937049e6;hpb=97620a36d173883343ad51438f04711eff04981d;p=cparser diff --git a/builtins/builtins.c b/builtins/builtins.c index 9b20ce9..026f8e2 100644 --- a/builtins/builtins.c +++ b/builtins/builtins.c @@ -20,13 +20,14 @@ static inline char *strrchr(const char *s, int c) static inline int strcmp(const char *s1, const char *s2) { - for( ; (*s1 | *s2) != 0; ++s1, ++s2) { + for( ; *s1 != 0; ++s1, ++s2) { if(*s1 != *s2) break; } return (unsigned char)*s1 - (unsigned char)*s2; } +/* static inline __SIZE_TYPE__ strlen(const char *s) { __SIZE_TYPE__ result = 0; @@ -34,6 +35,42 @@ static inline __SIZE_TYPE__ strlen(const char *s) result++; return result; } +*/ + +static inline __SIZE_TYPE__ strlen(const char *str) +{ + const char *char_ptr; + const unsigned long *long_ptr; + unsigned long int longword, magic_bits, himagic, lomagic; + int abort(void); + + for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof(longword)-1)) != 0; ++char_ptr) { + if (*char_ptr == '\0') + return char_ptr - str; + } + + long_ptr = (unsigned long int*) char_ptr; + magic_bits = 0x7efefeffL; + himagic = 0x80808080L; + lomagic = 0x01010101L; + if (sizeof(longword) > 4) + abort(); + + for(;;) { + longword = *long_ptr++; + if (((longword - lomagic) & himagic) != 0) { + const char *cp = (const char*) (long_ptr - 1); + if (cp[0] == 0) + return cp-str; + if (cp[1] == 0) + return cp-str+1; + if (cp[2] == 0) + return cp-str+2; + if (cp[3] == 0) + return cp-str+3; + } + } +} static inline char *strcpy(char *dest, const char *source) {