mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 15:04:27 +08:00
35 lines
753 B
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);
|
||
|
|