Rev 6936 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1966 | serge | 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 |
||
10 | * |
||
11 | * These are buggy as well.. |
||
12 | * |
||
13 | * * Fri Jun 25 1999, Ingo Oeser |
||
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 |
||
18 | * Matthew Hawkins |
||
19 | * - Kissed strtok() goodbye |
||
20 | */ |
||
21 | |||
22 | #include |
||
23 | #include |
||
24 | #include |
||
6934 | serge | 25 | #include |
26 | #include |
||
27 | #include |
||
28 | #include |
||
1966 | serge | 29 | |
30 | |||
6936 | serge | 31 | #ifndef __HAVE_ARCH_STRNCPY |
32 | /** |
||
33 | * strncpy - Copy a length-limited, C-string |
||
34 | * @dest: Where to copy the string to |
||
35 | * @src: Where to copy the string from |
||
36 | * @count: The maximum number of bytes to copy |
||
37 | * |
||
38 | * The result is not %NUL-terminated if the source exceeds |
||
39 | * @count bytes. |
||
40 | * |
||
41 | * In the case where the length of @src is less than that of |
||
42 | * count, the remainder of @dest will be padded with %NUL. |
||
43 | * |
||
44 | */ |
||
45 | char *strncpy(char *dest, const char *src, size_t count) |
||
46 | { |
||
47 | char *tmp = dest; |
||
6934 | serge | 48 | |
6936 | serge | 49 | while (count) { |
50 | if ((*tmp = *src) != 0) |
||
51 | src++; |
||
52 | tmp++; |
||
53 | count--; |
||
54 | } |
||
55 | return dest; |
||
56 | } |
||
57 | EXPORT_SYMBOL(strncpy); |
||
58 | #endif |
||
59 | |||
1966 | serge | 60 | #ifndef __HAVE_ARCH_STRLCPY |
61 | /** |
||
5270 | serge | 62 | * strlcpy - Copy a C-string into a sized buffer |
1966 | serge | 63 | * @dest: Where to copy the string to |
64 | * @src: Where to copy the string from |
||
65 | * @size: size of destination buffer |
||
66 | * |
||
67 | * Compatible with *BSD: the result is always a valid |
||
68 | * NUL-terminated string that fits in the buffer (unless, |
||
69 | * of course, the buffer size is zero). It does not pad |
||
70 | * out the result like strncpy() does. |
||
71 | */ |
||
72 | size_t strlcpy(char *dest, const char *src, size_t size) |
||
73 | { |
||
74 | size_t ret = strlen(src); |
||
75 | |||
76 | if (size) { |
||
77 | size_t len = (ret >= size) ? size - 1 : ret; |
||
78 | memcpy(dest, src, len); |
||
79 | dest[len] = '\0'; |
||
80 | } |
||
81 | return ret; |
||
82 | } |
||
6102 | serge | 83 | |
84 | #ifndef __HAVE_ARCH_STRLCAT |
||
85 | /** |
||
86 | * strlcat - Append a length-limited, C-string to another |
||
87 | * @dest: The string to be appended to |
||
88 | * @src: The string to append to it |
||
89 | * @count: The size of the destination buffer. |
||
90 | */ |
||
91 | size_t strlcat(char *dest, const char *src, size_t count) |
||
92 | { |
||
7143 | serge | 93 | size_t dsize = strlen(dest); |
94 | size_t len = strlen(src); |
||
95 | size_t res = dsize + len; |
||
6102 | serge | 96 | |
7143 | serge | 97 | /* This would be a bug */ |
98 | BUG_ON(dsize >= count); |
||
6102 | serge | 99 | |
7143 | serge | 100 | dest += dsize; |
101 | count -= dsize; |
||
102 | if (len >= count) |
||
103 | len = count-1; |
||
104 | memcpy(dest, src, len); |
||
105 | dest[len] = 0; |
||
106 | return res; |
||
6102 | serge | 107 | } |
1966 | serge | 108 | #endif |
109 | |||
6102 | serge | 110 | |
111 | #endif |
||
112 |