comparison 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
comparison
equal deleted inserted replaced
8:265b8103530c 9:003660a57f99
1 /*
2 * This module implements input handling for sms-gen-tpdu.
3 */
4
5 #include <ctype.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <strings.h>
10 #include "error.h"
11
12 extern char input_line[];
13 extern int input_lineno;
14
15 extern void set_sc_addr();
16 extern void set_user_addr();
17 extern void set_mr_byte();
18 extern void set_pid_byte();
19 extern void set_dcs();
20 extern void set_scts();
21 extern void cmd_msg_plain();
22 extern void cmd_msg_udh();
23
24 static struct cmdtab {
25 char *cmd;
26 int minargs;
27 int maxargs;
28 void (*func)();
29 } cmdtab[] = {
30 {"sc-addr", 1, 1, set_sc_addr},
31 {"user-addr", 1, 1, set_user_addr},
32 {"mr", 1, 1, set_mr_byte},
33 {"pid", 1, 1, set_pid_byte},
34 {"dcs", 2, 2, set_dcs},
35 {"sc-ts", 1, 1, set_scts},
36 {"msg", 1, 1, cmd_msg_plain},
37 {"msg-udh", 1, 1, cmd_msg_udh},
38 /* table search terminator */
39 {0, 0, 0, 0}
40 };
41
42 void
43 process_input_line()
44 {
45 char *argv[10];
46 char *cp, **ap;
47 struct cmdtab *tp;
48
49 cp = index(input_line, '\n');
50 if (!cp) {
51 fprintf(stderr, ERR_PREFIX "missing newline\n", input_lineno);
52 exit(1);
53 }
54 for (cp = input_line; isspace(*cp); cp++)
55 ;
56 if (*cp == '\0' || *cp == '#')
57 return;
58 argv[0] = cp;
59 while (*cp && !isspace(*cp))
60 cp++;
61 if (*cp)
62 *cp++ = '\0';
63 for (tp = cmdtab; tp->cmd; tp++)
64 if (!strcmp(tp->cmd, argv[0]))
65 break;
66 if (!tp->func) {
67 fprintf(stderr, ERR_PREFIX "invalid command \"%s\"\n",
68 input_lineno, argv[0]);
69 exit(1);
70 }
71 for (ap = argv + 1; ; ) {
72 while (isspace(*cp))
73 cp++;
74 if (!*cp || *cp == '#')
75 break;
76 if (ap - argv - 1 >= tp->maxargs) {
77 fprintf(stderr, ERR_PREFIX "too many arguments\n",
78 input_lineno);
79 exit(1);
80 }
81 if (*cp == '"') {
82 *ap++ = ++cp;
83 for (;;) {
84 if (!*cp) {
85 unterm_qstring: fprintf(stderr, ERR_PREFIX
86 "unterminated quoted string\n",
87 input_lineno);
88 exit(1);
89 }
90 if (*cp == '"')
91 break;
92 if (*cp++ == '\\') {
93 if (!*cp)
94 goto unterm_qstring;
95 cp++;
96 }
97 }
98 *cp++ = '\0';
99 } else {
100 *ap++ = cp;
101 while (*cp && !isspace(*cp))
102 cp++;
103 if (*cp)
104 *cp++ = '\0';
105 }
106 }
107 if (ap - argv - 1 < tp->minargs) {
108 fprintf(stderr, ERR_PREFIX "too few arguments\n", input_lineno);
109 exit(1);
110 }
111 *ap = 0;
112 tp->func(ap - argv, argv);
113 }