Blame view

lib/memcat_p.c 753 Bytes
93048c094   Alexander Shishkin   lib: Fix ia64 boo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  // 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);