1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/types.h>
24#include <linux/string.h>
25#include <linux/ctype.h>
26#include <linux/kernel.h>
27#include <linux/export.h>
28#include <linux/bug.h>
29#include <linux/errno.h>
30#include <linux/slab.h>
31
32#include <asm/byteorder.h>
33#include <asm/word-at-a-time.h>
34#include <asm/page.h>
35
36#ifndef __HAVE_ARCH_STRNCASECMP
37
38
39
40
41
42
43int strncasecmp(const char *s1, const char *s2, size_t len)
44{
45
46 unsigned char c1, c2;
47
48 if (!len)
49 return 0;
50
51 do {
52 c1 = *s1++;
53 c2 = *s2++;
54 if (!c1 || !c2)
55 break;
56 if (c1 == c2)
57 continue;
58 c1 = tolower(c1);
59 c2 = tolower(c2);
60 if (c1 != c2)
61 break;
62 } while (--len);
63 return (int)c1 - (int)c2;
64}
65EXPORT_SYMBOL(strncasecmp);
66#endif
67
68#ifndef __HAVE_ARCH_STRCASECMP
69int strcasecmp(const char *s1, const char *s2)
70{
71 int c1, c2;
72
73 do {
74 c1 = tolower(*s1++);
75 c2 = tolower(*s2++);
76 } while (c1 == c2 && c1 != 0);
77 return c1 - c2;
78}
79EXPORT_SYMBOL(strcasecmp);
80#endif
81
82#ifndef __HAVE_ARCH_STRCPY
83
84
85
86
87
88#undef strcpy
89char *strcpy(char *dest, const char *src)
90{
91 char *tmp = dest;
92
93 while ((*dest++ = *src++) != '\0')
94 ;
95 return tmp;
96}
97EXPORT_SYMBOL(strcpy);
98#endif
99
100#ifndef __HAVE_ARCH_STRNCPY
101
102
103
104
105
106
107
108
109
110
111
112
113
114char *strncpy(char *dest, const char *src, size_t count)
115{
116 char *tmp = dest;
117
118 while (count) {
119 if ((*tmp = *src) != 0)
120 src++;
121 tmp++;
122 count--;
123 }
124 return dest;
125}
126EXPORT_SYMBOL(strncpy);
127#endif
128
129#ifndef __HAVE_ARCH_STRLCPY
130
131
132
133
134
135
136
137
138
139
140
141size_t strlcpy(char *dest, const char *src, size_t size)
142{
143 size_t ret = strlen(src);
144
145 if (size) {
146 size_t len = (ret >= size) ? size - 1 : ret;
147 memcpy(dest, src, len);
148 dest[len] = '\0';
149 }
150 return ret;
151}
152EXPORT_SYMBOL(strlcpy);
153#endif
154
155#ifndef __HAVE_ARCH_STRSCPY
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179ssize_t strscpy(char *dest, const char *src, size_t count)
180{
181 const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS;
182 size_t max = count;
183 long res = 0;
184
185 if (count == 0)
186 return -E2BIG;
187
188#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
189
190
191
192
193 if ((long)src & (sizeof(long) - 1)) {
194 size_t limit = PAGE_SIZE - ((long)src & (PAGE_SIZE - 1));
195 if (limit < max)
196 max = limit;
197 }
198#else
199
200 if (((long) dest | (long) src) & (sizeof(long) - 1))
201 max = 0;
202#endif
203
204 while (max >= sizeof(unsigned long)) {
205 unsigned long c, data;
206
207 c = read_word_at_a_time(src+res);
208 if (has_zero(c, &data, &constants)) {
209 data = prep_zero_mask(c, data, &constants);
210 data = create_zero_mask(data);
211 *(unsigned long *)(dest+res) = c & zero_bytemask(data);
212 return res + find_zero(data);
213 }
214 *(unsigned long *)(dest+res) = c;
215 res += sizeof(unsigned long);
216 count -= sizeof(unsigned long);
217 max -= sizeof(unsigned long);
218 }
219
220 while (count) {
221 char c;
222
223 c = src[res];
224 dest[res] = c;
225 if (!c)
226 return res;
227 res++;
228 count--;
229 }
230
231
232 if (res)
233 dest[res-1] = '\0';
234
235 return -E2BIG;
236}
237EXPORT_SYMBOL(strscpy);
238#endif
239
240#ifndef __HAVE_ARCH_STRCAT
241
242
243
244
245
246#undef strcat
247char *strcat(char *dest, const char *src)
248{
249 char *tmp = dest;
250
251 while (*dest)
252 dest++;
253 while ((*dest++ = *src++) != '\0')
254 ;
255 return tmp;
256}
257EXPORT_SYMBOL(strcat);
258#endif
259
260#ifndef __HAVE_ARCH_STRNCAT
261
262
263
264
265
266
267
268
269
270char *strncat(char *dest, const char *src, size_t count)
271{
272 char *tmp = dest;
273
274 if (count) {
275 while (*dest)
276 dest++;
277 while ((*dest++ = *src++) != 0) {
278 if (--count == 0) {
279 *dest = '\0';
280 break;
281 }
282 }
283 }
284 return tmp;
285}
286EXPORT_SYMBOL(strncat);
287#endif
288
289#ifndef __HAVE_ARCH_STRLCAT
290
291
292
293
294
295
296size_t strlcat(char *dest, const char *src, size_t count)
297{
298 size_t dsize = strlen(dest);
299 size_t len = strlen(src);
300 size_t res = dsize + len;
301
302
303 BUG_ON(dsize >= count);
304
305 dest += dsize;
306 count -= dsize;
307 if (len >= count)
308 len = count-1;
309 memcpy(dest, src, len);
310 dest[len] = 0;
311 return res;
312}
313EXPORT_SYMBOL(strlcat);
314#endif
315
316#ifndef __HAVE_ARCH_STRCMP
317
318
319
320
321
322#undef strcmp
323int strcmp(const char *cs, const char *ct)
324{
325 unsigned char c1, c2;
326
327 while (1) {
328 c1 = *cs++;
329 c2 = *ct++;
330 if (c1 != c2)
331 return c1 < c2 ? -1 : 1;
332 if (!c1)
333 break;
334 }
335 return 0;
336}
337EXPORT_SYMBOL(strcmp);
338#endif
339
340#ifndef __HAVE_ARCH_STRNCMP
341
342
343
344
345
346
347int strncmp(const char *cs, const char *ct, size_t count)
348{
349 unsigned char c1, c2;
350
351 while (count) {
352 c1 = *cs++;
353 c2 = *ct++;
354 if (c1 != c2)
355 return c1 < c2 ? -1 : 1;
356 if (!c1)
357 break;
358 count--;
359 }
360 return 0;
361}
362EXPORT_SYMBOL(strncmp);
363#endif
364
365#ifndef __HAVE_ARCH_STRCHR
366
367
368
369
370
371char *strchr(const char *s, int c)
372{
373 for (; *s != (char)c; ++s)
374 if (*s == '\0')
375 return NULL;
376 return (char *)s;
377}
378EXPORT_SYMBOL(strchr);
379#endif
380
381#ifndef __HAVE_ARCH_STRCHRNUL
382
383
384
385
386
387
388
389
390char *strchrnul(const char *s, int c)
391{
392 while (*s && *s != (char)c)
393 s++;
394 return (char *)s;
395}
396EXPORT_SYMBOL(strchrnul);
397#endif
398
399#ifndef __HAVE_ARCH_STRRCHR
400
401
402
403
404
405char *strrchr(const char *s, int c)
406{
407 const char *last = NULL;
408 do {
409 if (*s == (char)c)
410 last = s;
411 } while (*s++);
412 return (char *)last;
413}
414EXPORT_SYMBOL(strrchr);
415#endif
416
417#ifndef __HAVE_ARCH_STRNCHR
418
419
420
421
422
423
424char *strnchr(const char *s, size_t count, int c)
425{
426 for (; count-- && *s != '\0'; ++s)
427 if (*s == (char)c)
428 return (char *)s;
429 return NULL;
430}
431EXPORT_SYMBOL(strnchr);
432#endif
433
434
435
436
437
438
439
440char *skip_spaces(const char *str)
441{
442 while (isspace(*str))
443 ++str;
444 return (char *)str;
445}
446EXPORT_SYMBOL(skip_spaces);
447
448
449
450
451
452
453
454
455
456char *strim(char *s)
457{
458 size_t size;
459 char *end;
460
461 size = strlen(s);
462 if (!size)
463 return s;
464
465 end = s + size - 1;
466 while (end >= s && isspace(*end))
467 end--;
468 *(end + 1) = '\0';
469
470 return skip_spaces(s);
471}
472EXPORT_SYMBOL(strim);
473
474#ifndef __HAVE_ARCH_STRLEN
475
476
477
478
479size_t strlen(const char *s)
480{
481 const char *sc;
482
483 for (sc = s; *sc != '\0'; ++sc)
484 ;
485 return sc - s;
486}
487EXPORT_SYMBOL(strlen);
488#endif
489
490#ifndef __HAVE_ARCH_STRNLEN
491
492
493
494
495
496size_t strnlen(const char *s, size_t count)
497{
498 const char *sc;
499
500 for (sc = s; count-- && *sc != '\0'; ++sc)
501 ;
502 return sc - s;
503}
504EXPORT_SYMBOL(strnlen);
505#endif
506
507#ifndef __HAVE_ARCH_STRSPN
508
509
510
511
512
513size_t strspn(const char *s, const char *accept)
514{
515 const char *p;
516 const char *a;
517 size_t count = 0;
518
519 for (p = s; *p != '\0'; ++p) {
520 for (a = accept; *a != '\0'; ++a) {
521 if (*p == *a)
522 break;
523 }
524 if (*a == '\0')
525 return count;
526 ++count;
527 }
528 return count;
529}
530
531EXPORT_SYMBOL(strspn);
532#endif
533
534#ifndef __HAVE_ARCH_STRCSPN
535
536
537
538
539
540size_t strcspn(const char *s, const char *reject)
541{
542 const char *p;
543 const char *r;
544 size_t count = 0;
545
546 for (p = s; *p != '\0'; ++p) {
547 for (r = reject; *r != '\0'; ++r) {
548 if (*p == *r)
549 return count;
550 }
551 ++count;
552 }
553 return count;
554}
555EXPORT_SYMBOL(strcspn);
556#endif
557
558#ifndef __HAVE_ARCH_STRPBRK
559
560
561
562
563
564char *strpbrk(const char *cs, const char *ct)
565{
566 const char *sc1, *sc2;
567
568 for (sc1 = cs; *sc1 != '\0'; ++sc1) {
569 for (sc2 = ct; *sc2 != '\0'; ++sc2) {
570 if (*sc1 == *sc2)
571 return (char *)sc1;
572 }
573 }
574 return NULL;
575}
576EXPORT_SYMBOL(strpbrk);
577#endif
578
579#ifndef __HAVE_ARCH_STRSEP
580
581
582
583
584
585
586
587
588
589
590
591char *strsep(char **s, const char *ct)
592{
593 char *sbegin = *s;
594 char *end;
595
596 if (sbegin == NULL)
597 return NULL;
598
599 end = strpbrk(sbegin, ct);
600 if (end)
601 *end++ = '\0';
602 *s = end;
603 return sbegin;
604}
605EXPORT_SYMBOL(strsep);
606#endif
607
608
609
610
611
612
613
614
615
616
617
618bool sysfs_streq(const char *s1, const char *s2)
619{
620 while (*s1 && *s1 == *s2) {
621 s1++;
622 s2++;
623 }
624
625 if (*s1 == *s2)
626 return true;
627 if (!*s1 && *s2 == '\n' && !s2[1])
628 return true;
629 if (*s1 == '\n' && !s1[1] && !*s2)
630 return true;
631 return false;
632}
633EXPORT_SYMBOL(sysfs_streq);
634
635
636
637
638
639
640
641
642
643
644int match_string(const char * const *array, size_t n, const char *string)
645{
646 int index;
647 const char *item;
648
649 for (index = 0; index < n; index++) {
650 item = array[index];
651 if (!item)
652 break;
653 if (!strcmp(item, string))
654 return index;
655 }
656
657 return -EINVAL;
658}
659EXPORT_SYMBOL(match_string);
660
661
662
663
664
665
666
667
668
669
670int __sysfs_match_string(const char * const *array, size_t n, const char *str)
671{
672 const char *item;
673 int index;
674
675 for (index = 0; index < n; index++) {
676 item = array[index];
677 if (!item)
678 break;
679 if (sysfs_streq(item, str))
680 return index;
681 }
682
683 return -EINVAL;
684}
685EXPORT_SYMBOL(__sysfs_match_string);
686
687#ifndef __HAVE_ARCH_MEMSET
688
689
690
691
692
693
694
695
696void *memset(void *s, int c, size_t count)
697{
698 char *xs = s;
699
700 while (count--)
701 *xs++ = c;
702 return s;
703}
704EXPORT_SYMBOL(memset);
705#endif
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721void memzero_explicit(void *s, size_t count)
722{
723 memset(s, 0, count);
724 barrier_data(s);
725}
726EXPORT_SYMBOL(memzero_explicit);
727
728#ifndef __HAVE_ARCH_MEMSET16
729
730
731
732
733
734
735
736
737
738
739void *memset16(uint16_t *s, uint16_t v, size_t count)
740{
741 uint16_t *xs = s;
742
743 while (count--)
744 *xs++ = v;
745 return s;
746}
747EXPORT_SYMBOL(memset16);
748#endif
749
750#ifndef __HAVE_ARCH_MEMSET32
751
752
753
754
755
756
757
758
759
760
761void *memset32(uint32_t *s, uint32_t v, size_t count)
762{
763 uint32_t *xs = s;
764
765 while (count--)
766 *xs++ = v;
767 return s;
768}
769EXPORT_SYMBOL(memset32);
770#endif
771
772#ifndef __HAVE_ARCH_MEMSET64
773
774
775
776
777
778
779
780
781
782
783void *memset64(uint64_t *s, uint64_t v, size_t count)
784{
785 uint64_t *xs = s;
786
787 while (count--)
788 *xs++ = v;
789 return s;
790}
791EXPORT_SYMBOL(memset64);
792#endif
793
794#ifndef __HAVE_ARCH_MEMCPY
795
796
797
798
799
800
801
802
803
804void *memcpy(void *dest, const void *src, size_t count)
805{
806 char *tmp = dest;
807 const char *s = src;
808
809 while (count--)
810 *tmp++ = *s++;
811 return dest;
812}
813EXPORT_SYMBOL(memcpy);
814#endif
815
816#ifndef __HAVE_ARCH_MEMMOVE
817
818
819
820
821
822
823
824
825void *memmove(void *dest, const void *src, size_t count)
826{
827 char *tmp;
828 const char *s;
829
830 if (dest <= src) {
831 tmp = dest;
832 s = src;
833 while (count--)
834 *tmp++ = *s++;
835 } else {
836 tmp = dest;
837 tmp += count;
838 s = src;
839 s += count;
840 while (count--)
841 *--tmp = *--s;
842 }
843 return dest;
844}
845EXPORT_SYMBOL(memmove);
846#endif
847
848#ifndef __HAVE_ARCH_MEMCMP
849
850
851
852
853
854
855#undef memcmp
856__visible int memcmp(const void *cs, const void *ct, size_t count)
857{
858 const unsigned char *su1, *su2;
859 int res = 0;
860
861 for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
862 if ((res = *su1 - *su2) != 0)
863 break;
864 return res;
865}
866EXPORT_SYMBOL(memcmp);
867#endif
868
869#ifndef __HAVE_ARCH_MEMSCAN
870
871
872
873
874
875
876
877
878
879void *memscan(void *addr, int c, size_t size)
880{
881 unsigned char *p = addr;
882
883 while (size) {
884 if (*p == c)
885 return (void *)p;
886 p++;
887 size--;
888 }
889 return (void *)p;
890}
891EXPORT_SYMBOL(memscan);
892#endif
893
894#ifndef __HAVE_ARCH_STRSTR
895
896
897
898
899
900char *strstr(const char *s1, const char *s2)
901{
902 size_t l1, l2;
903
904 l2 = strlen(s2);
905 if (!l2)
906 return (char *)s1;
907 l1 = strlen(s1);
908 while (l1 >= l2) {
909 l1--;
910 if (!memcmp(s1, s2, l2))
911 return (char *)s1;
912 s1++;
913 }
914 return NULL;
915}
916EXPORT_SYMBOL(strstr);
917#endif
918
919#ifndef __HAVE_ARCH_STRNSTR
920
921
922
923
924
925
926char *strnstr(const char *s1, const char *s2, size_t len)
927{
928 size_t l2;
929
930 l2 = strlen(s2);
931 if (!l2)
932 return (char *)s1;
933 while (len >= l2) {
934 len--;
935 if (!memcmp(s1, s2, l2))
936 return (char *)s1;
937 s1++;
938 }
939 return NULL;
940}
941EXPORT_SYMBOL(strnstr);
942#endif
943
944#ifndef __HAVE_ARCH_MEMCHR
945
946
947
948
949
950
951
952
953
954void *memchr(const void *s, int c, size_t n)
955{
956 const unsigned char *p = s;
957 while (n-- != 0) {
958 if ((unsigned char)c == *p++) {
959 return (void *)(p - 1);
960 }
961 }
962 return NULL;
963}
964EXPORT_SYMBOL(memchr);
965#endif
966
967static void *check_bytes8(const u8 *start, u8 value, unsigned int bytes)
968{
969 while (bytes) {
970 if (*start != value)
971 return (void *)start;
972 start++;
973 bytes--;
974 }
975 return NULL;
976}
977
978
979
980
981
982
983
984
985
986
987void *memchr_inv(const void *start, int c, size_t bytes)
988{
989 u8 value = c;
990 u64 value64;
991 unsigned int words, prefix;
992
993 if (bytes <= 16)
994 return check_bytes8(start, value, bytes);
995
996 value64 = value;
997#if defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER) && BITS_PER_LONG == 64
998 value64 *= 0x0101010101010101ULL;
999#elif defined(CONFIG_ARCH_HAS_FAST_MULTIPLIER)
1000 value64 *= 0x01010101;
1001 value64 |= value64 << 32;
1002#else
1003 value64 |= value64 << 8;
1004 value64 |= value64 << 16;
1005 value64 |= value64 << 32;
1006#endif
1007
1008 prefix = (unsigned long)start % 8;
1009 if (prefix) {
1010 u8 *r;
1011
1012 prefix = 8 - prefix;
1013 r = check_bytes8(start, value, prefix);
1014 if (r)
1015 return r;
1016 start += prefix;
1017 bytes -= prefix;
1018 }
1019
1020 words = bytes / 8;
1021
1022 while (words) {
1023 if (*(u64 *)start != value64)
1024 return check_bytes8(start, value, 8);
1025 start += 8;
1026 words--;
1027 }
1028
1029 return check_bytes8(start, value, bytes % 8);
1030}
1031EXPORT_SYMBOL(memchr_inv);
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041char *strreplace(char *s, char old, char new)
1042{
1043 for (; *s; ++s)
1044 if (*s == old)
1045 *s = new;
1046 return s;
1047}
1048EXPORT_SYMBOL(strreplace);
1049
1050void fortify_panic(const char *name)
1051{
1052 pr_emerg("detected buffer overflow in %s\n", name);
1053 BUG();
1054}
1055EXPORT_SYMBOL(fortify_panic);
1056