# HG changeset patch # User Daniel O'Connor # Date 1422709235 -37800 # Node ID 76a6bad110e251829af6399030727b3600e83f6f # Parent b5e4591b657025f835b0f3820f69f8e6fa19b74e Add routine to split string into argv/argc diff -r b5e4591b6570 -r 76a6bad110e2 splitargv.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/splitargv.c Sat Jan 31 23:30:35 2015 +1030 @@ -0,0 +1,60 @@ +/* + * Split string to argv + * + * Copyright (c) 2015 + * Daniel O'Connor . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +/* Split command string on space/tab boundaries into argv/argc + * + * Ignore the first 'skip' parameters. + * If maxargs is exceeded return 1 otherwise 0 + * + * TODO: handle escape chars + */ +int +splitargv(char *buf, unsigned skip, char *argv[], unsigned maxargs, int *argc) { + char **btmp; + + *argc = 0; + btmp = &buf; + while (1) { + argv[*argc] = strsep(btmp, " \t"); + if (argv[*argc] == '\0') + break; + /* Skip arg(s) if necessary */ + if (skip) { + skip--; + continue; + } + (*argc)++; + if (*argc == maxargs) + return 1; + } + + return 0; +} + diff -r b5e4591b6570 -r 76a6bad110e2 splitargv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/splitargv.h Sat Jan 31 23:30:35 2015 +1030 @@ -0,0 +1,29 @@ +/* + * Split string to argv + * + * Copyright (c) 2015 + * Daniel O'Connor . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +int splitargv(char *buf, unsigned skip, char *argv[], unsigned maxargs, int *argc);