aboutsummaryrefslogtreecommitdiffstats
path: root/lib/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/string.c')
-rw-r--r--lib/string.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/string.c b/lib/string.c
index 2c0900a5d51a..453f35994eb6 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -27,6 +27,7 @@
27#include <linux/export.h> 27#include <linux/export.h>
28#include <linux/bug.h> 28#include <linux/bug.h>
29#include <linux/errno.h> 29#include <linux/errno.h>
30#include <linux/slab.h>
30 31
31#include <asm/byteorder.h> 32#include <asm/byteorder.h>
32#include <asm/word-at-a-time.h> 33#include <asm/word-at-a-time.h>
@@ -890,6 +891,36 @@ void *memscan(void *addr, int c, size_t size)
890EXPORT_SYMBOL(memscan); 891EXPORT_SYMBOL(memscan);
891#endif 892#endif
892 893
894/*
895 * Merge two NULL-terminated pointer arrays into a newly allocated
896 * array, which is also NULL-terminated. Nomenclature is inspired by
897 * memset_p() and memcat() found elsewhere in the kernel source tree.
898 */
899void **__memcat_p(void **a, void **b)
900{
901 void **p = a, **new;
902 int nr;
903
904 /* count the elements in both arrays */
905 for (nr = 0, p = a; *p; nr++, p++)
906 ;
907 for (p = b; *p; nr++, p++)
908 ;
909 /* one for the NULL-terminator */
910 nr++;
911
912 new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL);
913 if (!new)
914 return NULL;
915
916 /* nr -> last index; p points to NULL in b[] */
917 for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1)
918 new[nr] = *p;
919
920 return new;
921}
922EXPORT_SYMBOL_GPL(__memcat_p);
923
893#ifndef __HAVE_ARCH_STRSTR 924#ifndef __HAVE_ARCH_STRSTR
894/** 925/**
895 * strstr - Find the first substring in a %NUL terminated string 926 * strstr - Find the first substring in a %NUL terminated string