acrn-kernel/lib/memcat_p.c

35 lines
753 B
C

// 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);