1 #define _GNU_SOURCE 1 2 #include <string.h> 3 4 #ifdef _MSC_VER 5 _inline void * 6 #else 7 static __inline__ void * 8 #endif my_inline_memchr(const void * pv,int ch,register size_t cb)9my_inline_memchr(const void *pv, int ch, register size_t cb) 10 { 11 register const unsigned int uch = (unsigned)ch; 12 register const unsigned char *pb = (const unsigned char *)pv; 13 #if 0 /* 8-byte loop unroll */ 14 while (cb >= 8) 15 { 16 if (*pb == uch) 17 return (unsigned char *)pb; 18 if (pb[1] == uch) 19 return (unsigned char *)pb + 1; 20 if (pb[2] == uch) 21 return (unsigned char *)pb + 2; 22 if (pb[3] == uch) 23 return (unsigned char *)pb + 3; 24 if (pb[4] == uch) 25 return (unsigned char *)pb + 4; 26 if (pb[5] == uch) 27 return (unsigned char *)pb + 5; 28 if (pb[6] == uch) 29 return (unsigned char *)pb + 6; 30 if (pb[7] == uch) 31 return (unsigned char *)pb + 7; 32 cb -= 8; 33 pb += 8; 34 } 35 switch (cb & 7) 36 { 37 case 0: 38 break; 39 case 1: 40 if (*pb == uch) 41 return (unsigned char *)pb; 42 break; 43 case 2: 44 if (*pb == uch) 45 return (unsigned char *)pb; 46 if (pb[1] == uch) 47 return (unsigned char *)pb + 1; 48 break; 49 case 3: 50 if (*pb == uch) 51 return (unsigned char *)pb; 52 if (pb[1] == uch) 53 return (unsigned char *)pb + 1; 54 if (pb[2] == uch) 55 return (unsigned char *)pb + 2; 56 break; 57 case 4: 58 if (*pb == uch) 59 return (unsigned char *)pb; 60 if (pb[1] == uch) 61 return (unsigned char *)pb + 1; 62 if (pb[2] == uch) 63 return (unsigned char *)pb + 2; 64 if (pb[3] == uch) 65 return (unsigned char *)pb + 3; 66 break; 67 case 5: 68 if (*pb == uch) 69 return (unsigned char *)pb; 70 if (pb[1] == uch) 71 return (unsigned char *)pb + 1; 72 if (pb[2] == uch) 73 return (unsigned char *)pb + 2; 74 if (pb[3] == uch) 75 return (unsigned char *)pb + 3; 76 if (pb[4] == uch) 77 return (unsigned char *)pb + 4; 78 break; 79 case 6: 80 if (*pb == uch) 81 return (unsigned char *)pb; 82 if (pb[1] == uch) 83 return (unsigned char *)pb + 1; 84 if (pb[2] == uch) 85 return (unsigned char *)pb + 2; 86 if (pb[3] == uch) 87 return (unsigned char *)pb + 3; 88 if (pb[4] == uch) 89 return (unsigned char *)pb + 4; 90 if (pb[5] == uch) 91 return (unsigned char *)pb + 5; 92 break; 93 case 7: 94 if (*pb == uch) 95 return (unsigned char *)pb; 96 if (pb[1] == uch) 97 return (unsigned char *)pb + 1; 98 if (pb[2] == uch) 99 return (unsigned char *)pb + 2; 100 if (pb[3] == uch) 101 return (unsigned char *)pb + 3; 102 if (pb[4] == uch) 103 return (unsigned char *)pb + 4; 104 if (pb[5] == uch) 105 return (unsigned char *)pb + 5; 106 if (pb[6] == uch) 107 return (unsigned char *)pb + 6; 108 break; 109 } 110 111 #elif 1 /* 4 byte loop unroll */ 112 while (cb >= 4) 113 { 114 if (*pb == uch) 115 return (unsigned char *)pb; 116 if (pb[1] == uch) 117 return (unsigned char *)pb + 1; 118 if (pb[2] == uch) 119 return (unsigned char *)pb + 2; 120 if (pb[3] == uch) 121 return (unsigned char *)pb + 3; 122 cb -= 4; 123 pb += 4; 124 } 125 switch (cb & 3) 126 { 127 case 0: 128 break; 129 case 1: 130 if (*pb == uch) 131 return (unsigned char *)pb; 132 break; 133 case 2: 134 if (*pb == uch) 135 return (unsigned char *)pb; 136 if (pb[1] == uch) 137 return (unsigned char *)pb + 1; 138 break; 139 case 3: 140 if (*pb == uch) 141 return (unsigned char *)pb; 142 if (pb[1] == uch) 143 return (unsigned char *)pb + 1; 144 if (pb[2] == uch) 145 return (unsigned char *)pb + 2; 146 break; 147 } 148 149 #else /* the basic loop */ 150 while (cb > 0) 151 { 152 if (*pb == uch) 153 return (void *)pb; 154 cb--; 155 pb++; 156 } 157 #endif 158 return 0; 159 } 160 161 #define memchr my_inline_memchr 162 163