| 1 | |
| 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 |
|
| 16 | for (nr = 0, p = a; *p; nr++, p++)
|
| 17 | ;
|
| 18 | for (p = b; *p; nr++, p++)
|
| 19 | ;
|
| 20 |
|
| 21 | nr++;
|
| 22 |
|
| 23 | new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL);
|
| 24 | if (!new)
|
| 25 | return NULL;
|
| 26 |
|
| 27 |
|
| 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 |
|