Annotation of qemu/roms/openbios/libc/string.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  linux/lib/string.c
                      3:  *
                      4:  *  Copyright (C) 1991, 1992  Linus Torvalds
                      5:  */
                      6: 
                      7: /*
                      8:  * stupid library routines.. The optimized versions should generally be found
                      9:  * as inline code in <asm-xx/string.h>
                     10:  *
                     11:  * These are buggy as well..
                     12:  *
                     13:  * * Fri Jun 25 1999, Ingo Oeser <[email protected]>
                     14:  * -  Added strsep() which will replace strtok() soon (because strsep() is
                     15:  *    reentrant and should be faster). Use only strsep() in new code, please.
                     16:  */
                     17: 
                     18: #include "config.h"
                     19: #include "libc/string.h"
                     20: #include "libc/stdlib.h"
                     21: 
                     22: /**
                     23:  * strnicmp - Case insensitive, length-limited string comparison
                     24:  * @s1: One string
                     25:  * @s2: The other string
                     26:  * @len: the maximum number of characters to compare
                     27:  */
                     28: int strnicmp(const char *s1, const char *s2, size_t len)
                     29: {
                     30:        /* Yes, Virginia, it had better be unsigned */
                     31:        unsigned char c1, c2;
                     32: 
                     33:        c1 = 0; c2 = 0;
                     34:        if (len) {
                     35:                do {
                     36:                        c1 = *s1; c2 = *s2;
                     37:                        s1++; s2++;
                     38:                        if (!c1)
                     39:                                break;
                     40:                        if (!c2)
                     41:                                break;
                     42:                        if (c1 == c2)
                     43:                                continue;
                     44:                        c1 = tolower(c1);
                     45:                        c2 = tolower(c2);
                     46:                        if (c1 != c2)
                     47:                                break;
                     48:                } while (--len);
                     49:        }
                     50:        return (int)c1 - (int)c2;
                     51: }
                     52: 
                     53: /**
                     54:  * strcpy - Copy a %NUL terminated string
                     55:  * @dest: Where to copy the string to
                     56:  * @src: Where to copy the string from
                     57:  */
                     58: char * strcpy(char * dest,const char *src)
                     59: {
                     60:        char *tmp = dest;
                     61: 
                     62:        while ((*dest++ = *src++) != '\0')
                     63:                /* nothing */;
                     64:        return tmp;
                     65: }
                     66: 
                     67: /**
                     68:  * strncpy - Copy a length-limited, %NUL-terminated string
                     69:  * @dest: Where to copy the string to
                     70:  * @src: Where to copy the string from
                     71:  * @count: The maximum number of bytes to copy
                     72:  *
                     73:  * Note that unlike userspace strncpy, this does not %NUL-pad the buffer.
                     74:  * However, the result is not %NUL-terminated if the source exceeds
                     75:  * @count bytes.
                     76:  */
                     77: char * strncpy(char * dest,const char *src,size_t count)
                     78: {
                     79:        char *tmp = dest;
                     80: 
                     81:        while (count-- && (*dest++ = *src++) != '\0')
                     82:                /* nothing */;
                     83: 
                     84:        return tmp;
                     85: }
                     86: 
                     87: /**
                     88:  * strcat - Append one %NUL-terminated string to another
                     89:  * @dest: The string to be appended to
                     90:  * @src: The string to append to it
                     91:  */
                     92: char * strcat(char * dest, const char * src)
                     93: {
                     94:        char *tmp = dest;
                     95: 
                     96:        while (*dest)
                     97:                dest++;
                     98:        while ((*dest++ = *src++) != '\0')
                     99:                ;
                    100: 
                    101:        return tmp;
                    102: }
                    103: 
                    104: /**
                    105:  * strncat - Append a length-limited, %NUL-terminated string to another
                    106:  * @dest: The string to be appended to
                    107:  * @src: The string to append to it
                    108:  * @count: The maximum numbers of bytes to copy
                    109:  *
                    110:  * Note that in contrast to strncpy, strncat ensures the result is
                    111:  * terminated.
                    112:  */
                    113: char * strncat(char *dest, const char *src, size_t count)
                    114: {
                    115:        char *tmp = dest;
                    116: 
                    117:        if (count) {
                    118:                while (*dest)
                    119:                        dest++;
                    120:                while ((*dest++ = *src++)) {
                    121:                        if (--count == 0) {
                    122:                                *dest = '\0';
                    123:                                break;
                    124:                        }
                    125:                }
                    126:        }
                    127: 
                    128:        return tmp;
                    129: }
                    130: 
                    131: /**
                    132:  * strcmp - Compare two strings
                    133:  * @cs: One string
                    134:  * @ct: Another string
                    135:  */
                    136: int strcmp(const char * cs,const char * ct)
                    137: {
                    138:        register signed char __res;
                    139: 
                    140:        while (1) {
                    141:                if ((__res = *cs - *ct++) != 0 || !*cs++)
                    142:                        break;
                    143:        }
                    144: 
                    145:        return __res;
                    146: }
                    147: 
                    148: /**
                    149:  * strncmp - Compare two length-limited strings
                    150:  * @cs: One string
                    151:  * @ct: Another string
                    152:  * @count: The maximum number of bytes to compare
                    153:  */
                    154: int strncmp(const char * cs,const char * ct,size_t count)
                    155: {
                    156:        register signed char __res = 0;
                    157: 
                    158:        while (count) {
                    159:                if ((__res = *cs - *ct++) != 0 || !*cs++)
                    160:                        break;
                    161:                count--;
                    162:        }
                    163: 
                    164:        return __res;
                    165: }
                    166: 
                    167: 
                    168: /**
                    169:  * strchr - Find the first occurrence of a character in a string
                    170:  * @s: The string to be searched
                    171:  * @c: The character to search for
                    172:  */
                    173: char * strchr(const char * s, int c)
                    174: {
                    175:        for(; *s != (char) c; ++s)
                    176:                if (*s == '\0')
                    177:                        return NULL;
                    178:        return (char *) s;
                    179: }
                    180: 
                    181: /**
                    182:  * strrchr - Find the last occurrence of a character in a string
                    183:  * @s: The string to be searched
                    184:  * @c: The character to search for
                    185:  */
                    186: char * strrchr(const char * s, int c)
                    187: {
                    188:        const char *p = s + strlen(s);
                    189:        do {
                    190:            if (*p == (char)c)
                    191:                return (char *)p;
                    192:        } while (--p >= s);
                    193:        return NULL;
                    194: }
                    195: 
                    196: /**
                    197:  * strlen - Find the length of a string
                    198:  * @s: The string to be sized
                    199:  */
                    200: size_t strlen(const char * s)
                    201: {
                    202:        const char *sc;
                    203: 
                    204:        for (sc = s; *sc != '\0'; ++sc)
                    205:                /* nothing */;
                    206:        return sc - s;
                    207: }
                    208: 
                    209: /**
                    210:  * strnlen - Find the length of a length-limited string
                    211:  * @s: The string to be sized
                    212:  * @count: The maximum number of bytes to search
                    213:  */
                    214: size_t strnlen(const char * s, size_t count)
                    215: {
                    216:        const char *sc;
                    217: 
                    218:        for (sc = s; count-- && *sc != '\0'; ++sc)
                    219:                /* nothing */;
                    220:        return sc - s;
                    221: }
                    222: 
                    223: /**
                    224:  * strpbrk - Find the first occurrence of a set of characters
                    225:  * @cs: The string to be searched
                    226:  * @ct: The characters to search for
                    227:  */
                    228: char * strpbrk(const char * cs,const char * ct)
                    229: {
                    230:        const char *sc1,*sc2;
                    231: 
                    232:        for( sc1 = cs; *sc1 != '\0'; ++sc1) {
                    233:                for( sc2 = ct; *sc2 != '\0'; ++sc2) {
                    234:                        if (*sc1 == *sc2)
                    235:                                return (char *) sc1;
                    236:                }
                    237:        }
                    238:        return NULL;
                    239: }
                    240: 
                    241: /**
                    242:  * strsep - Split a string into tokens
                    243:  * @s: The string to be searched
                    244:  * @ct: The characters to search for
                    245:  *
                    246:  * strsep() updates @s to point after the token, ready for the next call.
                    247:  *
                    248:  * It returns empty tokens, too, behaving exactly like the libc function
                    249:  * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
                    250:  * Same semantics, slimmer shape. ;)
                    251:  */
                    252: char * strsep(char **s, const char *ct)
                    253: {
                    254:        char *sbegin = *s, *end;
                    255: 
                    256:        if (sbegin == NULL)
                    257:                return NULL;
                    258: 
                    259:        end = strpbrk(sbegin, ct);
                    260:        if (end)
                    261:                *end++ = '\0';
                    262:        *s = end;
                    263: 
                    264:        return sbegin;
                    265: }
                    266: 
                    267: /**
                    268:  * memset - Fill a region of memory with the given value
                    269:  * @s: Pointer to the start of the area.
                    270:  * @c: The byte to fill the area with
                    271:  * @count: The size of the area.
                    272:  *
                    273:  * Do not use memset() to access IO space, use memset_io() instead.
                    274:  */
                    275: void * memset(void * s,int c,size_t count)
                    276: {
                    277:        char *xs = (char *) s;
                    278: 
                    279:        while (count--)
                    280:                *xs++ = c;
                    281: 
                    282:        return s;
                    283: }
                    284: 
                    285: /**
                    286:  * memcpy - Copy one area of memory to another
                    287:  * @dest: Where to copy to
                    288:  * @src: Where to copy from
                    289:  * @count: The size of the area.
                    290:  *
                    291:  * You should not use this function to access IO space, use memcpy_toio()
                    292:  * or memcpy_fromio() instead.
                    293:  */
                    294: void * memcpy(void * dest,const void *src,size_t count)
                    295: {
                    296:        char *tmp = (char *) dest, *s = (char *) src;
                    297: 
                    298:        while (count--)
                    299:                *tmp++ = *s++;
                    300: 
                    301:        return dest;
                    302: }
                    303: 
                    304: /**
                    305:  * memmove - Copy one area of memory to another
                    306:  * @dest: Where to copy to
                    307:  * @src: Where to copy from
                    308:  * @count: The size of the area.
                    309:  *
                    310:  * Unlike memcpy(), memmove() copes with overlapping areas.
                    311:  */
                    312: void * memmove(void * dest,const void *src,size_t count)
                    313: {
                    314:        char *tmp, *s;
                    315: 
                    316:        if (dest <= src) {
                    317:                tmp = (char *) dest;
                    318:                s = (char *) src;
                    319:                while (count--)
                    320:                        *tmp++ = *s++;
                    321:                }
                    322:        else {
                    323:                tmp = (char *) dest + count;
                    324:                s = (char *) src + count;
                    325:                while (count--)
                    326:                        *--tmp = *--s;
                    327:                }
                    328: 
                    329:        return dest;
                    330: }
                    331: 
                    332: /**
                    333:  * memcmp - Compare two areas of memory
                    334:  * @cs: One area of memory
                    335:  * @ct: Another area of memory
                    336:  * @count: The size of the area.
                    337:  */
                    338: int memcmp(const void * cs,const void * ct,size_t count)
                    339: {
                    340:        const unsigned char *su1, *su2;
                    341:        int res = 0;
                    342: 
                    343:        for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
                    344:                if ((res = *su1 - *su2) != 0)
                    345:                        break;
                    346:        return res;
                    347: }
                    348: 
                    349: char *
                    350: strdup( const char *str )
                    351: {
                    352:        char *p;
                    353:        if( !str )
                    354:                return NULL;
                    355:        p = malloc( strlen(str) + 1 );
                    356:        strcpy( p, str );
                    357:        return p;
                    358: }
                    359: 
                    360: int
                    361: strcasecmp( const char *cs, const char *ct )
                    362: {
                    363:        register signed char __res;
                    364: 
                    365:        while (1) {
                    366:                char ch1 = toupper(*cs), ch2 = toupper(*ct);
                    367:                ct++;
                    368:                if ((__res = ch1 - ch2) != 0 || !*cs++)
                    369:                        break;
                    370:        }
                    371:        return __res;
                    372: }
                    373: 
                    374: int
                    375: strncasecmp( const char *cs, const char *ct, size_t count )
                    376: {
                    377:        register signed char __res = 0;
                    378: 
                    379:        while (count--) {
                    380:                char ch1 = toupper(*cs), ch2 = toupper(*ct);
                    381:                ct++;
                    382:                if ((__res = ch1 - ch2) != 0 || !*cs++)
                    383:                        break;
                    384:        }
                    385:        return __res;
                    386: }
                    387: 

unix.superglobalmegacorp.com

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