FreeCalypso > hg > freecalypso-sw
diff rvinterf/etmsync/dispatch.c @ 276:909f00c15f27
more fc-fsio foundation
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 23 Feb 2014 21:31:30 +0000 |
parents | |
children | f304f9bcde3b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/dispatch.c Sun Feb 23 21:31:30 2014 +0000 @@ -0,0 +1,96 @@ +/* + * This module implements the command dispatch for fc-fsio + * and possibly other similar utilities in the future. + */ + +#include <ctype.h> +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> +#include "cmdtab.h" +#include "exitcodes.h" + +extern struct cmdtab cmdtab[]; + +parse_and_dispatch_cmd(cmd, is_script) + char *cmd; +{ + char *argv[MAX_CMD_ARGS+2]; + char *cp, **ap; + struct cmdtab *tp; + + for (cp = cmd; isspace(*cp); cp++) + ; + if (!*cp || *cp == '#') + return(0); + if (is_script) + printf("Script command: %s\n", cp); + argv[0] = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + for (tp = cmdtab; tp->cmd; tp++) + if (!strcmp(tp->cmd, argv[0])) + break; + if (!tp->func) { + fprintf(stderr, "error: no such command\n"); + return(ERROR_USAGE); + } + for (ap = argv + 1; ; ) { + while (isspace(*cp)) + cp++; + if (!*cp || *cp == '#') + break; + if (ap - argv - 1 >= tp->maxargs) { + fprintf(stderr, "error: too many arguments\n"); + return(ERROR_USAGE); + } + *ap++ = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + } + if (ap - argv - 1 < tp->minargs) { + fprintf(stderr, "error: too few arguments\n"); + return(ERROR_USAGE); + } + *ap = 0; + return tp->func(ap - argv, argv); +} + +cmd_exec(argc, argv) + char **argv; +{ + FILE *f; + char linebuf[512], *cp; + int lineno, retval = 0; + + f = fopen(argv[1], "r"); + if (!f) { + perror(argv[1]); + return(ERROR_USAGE); + } + for (lineno = 1; fgets(linebuf, sizeof linebuf, f); lineno++) { + cp = index(linebuf, '\n'); + if (!cp) { + fprintf(stderr, "%s line %d: missing newline\n", + argv[1], lineno); + fclose(f); + return(ERROR_USAGE); + } + *cp = '\0'; + retval = parse_and_dispatch_cmd(linebuf, 1); + if (retval) + break; + } + fclose(f); + return(retval); +} + +cmd_exit() +{ + exit(0); +}