Commit d84d1cc7 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Jeremy Fitzhardinge
Browse files

add argv_split()

argv_split() is a helper function which takes a string, splits it at
whitespace, and returns a NULL-terminated argv vector.  This is
deliberately simple - it does no quote processing of any kind.

[ Seems to me that this is something which is already being done in
  the kernel, but I couldn't find any other implementations, either to
  steal or replace.  Keep an eye out. ]

Signed-off-by: default avatarJeremy Fitzhardinge <>
Signed-off-by: default avatarChris Wright <>
Cc: Andrew Morton <>
Cc: Randy Dunlap <>
parent 1e66df3e
......@@ -108,6 +108,9 @@ extern char *kstrdup(const char *s, gfp_t gfp);
extern char *kstrndup(const char *s, size_t len, gfp_t gfp);
extern void *kmemdup(const void *src, size_t len, gfp_t gfp);
extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
extern void argv_free(char **argv);
#ifdef __cplusplus
......@@ -5,7 +5,7 @@
lib-y := ctype.o string.o vsprintf.o cmdline.o \
rbtree.o radix-tree.o dump_stack.o \
idr.o int_sqrt.o bitmap.o extable.o prio_tree.o \
sha1.o irq_regs.o reciprocal_div.o
sha1.o irq_regs.o reciprocal_div.o argv_split.o
lib-$(CONFIG_MMU) += ioremap.o
lib-$(CONFIG_SMP) += cpumask.o
* Helper function for splitting a string into an argv-like array.
#include <linux/kernel.h>
#include <linux/ctype.h>
#include <linux/bug.h>
static const char *skip_sep(const char *cp)
while (*cp && isspace(*cp))
return cp;
static const char *skip_arg(const char *cp)
while (*cp && !isspace(*cp))
return cp;
static int count_argc(const char *str)
int count = 0;
while (*str) {
str = skip_sep(str);
if (*str) {
str = skip_arg(str);
return count;
* argv_free - free an argv
* @argv - the argument vector to be freed
* Frees an argv and the strings it points to.
void argv_free(char **argv)
char **p;
for (p = argv; *p; p++)
* argv_split - split a string at whitespace, returning an argv
* @gfp: the GFP mask used to allocate memory
* @str: the string to be split
* @argcp: returned argument count
* Returns an array of pointers to strings which are split out from
* @str. This is performed by strictly splitting on white-space; no
* quote processing is performed. Multiple whitespace characters are
* considered to be a single argument separator. The returned array
* is always NULL-terminated. Returns NULL on memory allocation
* failure.
char **argv_split(gfp_t gfp, const char *str, int *argcp)
int argc = count_argc(str);
char **argv = kzalloc(sizeof(*argv) * (argc+1), gfp);
char **argvp;
if (argv == NULL)
goto out;
*argcp = argc;
argvp = argv;
while (*str) {
str = skip_sep(str);
if (*str) {
const char *p = str;
char *t;
str = skip_arg(str);
t = kstrndup(p, str-p, gfp);
if (t == NULL)
goto fail;
*argvp++ = t;
*argvp = NULL;
return argv;
return NULL;
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment