forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
753 B
34 lines
753 B
// SPDX-License-Identifier: GPL-2.0 |
|
|
|
#include <linux/slab.h> |
|
|
|
/* |
|
* Merge two NULL-terminated pointer arrays into a newly allocated |
|
* array, which is also NULL-terminated. Nomenclature is inspired by |
|
* memset_p() and memcat() found elsewhere in the kernel source tree. |
|
*/ |
|
void **__memcat_p(void **a, void **b) |
|
{ |
|
void **p = a, **new; |
|
int nr; |
|
|
|
/* count the elements in both arrays */ |
|
for (nr = 0, p = a; *p; nr++, p++) |
|
; |
|
for (p = b; *p; nr++, p++) |
|
; |
|
/* one for the NULL-terminator */ |
|
nr++; |
|
|
|
new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL); |
|
if (!new) |
|
return NULL; |
|
|
|
/* nr -> last index; p points to NULL in b[] */ |
|
for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1) |
|
new[nr] = *p; |
|
|
|
return new; |
|
} |
|
EXPORT_SYMBOL_GPL(__memcat_p); |
|
|
|
|