X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=builtins%2Fbuiltins.c;h=026f8e2368d3507dc121b6361fd61f1c18fca616;hb=ff25d271feafec73df71169a5b87dcc2854fd85e;hp=33425638bc87a9220431a1584ed40596cbfcedf5;hpb=66b3151d6ecdd2d8958d0bb1cbe8e92f2ac5000f;p=cparser diff --git a/builtins/builtins.c b/builtins/builtins.c index 3342563..026f8e2 100644 --- a/builtins/builtins.c +++ b/builtins/builtins.c @@ -27,6 +27,7 @@ static inline int strcmp(const char *s1, const char *s2) 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) {