FreeCalypso > hg > themwi-system-sw
diff smpp-send/input.c @ 223:f11c3e40c87a
new program smpp-send
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 05 Aug 2023 12:24:31 -0800 |
parents | |
children | 62184b971c8e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smpp-send/input.c Sat Aug 05 12:24:31 2023 -0800 @@ -0,0 +1,125 @@ +/* + * This module implements input handling for smpp-send. + */ + +#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_src_addr(); +extern void set_src_ton(); +extern void set_src_npi(); +extern void set_dest_addr(); +extern void set_dest_ton(); +extern void set_dest_npi(); +extern void set_pid_byte(); +extern void set_dcs_byte(); +extern void set_esm_class(); +extern void set_priority(); +extern void set_reg_deliv(); +extern void set_replace_flag(); +extern void cmd_msg_plain(); +extern void cmd_msg_udh(); + +static struct cmdtab { + char *cmd; + int minargs; + int maxargs; + void (*func)(); +} cmdtab[] = { + {"src", 1, 1, set_src_addr}, + {"src-ton", 1, 1, set_src_ton}, + {"src-npi", 1, 1, set_src_npi}, + {"dest", 1, 1, set_src_addr}, + {"dest-ton", 1, 1, set_src_ton}, + {"dest-npi", 1, 1, set_src_npi}, + {"pid", 1, 1, set_pid_byte}, + {"dcs", 1, 2, set_dcs_byte}, + {"esm-class", 1, 1, set_esm_class}, + {"priority", 1, 1, set_priority}, + {"reg-deliv", 1, 1, set_reg_deliv}, + {"replace-flag", 1, 1, set_replace_flag}, + {"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); +}