This source file includes following definitions.
- strcpy
 
- strncpy
 
- strcat
 
- strncat
 
- strcmp
 
- strncmp
 
- strchr
 
- strrchr
 
- strspn
 
- strcspn
 
- strpbrk
 
- strstr
 
- strlen
 
- strtok
 
- memcpy
 
- memmove
 
- memcmp
 
- memchr
 
- memset
 
   1 #ifndef _LINUX_STRING_H_
   2 #define _LINUX_STRING_H_
   3 
   4 #include <linux/types.h>        
   5 
   6 #ifndef NULL
   7 #define NULL ((void *) 0)
   8 #endif
   9 
  10 #ifdef __cplusplus
  11 extern "C" {
  12 #endif
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25  
  26 extern inline char * strcpy(char * dest,const char *src)
     
  27 {
  28 __asm__("cld\n"
  29         "1:\tlodsb\n\t"
  30         "stosb\n\t"
  31         "testb %%al,%%al\n\t"
  32         "jne 1b"
  33         : 
  34         :"S" (src),"D" (dest):"si","di","ax","memory");
  35 return dest;
  36 }
  37 
  38 extern inline char * strncpy(char * dest,const char *src,size_t count)
     
  39 {
  40 __asm__("cld\n"
  41         "1:\tdecl %2\n\t"
  42         "js 2f\n\t"
  43         "lodsb\n\t"
  44         "stosb\n\t"
  45         "testb %%al,%%al\n\t"
  46         "jne 1b\n\t"
  47         "rep\n\t"
  48         "stosb\n"
  49         "2:"
  50         : 
  51         :"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory");
  52 return dest;
  53 }
  54 
  55 extern inline char * strcat(char * dest,const char * src)
     
  56 {
  57 __asm__("cld\n\t"
  58         "repne\n\t"
  59         "scasb\n\t"
  60         "decl %1\n"
  61         "1:\tlodsb\n\t"
  62         "stosb\n\t"
  63         "testb %%al,%%al\n\t"
  64         "jne 1b"
  65         : 
  66         :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
  67 return dest;
  68 }
  69 
  70 extern inline char * strncat(char * dest,const char * src,size_t count)
     
  71 {
  72 __asm__("cld\n\t"
  73         "repne\n\t"
  74         "scasb\n\t"
  75         "decl %1\n\t"
  76         "movl %4,%3\n"
  77         "1:\tdecl %3\n\t"
  78         "js 2f\n\t"
  79         "lodsb\n\t"
  80         "stosb\n\t"
  81         "testb %%al,%%al\n\t"
  82         "jne 1b\n"
  83         "2:\txorl %2,%2\n\t"
  84         "stosb"
  85         : 
  86         :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
  87         :"si","di","ax","cx","memory");
  88 return dest;
  89 }
  90 
  91 extern inline int strcmp(const char * cs,const char * ct)
     
  92 {
  93 register int __res __asm__("ax");
  94 __asm__("cld\n"
  95         "1:\tlodsb\n\t"
  96         "scasb\n\t"
  97         "jne 2f\n\t"
  98         "testb %%al,%%al\n\t"
  99         "jne 1b\n\t"
 100         "xorl %%eax,%%eax\n\t"
 101         "jmp 3f\n"
 102         "2:\tsbbl %%eax,%%eax\n\t"
 103         "orb $1,%%eax\n"
 104         "3:"
 105         :"=a" (__res):"S" (cs),"D" (ct):"si","di");
 106 return __res;
 107 }
 108 
 109 extern inline int strncmp(const char * cs,const char * ct,size_t count)
     
 110 {
 111 register int __res __asm__("ax");
 112 __asm__("cld\n"
 113         "1:\tdecl %3\n\t"
 114         "js 2f\n\t"
 115         "lodsb\n\t"
 116         "scasb\n\t"
 117         "jne 3f\n\t"
 118         "testb %%al,%%al\n\t"
 119         "jne 1b\n"
 120         "2:\txorl %%eax,%%eax\n\t"
 121         "jmp 4f\n"
 122         "3:\tsbbl %%eax,%%eax\n\t"
 123         "orb $1,%%al\n"
 124         "4:"
 125         :"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx");
 126 return __res;
 127 }
 128 
 129 extern inline char * strchr(const char * s,char c)
     
 130 {
 131 register char * __res __asm__("ax");
 132 __asm__("cld\n\t"
 133         "movb %%al,%%ah\n"
 134         "1:\tlodsb\n\t"
 135         "cmpb %%ah,%%al\n\t"
 136         "je 2f\n\t"
 137         "testb %%al,%%al\n\t"
 138         "jne 1b\n\t"
 139         "movl $1,%1\n"
 140         "2:\tmovl %1,%0\n\t"
 141         "decl %0"
 142         :"=a" (__res):"S" (s),"0" (c):"si");
 143 return __res;
 144 }
 145 
 146 extern inline char * strrchr(const char * s,char c)
     
 147 {
 148 register char * __res __asm__("dx");
 149 __asm__("cld\n\t"
 150         "movb %%al,%%ah\n"
 151         "1:\tlodsb\n\t"
 152         "cmpb %%ah,%%al\n\t"
 153         "jne 2f\n\t"
 154         "leal -1(%%esi),%0\n"
 155         "2:\ttestb %%al,%%al\n\t"
 156         "jne 1b"
 157         :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si");
 158 return __res;
 159 }
 160 
 161 extern inline size_t strspn(const char * cs, const char * ct)
     
 162 {
 163 register char * __res __asm__("si");
 164 __asm__("cld\n\t"
 165         "movl %4,%%edi\n\t"
 166         "repne\n\t"
 167         "scasb\n\t"
 168         "notl %%ecx\n\t"
 169         "decl %%ecx\n\t"
 170         "movl %%ecx,%%edx\n"
 171         "1:\tlodsb\n\t"
 172         "testb %%al,%%al\n\t"
 173         "je 2f\n\t"
 174         "movl %4,%%edi\n\t"
 175         "movl %%edx,%%ecx\n\t"
 176         "repne\n\t"
 177         "scasb\n\t"
 178         "je 1b\n"
 179         "2:\tdecl %0"
 180         :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
 181         :"ax","cx","dx","di");
 182 return __res-cs;
 183 }
 184 
 185 extern inline size_t strcspn(const char * cs, const char * ct)
     
 186 {
 187 register char * __res __asm__("si");
 188 __asm__("cld\n\t"
 189         "movl %4,%%edi\n\t"
 190         "repne\n\t"
 191         "scasb\n\t"
 192         "notl %%ecx\n\t"
 193         "decl %%ecx\n\t"
 194         "movl %%ecx,%%edx\n"
 195         "1:\tlodsb\n\t"
 196         "testb %%al,%%al\n\t"
 197         "je 2f\n\t"
 198         "movl %4,%%edi\n\t"
 199         "movl %%edx,%%ecx\n\t"
 200         "repne\n\t"
 201         "scasb\n\t"
 202         "jne 1b\n"
 203         "2:\tdecl %0"
 204         :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
 205         :"ax","cx","dx","di");
 206 return __res-cs;
 207 }
 208 
 209 extern inline char * strpbrk(const char * cs,const char * ct)
     
 210 {
 211 register char * __res __asm__("si");
 212 __asm__("cld\n\t"
 213         "movl %4,%%edi\n\t"
 214         "repne\n\t"
 215         "scasb\n\t"
 216         "notl %%ecx\n\t"
 217         "decl %%ecx\n\t"
 218         "movl %%ecx,%%edx\n"
 219         "1:\tlodsb\n\t"
 220         "testb %%al,%%al\n\t"
 221         "je 2f\n\t"
 222         "movl %4,%%edi\n\t"
 223         "movl %%edx,%%ecx\n\t"
 224         "repne\n\t"
 225         "scasb\n\t"
 226         "jne 1b\n\t"
 227         "decl %0\n\t"
 228         "jmp 3f\n"
 229         "2:\txorl %0,%0\n"
 230         "3:"
 231         :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
 232         :"ax","cx","dx","di");
 233 return __res;
 234 }
 235 
 236 extern inline char * strstr(const char * cs,const char * ct)
     
 237 {
 238 register char * __res __asm__("ax");
 239 __asm__("cld\n\t" \
 240         "movl %4,%%edi\n\t"
 241         "repne\n\t"
 242         "scasb\n\t"
 243         "notl %%ecx\n\t"
 244         "decl %%ecx\n\t"        
 245         "movl %%ecx,%%edx\n"
 246         "1:\tmovl %4,%%edi\n\t"
 247         "movl %%esi,%%eax\n\t"
 248         "movl %%edx,%%ecx\n\t"
 249         "repe\n\t"
 250         "cmpsb\n\t"
 251         "je 2f\n\t"             
 252         "xchgl %%eax,%%esi\n\t"
 253         "incl %%esi\n\t"
 254         "cmpb $0,-1(%%eax)\n\t"
 255         "jne 1b\n\t"
 256         "xorl %%eax,%%eax\n\t"
 257         "2:"
 258         :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct)
 259         :"cx","dx","di","si");
 260 return __res;
 261 }
 262 
 263 extern inline size_t strlen(const char * s)
     
 264 {
 265 register int __res __asm__("cx");
 266 __asm__("cld\n\t"
 267         "repne\n\t"
 268         "scasb\n\t"
 269         "notl %0\n\t"
 270         "decl %0"
 271         :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di");
 272 return __res;
 273 }
 274 
 275 extern char * ___strtok;
 276 
 277 extern inline char * strtok(char * s,const char * ct)
     
 278 {
 279 register char * __res;
 280 __asm__("testl %1,%1\n\t"
 281         "jne 1f\n\t"
 282         "testl %0,%0\n\t"
 283         "je 8f\n\t"
 284         "movl %0,%1\n"
 285         "1:\txorl %0,%0\n\t"
 286         "movl $-1,%%ecx\n\t"
 287         "xorl %%eax,%%eax\n\t"
 288         "cld\n\t"
 289         "movl %4,%%edi\n\t"
 290         "repne\n\t"
 291         "scasb\n\t"
 292         "notl %%ecx\n\t"
 293         "decl %%ecx\n\t"
 294         "je 7f\n\t"                     
 295         "movl %%ecx,%%edx\n"
 296         "2:\tlodsb\n\t"
 297         "testb %%al,%%al\n\t"
 298         "je 7f\n\t"
 299         "movl %4,%%edi\n\t"
 300         "movl %%edx,%%ecx\n\t"
 301         "repne\n\t"
 302         "scasb\n\t"
 303         "je 2b\n\t"
 304         "decl %1\n\t"
 305         "cmpb $0,(%1)\n\t"
 306         "je 7f\n\t"
 307         "movl %1,%0\n"
 308         "3:\tlodsb\n\t"
 309         "testb %%al,%%al\n\t"
 310         "je 5f\n\t"
 311         "movl %4,%%edi\n\t"
 312         "movl %%edx,%%ecx\n\t"
 313         "repne\n\t"
 314         "scasb\n\t"
 315         "jne 3b\n\t"
 316         "decl %1\n\t"
 317         "cmpb $0,(%1)\n\t"
 318         "je 5f\n\t"
 319         "movb $0,(%1)\n\t"
 320         "incl %1\n\t"
 321         "jmp 6f\n"
 322         "5:\txorl %1,%1\n"
 323         "6:\tcmpb $0,(%0)\n\t"
 324         "jne 7f\n\t"
 325         "xorl %0,%0\n"
 326         "7:\ttestl %0,%0\n\t"
 327         "jne 8f\n\t"
 328         "movl %0,%1\n"
 329         "8:"
 330         :"=b" (__res),"=S" (___strtok)
 331         :"0" (___strtok),"1" (s),"g" (ct)
 332         :"ax","cx","dx","di","memory");
 333 return __res;
 334 }
 335 
 336 extern inline void * memcpy(void * to, const void * from, size_t n)
     
 337 {
 338 __asm__("cld\n\t"
 339         "movl %%edx, %%ecx\n\t"
 340         "shrl $2,%%ecx\n\t"
 341         "rep ; movsl\n\t"
 342         "testb $1,%%dl\n\t"
 343         "je 1f\n\t"
 344         "movsb\n"
 345         "1:\ttestb $2,%%dl\n\t"
 346         "je 2f\n\t"
 347         "movsw\n"
 348         "2:\n"
 349         : 
 350         :"d" (n),"D" ((long) to),"S" ((long) from)
 351         : "cx","di","si","memory");
 352 return (to);
 353 }
 354 
 355 extern inline void * memmove(void * dest,const void * src, size_t n)
     
 356 {
 357 if (dest<src)
 358 __asm__("cld\n\t"
 359         "rep\n\t"
 360         "movsb"
 361         : 
 362         :"c" (n),"S" (src),"D" (dest)
 363         :"cx","si","di");
 364 else
 365 __asm__("std\n\t"
 366         "rep\n\t"
 367         "movsb\n\t"
 368         "cld"
 369         : 
 370         :"c" (n),
 371          "S" (n-1+(const char *)src),
 372          "D" (n-1+(char *)dest)
 373         :"cx","si","di","memory");
 374 return dest;
 375 }
 376 
 377 extern inline int memcmp(const void * cs,const void * ct,size_t count)
     
 378 {
 379 register int __res __asm__("ax");
 380 __asm__("cld\n\t"
 381         "repe\n\t"
 382         "cmpsb\n\t"
 383         "je 1f\n\t"
 384         "sbbl %%eax,%%eax\n\t"
 385         "orb $1,%%al\n"
 386         "1:"
 387         :"=a" (__res):"0" (0),"S" (cs),"D" (ct),"c" (count)
 388         :"si","di","cx");
 389 return __res;
 390 }
 391 
 392 extern inline void * memchr(const void * cs,char c,size_t count)
     
 393 {
 394 register void * __res __asm__("di");
 395 if (!count)
 396         return NULL;
 397 __asm__("cld\n\t"
 398         "repne\n\t"
 399         "scasb\n\t"
 400         "je 1f\n\t"
 401         "movl $1,%0\n"
 402         "1:\tdecl %0"
 403         :"=D" (__res):"a" (c),"D" (cs),"c" (count)
 404         :"cx");
 405 return __res;
 406 }
 407 
 408 extern inline void * memset(void * s,char c,size_t count)
     
 409 {
 410 __asm__("cld\n\t"
 411         "rep\n\t"
 412         "stosb"
 413         : 
 414         :"a" (c),"D" (s),"c" (count)
 415         :"cx","di","memory");
 416 return s;
 417 }
 418 
 419 #ifdef __cplusplus
 420 }
 421 #endif
 422 
 423 #endif