FreeCalypso > hg > freecalypso-tools
diff rvinterf/asyncshell/parse.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/asyncshell/parse.c Sat Jun 11 00:13:35 2016 +0000 @@ -0,0 +1,53 @@ +/* + * This module implements the parser helper function that allows + * the same code to be reused between interactive and one-shot + * versions of the same command. + */ + +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> + +parse_interactive_command_into_argv(argstr, argv, min_arg, max_arg, argcp) + char *argstr, **argv; + int min_arg, max_arg, *argcp; +{ + char *cp, **ap; + + cp = argstr; + for (ap = argv; ; ) { + while (isspace(*cp)) + cp++; + if (!*cp || *cp == '#') + break; + if (ap - argv >= max_arg) { + printf("error: too many arguments\n"); + return(-1); + } + if (*cp == '"') { + *ap++ = ++cp; + while (*cp && *cp != '"') + cp++; + if (*cp != '"') { + printf("error: unterminated quoted string\n"); + return(-1); + } + *cp++ = '\0'; + } else { + *ap++ = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + } + } + if (ap - argv < min_arg) { + printf("error: too few arguments\n"); + return(-1); + } + *ap = 0; + *argcp = ap - argv; + return(0); +}