xref: /linux/lib/memcat_p.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <linux/slab.h>
4 
5 /*
6  * Merge two NULL-terminated pointer arrays into a newly allocated
7  * array, which is also NULL-terminated. Nomenclature is inspired by
8  * memset_p() and memcat() found elsewhere in the kernel source tree.
9  */
10 void **__memcat_p(void **a, void **b)
11 {
12 	void **p = a, **new;
13 	int nr;
14 
15 	/* count the elements in both arrays */
16 	for (nr = 0, p = a; *p; nr++, p++)
17 		;
18 	for (p = b; *p; nr++, p++)
19 		;
20 	/* one for the NULL-terminator */
21 	nr++;
22 
23 	new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL);
24 	if (!new)
25 		return NULL;
26 
27 	/* nr -> last index; p points to NULL in b[] */
28 	for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1)
29 		new[nr] = *p;
30 
31 	return new;
32 }
33 EXPORT_SYMBOL_GPL(__memcat_p);
34 
35