FreeCalypso > hg > sms-coding-utils
diff gen-pdu/input.c @ 9:003660a57f99
new program sms-gen-tpdu
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 05 Aug 2023 07:43:45 +0000 |
parents | |
children | d9d722033ff1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen-pdu/input.c Sat Aug 05 07:43:45 2023 +0000 @@ -0,0 +1,113 @@ +/* + * This module implements input handling for sms-gen-tpdu. + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "error.h" + +extern char input_line[]; +extern int input_lineno; + +extern void set_sc_addr(); +extern void set_user_addr(); +extern void set_mr_byte(); +extern void set_pid_byte(); +extern void set_dcs(); +extern void set_scts(); +extern void cmd_msg_plain(); +extern void cmd_msg_udh(); + +static struct cmdtab { + char *cmd; + int minargs; + int maxargs; + void (*func)(); +} cmdtab[] = { + {"sc-addr", 1, 1, set_sc_addr}, + {"user-addr", 1, 1, set_user_addr}, + {"mr", 1, 1, set_mr_byte}, + {"pid", 1, 1, set_pid_byte}, + {"dcs", 2, 2, set_dcs}, + {"sc-ts", 1, 1, set_scts}, + {"msg", 1, 1, cmd_msg_plain}, + {"msg-udh", 1, 1, cmd_msg_udh}, + /* table search terminator */ + {0, 0, 0, 0} +}; + +void +process_input_line() +{ + char *argv[10]; + char *cp, **ap; + struct cmdtab *tp; + + cp = index(input_line, '\n'); + if (!cp) { + fprintf(stderr, ERR_PREFIX "missing newline\n", input_lineno); + exit(1); + } + for (cp = input_line; isspace(*cp); cp++) + ; + if (*cp == '\0' || *cp == '#') + return; + 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, ERR_PREFIX "invalid command \"%s\"\n", + input_lineno, argv[0]); + exit(1); + } + for (ap = argv + 1; ; ) { + while (isspace(*cp)) + cp++; + if (!*cp || *cp == '#') + break; + if (ap - argv - 1 >= tp->maxargs) { + fprintf(stderr, ERR_PREFIX "too many arguments\n", + input_lineno); + exit(1); + } + if (*cp == '"') { + *ap++ = ++cp; + for (;;) { + if (!*cp) { +unterm_qstring: fprintf(stderr, ERR_PREFIX + "unterminated quoted string\n", + input_lineno); + exit(1); + } + if (*cp == '"') + break; + if (*cp++ == '\\') { + if (!*cp) + goto unterm_qstring; + cp++; + } + } + *cp++ = '\0'; + } else { + *ap++ = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + } + } + if (ap - argv - 1 < tp->minargs) { + fprintf(stderr, ERR_PREFIX "too few arguments\n", input_lineno); + exit(1); + } + *ap = 0; + tp->func(ap - argv, argv); +}