mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
lib: Add memcat_p(): paste 2 pointer arrays together
This adds a helper to paste 2 pointer arrays together, useful for merging various types of attribute arrays. There are a few places in the kernel tree where this is open coded, and I just added one more in the STM class. The naming is inspired by memset_p() and memcat(), and partial credit for it goes to Andy Shevchenko. This patch adds the function wrapped in a type-enforcing macro and a test module. Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Tested-by: Mathieu Poirier <mathieu.poirier@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6c7e4b6882
commit
ce76d938dd
31
lib/string.c
31
lib/string.c
@@ -27,6 +27,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/word-at-a-time.h>
|
||||
@@ -890,6 +891,36 @@ void *memscan(void *addr, int c, size_t size)
|
||||
EXPORT_SYMBOL(memscan);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
#ifndef __HAVE_ARCH_STRSTR
|
||||
/**
|
||||
* strstr - Find the first substring in a %NUL terminated string
|
||||
|
Reference in New Issue
Block a user