strlen 源码

size_t strlen_d(const char *str) {
 
    const char *char_ptr;
    const ulong *longword_ptr;
     register ulong longword, himagic, lomagic;
 
     for (char_ptr = str; ((ulong)char_ptr 
         & (sizeof(ulong) - 1)) != 0;
        ++char_ptr) {
         if (*char_ptr == '\0')
             return char_ptr - str;
     } 
     longword_ptr = (ulong*)char_ptr;
 
     himagic = 0x80808080L;
     lomagic = 0x01010101L;
 
     while (1) {

         longword = *longword_ptr++;
 
         if (((longword - lomagic) & himagic) != 0) {
 
             const char *cp = (const char*)(longword_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;
         }
     }
}

 

posted @ 2014-03-29 17:17  xzenith  阅读(259)  评论(0编辑  收藏  举报