linux-bk/lib/string.c
<<
>>
Prefs
   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 <ioe@informatik.tu-chemnitz.de>
  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 * * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>,
  18 *                    Matthew Hawkins <matt@mh.dropbear.id.au>
  19 * -  Kissed strtok() goodbye
  20 */
  21
  22#define IN_STRING_C 1
  23 
  24#include <linux/types.h>
  25#include <linux/string.h>
  26#include <linux/ctype.h>
  27#include <linux/module.h>
  28
  29#ifndef __HAVE_ARCH_STRNICMP
  30/**
  31 * strnicmp - Case insensitive, length-limited string comparison
  32 * @s1: One string
  33 * @s2: The other string
  34 * @len: the maximum number of characters to compare
  35 */
  36int strnicmp(const char *s1, const char *s2, size_t len)
  37{
  38        /* Yes, Virginia, it had better be unsigned */
  39        unsigned char c1, c2;
  40
  41        c1 = 0; c2 = 0;
  42        if (len) {
  43                do {
  44                        c1 = *s1; c2 = *s2;
  45                        s1++; s2++;
  46                        if (!c1)
  47                                break;
  48                        if (!c2)
  49                                break;
  50                        if (c1 == c2)
  51                                continue;
  52                        c1 = tolower(c1);
  53                        c2 = tolower(c2);
  54                        if (c1 != c2)
  55                                break;
  56                } while (--len);
  57        }
  58        return (int)c1 - (int)c2;
  59}
  60
  61EXPORT_SYMBOL(strnicmp);
  62#endif
  63
  64#ifndef __HAVE_ARCH_STRCPY
  65/**
  66 * strcpy - Copy a %NUL terminated string
  67 * @dest: Where to copy the string to
  68 * @src: Where to copy the string from
  69 */
  70char * strcpy(char * dest,const char *src)
  71{
  72        char *tmp = dest;
  73
  74        while ((*dest++ = *src++) != '\0')
  75                /* nothing */;
  76        return tmp;
  77}
  78EXPORT_SYMBOL(strcpy);
  79#endif
  80
  81#ifndef __HAVE_ARCH_STRNCPY
  82/**
  83 * strncpy - Copy a length-limited, %NUL-terminated string
  84 * @dest: Where to copy the string to
  85 * @src: Where to copy the string from
  86 * @count: The maximum number of bytes to copy
  87 *
  88 * The result is not %NUL-terminated if the source exceeds
  89 * @count bytes.
  90 */
  91char * strncpy(char * dest,const char *src,size_t count)
  92{
  93        char *tmp = dest;
  94
  95        while (count) {
  96                if ((*tmp = *src) != 0) src++;
  97                tmp++;
  98                count--;
  99        }
 100        return dest;
 101}
 102EXPORT_SYMBOL(strncpy);
 103#endif
 104
 105#ifndef __HAVE_ARCH_STRLCPY
 106/**
 107 * strlcpy - Copy a %NUL terminated string into a sized buffer
 108 * @dest: Where to copy the string to
 109 * @src: Where to copy the string from
 110 * @size: size of destination buffer
 111 *
 112 * Compatible with *BSD: the result is always a valid
 113 * NUL-terminated string that fits in the buffer (unless,
 114 * of course, the buffer size is zero). It does not pad
 115 * out the result like strncpy() does.
 116 */
 117size_t strlcpy(char *dest, const char *src, size_t size)
 118{
 119        size_t ret = strlen(src);
 120
 121        if (size) {
 122                size_t len = (ret >= size) ? size-1 : ret;
 123                memcpy(dest, src, len);
 124                dest[len] = '\0';
 125        }
 126        return ret;
 127}
 128EXPORT_SYMBOL(strlcpy);
 129#endif
 130
 131#ifndef __HAVE_ARCH_STRCAT
 132/**
 133 * strcat - Append one %NUL-terminated string to another
 134 * @dest: The string to be appended to
 135 * @src: The string to append to it
 136 */
 137char * strcat(char * dest, const char * src)
 138{
 139        char *tmp = dest;
 140
 141        while (*dest)
 142                dest++;
 143        while ((*dest++ = *src++) != '\0')
 144                ;
 145
 146        return tmp;
 147}
 148EXPORT_SYMBOL(strcat);
 149#endif
 150
 151#ifndef __HAVE_ARCH_STRNCAT
 152/**
 153 * strncat - Append a length-limited, %NUL-terminated string to another
 154 * @dest: The string to be appended to
 155 * @src: The string to append to it
 156 * @count: The maximum numbers of bytes to copy
 157 *
 158 * Note that in contrast to strncpy, strncat ensures the result is
 159 * terminated.
 160 */
 161char * strncat(char *dest, const char *src, size_t count)
 162{
 163        char *tmp = dest;
 164
 165        if (count) {
 166                while (*dest)
 167                        dest++;
 168                while ((*dest++ = *src++) != 0) {
 169                        if (--count == 0) {
 170                                *dest = '\0';
 171                                break;
 172                        }
 173                }
 174        }
 175
 176        return tmp;
 177}
 178EXPORT_SYMBOL(strncat);
 179#endif
 180
 181#ifndef __HAVE_ARCH_STRLCAT
 182/**
 183 * strlcat - Append a length-limited, %NUL-terminated string to another
 184 * @dest: The string to be appended to
 185 * @src: The string to append to it
 186 * @count: The size of the destination buffer.
 187 */
 188size_t strlcat(char *dest, const char *src, size_t count)
 189{
 190        size_t dsize = strlen(dest);
 191        size_t len = strlen(src);
 192        size_t res = dsize + len;
 193
 194        /* This would be a bug */
 195        BUG_ON(dsize >= count);
 196
 197        dest += dsize;
 198        count -= dsize;
 199        if (len >= count)
 200                len = count-1;
 201        memcpy(dest, src, len);
 202        dest[len] = 0;
 203        return res;
 204}
 205EXPORT_SYMBOL(strlcat);
 206#endif
 207
 208#ifndef __HAVE_ARCH_STRCMP
 209/**
 210 * strcmp - Compare two strings
 211 * @cs: One string
 212 * @ct: Another string
 213 */
 214int strcmp(const char * cs,const char * ct)
 215{
 216        register signed char __res;
 217
 218        while (1) {
 219                if ((__res = *cs - *ct++) != 0 || !*cs++)
 220                        break;
 221        }
 222
 223        return __res;
 224}
 225EXPORT_SYMBOL(strcmp);
 226#endif
 227
 228#ifndef __HAVE_ARCH_STRNCMP
 229/**
 230 * strncmp - Compare two length-limited strings
 231 * @cs: One string
 232 * @ct: Another string
 233 * @count: The maximum number of bytes to compare
 234 */
 235int strncmp(const char * cs,const char * ct,size_t count)
 236{
 237        register signed char __res = 0;
 238
 239        while (count) {
 240                if ((__res = *cs - *ct++) != 0 || !*cs++)
 241                        break;
 242                count--;
 243        }
 244
 245        return __res;
 246}
 247EXPORT_SYMBOL(strncmp);
 248#endif
 249
 250#ifndef __HAVE_ARCH_STRCHR
 251/**
 252 * strchr - Find the first occurrence of a character in a string
 253 * @s: The string to be searched
 254 * @c: The character to search for
 255 */
 256char * strchr(const char * s, int c)
 257{
 258        for(; *s != (char) c; ++s)
 259                if (*s == '\0')
 260                        return NULL;
 261        return (char *) s;
 262}
 263EXPORT_SYMBOL(strchr);
 264#endif
 265
 266#ifndef __HAVE_ARCH_STRRCHR
 267/**
 268 * strrchr - Find the last occurrence of a character in a string
 269 * @s: The string to be searched
 270 * @c: The character to search for
 271 */
 272char * strrchr(const char * s, int c)
 273{
 274       const char *p = s + strlen(s);
 275       do {
 276           if (*p == (char)c)
 277               return (char *)p;
 278       } while (--p >= s);
 279       return NULL;
 280}
 281EXPORT_SYMBOL(strrchr);
 282#endif
 283
 284#ifndef __HAVE_ARCH_STRNCHR
 285/**
 286 * strnchr - Find a character in a length limited string
 287 * @s: The string to be searched
 288 * @count: The number of characters to be searched
 289 * @c: The character to search for
 290 */
 291char *strnchr(const char *s, size_t count, int c)
 292{
 293        for (; count-- && *s != '\0'; ++s)
 294                if (*s == (char) c)
 295                        return (char *) s;
 296        return NULL;
 297}
 298EXPORT_SYMBOL(strnchr);
 299#endif
 300
 301#ifndef __HAVE_ARCH_STRLEN
 302/**
 303 * strlen - Find the length of a string
 304 * @s: The string to be sized
 305 */
 306size_t strlen(const char * s)
 307{
 308        const char *sc;
 309
 310        for (sc = s; *sc != '\0'; ++sc)
 311                /* nothing */;
 312        return sc - s;
 313}
 314EXPORT_SYMBOL(strlen);
 315#endif
 316
 317#ifndef __HAVE_ARCH_STRNLEN
 318/**
 319 * strnlen - Find the length of a length-limited string
 320 * @s: The string to be sized
 321 * @count: The maximum number of bytes to search
 322 */
 323size_t strnlen(const char * s, size_t count)
 324{
 325        const char *sc;
 326
 327        for (sc = s; count-- && *sc != '\0'; ++sc)
 328                /* nothing */;
 329        return sc - s;
 330}
 331EXPORT_SYMBOL(strnlen);
 332#endif
 333
 334#ifndef __HAVE_ARCH_STRSPN
 335/**
 336 * strspn - Calculate the length of the initial substring of @s which only
 337 *      contain letters in @accept
 338 * @s: The string to be searched
 339 * @accept: The string to search for
 340 */
 341size_t strspn(const char *s, const char *accept)
 342{
 343        const char *p;
 344        const char *a;
 345        size_t count = 0;
 346
 347        for (p = s; *p != '\0'; ++p) {
 348                for (a = accept; *a != '\0'; ++a) {
 349                        if (*p == *a)
 350                                break;
 351                }
 352                if (*a == '\0')
 353                        return count;
 354                ++count;
 355        }
 356
 357        return count;
 358}
 359
 360EXPORT_SYMBOL(strspn);
 361#endif
 362
 363/**
 364 * strcspn - Calculate the length of the initial substring of @s which does
 365 *      not contain letters in @reject
 366 * @s: The string to be searched
 367 * @reject: The string to avoid
 368 */
 369size_t strcspn(const char *s, const char *reject)
 370{
 371        const char *p;
 372        const char *r;
 373        size_t count = 0;
 374
 375        for (p = s; *p != '\0'; ++p) {
 376                for (r = reject; *r != '\0'; ++r) {
 377                        if (*p == *r)
 378                                return count;
 379                }
 380                ++count;
 381        }
 382
 383        return count;
 384}       
 385EXPORT_SYMBOL(strcspn);
 386
 387#ifndef __HAVE_ARCH_STRPBRK
 388/**
 389 * strpbrk - Find the first occurrence of a set of characters
 390 * @cs: The string to be searched
 391 * @ct: The characters to search for
 392 */
 393char * strpbrk(const char * cs,const char * ct)
 394{
 395        const char *sc1,*sc2;
 396
 397        for( sc1 = cs; *sc1 != '\0'; ++sc1) {
 398                for( sc2 = ct; *sc2 != '\0'; ++sc2) {
 399                        if (*sc1 == *sc2)
 400                                return (char *) sc1;
 401                }
 402        }
 403        return NULL;
 404}
 405EXPORT_SYMBOL(strpbrk);
 406#endif
 407
 408#ifndef __HAVE_ARCH_STRSEP
 409/**
 410 * strsep - Split a string into tokens
 411 * @s: The string to be searched
 412 * @ct: The characters to search for
 413 *
 414 * strsep() updates @s to point after the token, ready for the next call.
 415 *
 416 * It returns empty tokens, too, behaving exactly like the libc function
 417 * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
 418 * Same semantics, slimmer shape. ;)
 419 */
 420char * strsep(char **s, const char *ct)
 421{
 422        char *sbegin = *s, *end;
 423
 424        if (sbegin == NULL)
 425                return NULL;
 426
 427        end = strpbrk(sbegin, ct);
 428        if (end)
 429                *end++ = '\0';
 430        *s = end;
 431
 432        return sbegin;
 433}
 434
 435EXPORT_SYMBOL(strsep);
 436#endif
 437
 438#ifndef __HAVE_ARCH_MEMSET
 439/**
 440 * memset - Fill a region of memory with the given value
 441 * @s: Pointer to the start of the area.
 442 * @c: The byte to fill the area with
 443 * @count: The size of the area.
 444 *
 445 * Do not use memset() to access IO space, use memset_io() instead.
 446 */
 447void * memset(void * s,int c,size_t count)
 448{
 449        char *xs = (char *) s;
 450
 451        while (count--)
 452                *xs++ = c;
 453
 454        return s;
 455}
 456EXPORT_SYMBOL(memset);
 457#endif
 458
 459#ifndef __HAVE_ARCH_BCOPY
 460/**
 461 * bcopy - Copy one area of memory to another
 462 * @srcp: Where to copy from
 463 * @destp: Where to copy to
 464 * @count: The size of the area.
 465 *
 466 * Note that this is the same as memcpy(), with the arguments reversed.
 467 * memcpy() is the standard, bcopy() is a legacy BSD function.
 468 *
 469 * You should not use this function to access IO space, use memcpy_toio()
 470 * or memcpy_fromio() instead.
 471 */
 472void bcopy(const void * srcp, void * destp, size_t count)
 473{
 474        const char *src = srcp;
 475        char *dest = destp;
 476
 477        while (count--)
 478                *dest++ = *src++;
 479}
 480EXPORT_SYMBOL(bcopy);
 481#endif
 482
 483#ifndef __HAVE_ARCH_MEMCPY
 484/**
 485 * memcpy - Copy one area of memory to another
 486 * @dest: Where to copy to
 487 * @src: Where to copy from
 488 * @count: The size of the area.
 489 *
 490 * You should not use this function to access IO space, use memcpy_toio()
 491 * or memcpy_fromio() instead.
 492 */
 493void * memcpy(void * dest,const void *src,size_t count)
 494{
 495        char *tmp = (char *) dest, *s = (char *) src;
 496
 497        while (count--)
 498                *tmp++ = *s++;
 499
 500        return dest;
 501}
 502EXPORT_SYMBOL(memcpy);
 503#endif
 504
 505#ifndef __HAVE_ARCH_MEMMOVE
 506/**
 507 * memmove - Copy one area of memory to another
 508 * @dest: Where to copy to
 509 * @src: Where to copy from
 510 * @count: The size of the area.
 511 *
 512 * Unlike memcpy(), memmove() copes with overlapping areas.
 513 */
 514void * memmove(void * dest,const void *src,size_t count)
 515{
 516        char *tmp, *s;
 517
 518        if (dest <= src) {
 519                tmp = (char *) dest;
 520                s = (char *) src;
 521                while (count--)
 522                        *tmp++ = *s++;
 523                }
 524        else {
 525                tmp = (char *) dest + count;
 526                s = (char *) src + count;
 527                while (count--)
 528                        *--tmp = *--s;
 529                }
 530
 531        return dest;
 532}
 533EXPORT_SYMBOL(memmove);
 534#endif
 535
 536#ifndef __HAVE_ARCH_MEMCMP
 537/**
 538 * memcmp - Compare two areas of memory
 539 * @cs: One area of memory
 540 * @ct: Another area of memory
 541 * @count: The size of the area.
 542 */
 543int memcmp(const void * cs,const void * ct,size_t count)
 544{
 545        const unsigned char *su1, *su2;
 546        int res = 0;
 547
 548        for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
 549                if ((res = *su1 - *su2) != 0)
 550                        break;
 551        return res;
 552}
 553EXPORT_SYMBOL(memcmp);
 554#endif
 555
 556#ifndef __HAVE_ARCH_MEMSCAN
 557/**
 558 * memscan - Find a character in an area of memory.
 559 * @addr: The memory area
 560 * @c: The byte to search for
 561 * @size: The size of the area.
 562 *
 563 * returns the address of the first occurrence of @c, or 1 byte past
 564 * the area if @c is not found
 565 */
 566void * memscan(void * addr, int c, size_t size)
 567{
 568        unsigned char * p = (unsigned char *) addr;
 569
 570        while (size) {
 571                if (*p == c)
 572                        return (void *) p;
 573                p++;
 574                size--;
 575        }
 576        return (void *) p;
 577}
 578EXPORT_SYMBOL(memscan);
 579#endif
 580
 581#ifndef __HAVE_ARCH_STRSTR
 582/**
 583 * strstr - Find the first substring in a %NUL terminated string
 584 * @s1: The string to be searched
 585 * @s2: The string to search for
 586 */
 587char * strstr(const char * s1,const char * s2)
 588{
 589        int l1, l2;
 590
 591        l2 = strlen(s2);
 592        if (!l2)
 593                return (char *) s1;
 594        l1 = strlen(s1);
 595        while (l1 >= l2) {
 596                l1--;
 597                if (!memcmp(s1,s2,l2))
 598                        return (char *) s1;
 599                s1++;
 600        }
 601        return NULL;
 602}
 603EXPORT_SYMBOL(strstr);
 604#endif
 605
 606#ifndef __HAVE_ARCH_MEMCHR
 607/**
 608 * memchr - Find a character in an area of memory.
 609 * @s: The memory area
 610 * @c: The byte to search for
 611 * @n: The size of the area.
 612 *
 613 * returns the address of the first occurrence of @c, or %NULL
 614 * if @c is not found
 615 */
 616void *memchr(const void *s, int c, size_t n)
 617{
 618        const unsigned char *p = s;
 619        while (n-- != 0) {
 620                if ((unsigned char)c == *p++) {
 621                        return (void *)(p-1);
 622                }
 623        }
 624        return NULL;
 625}
 626EXPORT_SYMBOL(memchr);
 627#endif
 628
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.