Annotation of linux/include/string.h, revision 1.1

1.1     ! root        1: #ifndef _STRING_H_
        !             2: #define _STRING_H_
        !             3: 
        !             4: #ifndef NULL
        !             5: #define NULL ((void *) 0)
        !             6: #endif
        !             7: 
        !             8: #ifndef _SIZE_T
        !             9: #define _SIZE_T
        !            10: typedef unsigned int size_t;
        !            11: #endif
        !            12: 
        !            13: extern char * strerror(int errno);
        !            14: 
        !            15: /*
        !            16:  * This string-include defines all string functions as inline
        !            17:  * functions. Use gcc. It also assumes ds=es=data space, this should be
        !            18:  * normal. Most of the string-functions are rather heavily hand-optimized,
        !            19:  * see especially strtok,strstr,str[c]spn. They should work, but are not
        !            20:  * very easy to understand. Everything is done entirely within the register
        !            21:  * set, making the functions fast and clean. String instructions have been
        !            22:  * used through-out, making for "slightly" unclear code :-)
        !            23:  *
        !            24:  *             (C) 1991 Linus Torvalds
        !            25:  */
        !            26:  
        !            27: extern inline char * strcpy(char * dest,const char *src)
        !            28: {
        !            29: __asm__("cld\n"
        !            30:        "1:\tlodsb\n\t"
        !            31:        "stosb\n\t"
        !            32:        "testb %%al,%%al\n\t"
        !            33:        "jne 1b"
        !            34:        ::"S" (src),"D" (dest):"si","di","ax");
        !            35: return dest;
        !            36: }
        !            37: 
        !            38: extern inline char * strncpy(char * dest,const char *src,int 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:        ::"S" (src),"D" (dest),"c" (count):"si","di","ax","cx");
        !            51: return dest;
        !            52: }
        !            53: 
        !            54: extern inline char * strcat(char * dest,const char * src)
        !            55: {
        !            56: __asm__("cld\n\t"
        !            57:        "repne\n\t"
        !            58:        "scasb\n\t"
        !            59:        "decl %1\n"
        !            60:        "1:\tlodsb\n\t"
        !            61:        "stosb\n\t"
        !            62:        "testb %%al,%%al\n\t"
        !            63:        "jne 1b"
        !            64:        ::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
        !            65: return dest;
        !            66: }
        !            67: 
        !            68: extern inline char * strncat(char * dest,const char * src,int count)
        !            69: {
        !            70: __asm__("cld\n\t"
        !            71:        "repne\n\t"
        !            72:        "scasb\n\t"
        !            73:        "decl %1\n\t"
        !            74:        "movl %4,%3\n"
        !            75:        "1:\tdecl %3\n\t"
        !            76:        "js 2f\n\t"
        !            77:        "lodsb\n\t"
        !            78:        "stosb\n\t"
        !            79:        "testb %%al,%%al\n\t"
        !            80:        "jne 1b\n"
        !            81:        "2:\txorl %2,%2\n\t"
        !            82:        "stosb"
        !            83:        ::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
        !            84:        :"si","di","ax","cx");
        !            85: return dest;
        !            86: }
        !            87: 
        !            88: extern inline int strcmp(const char * cs,const char * ct)
        !            89: {
        !            90: register int __res __asm__("ax");
        !            91: __asm__("cld\n"
        !            92:        "1:\tlodsb\n\t"
        !            93:        "scasb\n\t"
        !            94:        "jne 2f\n\t"
        !            95:        "testb %%al,%%al\n\t"
        !            96:        "jne 1b\n\t"
        !            97:        "xorl %%eax,%%eax\n\t"
        !            98:        "jmp 3f\n"
        !            99:        "2:\tmovl $1,%%eax\n\t"
        !           100:        "jl 3f\n\t"
        !           101:        "negl %%eax\n"
        !           102:        "3:"
        !           103:        :"=a" (__res):"D" (cs),"S" (ct):"si","di");
        !           104: return __res;
        !           105: }
        !           106: 
        !           107: extern inline int strncmp(const char * cs,const char * ct,int count)
        !           108: {
        !           109: register int __res __asm__("ax");
        !           110: __asm__("cld\n"
        !           111:        "1:\tdecl %3\n\t"
        !           112:        "js 2f\n\t"
        !           113:        "lodsb\n\t"
        !           114:        "scasb\n\t"
        !           115:        "jne 3f\n\t"
        !           116:        "testb %%al,%%al\n\t"
        !           117:        "jne 1b\n"
        !           118:        "2:\txorl %%eax,%%eax\n\t"
        !           119:        "jmp 4f\n"
        !           120:        "3:\tmovl $1,%%eax\n\t"
        !           121:        "jl 4f\n\t"
        !           122:        "negl %%eax\n"
        !           123:        "4:"
        !           124:        :"=a" (__res):"D" (cs),"S" (ct),"c" (count):"si","di","cx");
        !           125: return __res;
        !           126: }
        !           127: 
        !           128: extern inline char * strchr(const char * s,char c)
        !           129: {
        !           130: register char * __res __asm__("ax");
        !           131: __asm__("cld\n\t"
        !           132:        "movb %%al,%%ah\n"
        !           133:        "1:\tlodsb\n\t"
        !           134:        "cmpb %%ah,%%al\n\t"
        !           135:        "je 2f\n\t"
        !           136:        "testb %%al,%%al\n\t"
        !           137:        "jne 1b\n\t"
        !           138:        "movl $1,%1\n"
        !           139:        "2:\tmovl %1,%0\n\t"
        !           140:        "decl %0"
        !           141:        :"=a" (__res):"S" (s),"0" (c):"si");
        !           142: return __res;
        !           143: }
        !           144: 
        !           145: extern inline char * strrchr(const char * s,char c)
        !           146: {
        !           147: register char * __res __asm__("dx");
        !           148: __asm__("cld\n\t"
        !           149:        "movb %%al,%%ah\n"
        !           150:        "1:\tlodsb\n\t"
        !           151:        "cmpb %%ah,%%al\n\t"
        !           152:        "jne 2f\n\t"
        !           153:        "movl %%esi,%0\n\t"
        !           154:        "decl %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 int 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 int 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"        /* NOTE! This also sets Z if searchstring='' */
        !           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"             /* also works for empty string, see above */
        !           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 int 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 __asm__("si");
        !           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"                     /* empty delimeter-string */
        !           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");
        !           333: return __res;
        !           334: }
        !           335: 
        !           336: extern inline void * memcpy(void * dest,const void * src, int n)
        !           337: {
        !           338: __asm__("cld\n\t"
        !           339:        "rep\n\t"
        !           340:        "movsb"
        !           341:        ::"c" (n),"S" (src),"D" (dest)
        !           342:        :"cx","si","di");
        !           343: return dest;
        !           344: }
        !           345: 
        !           346: extern inline void * memmove(void * dest,const void * src, int n)
        !           347: {
        !           348: if (dest<src)
        !           349: __asm__("cld\n\t"
        !           350:        "rep\n\t"
        !           351:        "movsb"
        !           352:        ::"c" (n),"S" (src),"D" (dest)
        !           353:        :"cx","si","di");
        !           354: else
        !           355: __asm__("std\n\t"
        !           356:        "rep\n\t"
        !           357:        "movsb"
        !           358:        ::"c" (n),"S" (src+n-1),"D" (dest+n-1)
        !           359:        :"cx","si","di");
        !           360: return dest;
        !           361: }
        !           362: 
        !           363: extern inline int memcmp(const void * cs,const void * ct,int count)
        !           364: {
        !           365: register int __res __asm__("ax");
        !           366: __asm__("cld\n\t"
        !           367:        "repe\n\t"
        !           368:        "cmpsb\n\t"
        !           369:        "je 1f\n\t"
        !           370:        "movl $1,%%eax\n\t"
        !           371:        "jl 1f\n\t"
        !           372:        "negl %%eax\n"
        !           373:        "1:"
        !           374:        :"=a" (__res):"0" (0),"D" (cs),"S" (ct),"c" (count)
        !           375:        :"si","di","cx");
        !           376: return __res;
        !           377: }
        !           378: 
        !           379: extern inline void * memchr(const void * cs,char c,int count)
        !           380: {
        !           381: register void * __res __asm__("di");
        !           382: if (!count)
        !           383:        return NULL;
        !           384: __asm__("cld\n\t"
        !           385:        "repne\n\t"
        !           386:        "scasb\n\t"
        !           387:        "je 1f\n\t"
        !           388:        "movl $1,%0\n"
        !           389:        "1:\tdecl %0"
        !           390:        :"=D" (__res):"a" (c),"D" (cs),"c" (count)
        !           391:        :"cx");
        !           392: return __res;
        !           393: }
        !           394: 
        !           395: extern inline void * memset(void * s,char c,int count)
        !           396: {
        !           397: __asm__("cld\n\t"
        !           398:        "rep\n\t"
        !           399:        "stosb"
        !           400:        ::"a" (c),"D" (s),"c" (count)
        !           401:        :"cx","di");
        !           402: return s;
        !           403: }
        !           404: 
        !           405: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.