Mercurial > ~darius > hgwebdir.cgi > avr-lib
diff splitargv.c @ 20:76a6bad110e2
Add routine to split string into argv/argc
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Sat, 31 Jan 2015 23:30:35 +1030 |
parents | |
children | 01e77066f72b |
line wrap: on
line diff
--- /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 <darius@dons.net.au>. 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 <string.h> + +/* 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; +} +