comparison loadtools/bpdispatch.c @ 85:c5766d12360d

fc-buzplay started
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 27 Oct 2016 05:28:30 +0000
parents loadtools/ltdispatch.c@e7502631a0f9
children 684eddecbc62
comparison
equal deleted inserted replaced
84:54a6864cabf4 85:c5766d12360d
1 /*
2 * This module implements the command dispatch for fc-buzplay
3 */
4
5 #include <ctype.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <strings.h>
9 #include <stdlib.h>
10
11 extern int cmd_baud();
12 extern int cmd_exit();
13 extern int loadtool_cmd_passthru();
14
15 static struct cmdtab {
16 char *cmd;
17 int minargs;
18 int maxargs;
19 int (*func)();
20 } cmdtab[] = {
21 {"abbr", 2, 2, loadtool_cmd_passthru},
22 {"abbw", 3, 3, loadtool_cmd_passthru},
23 {"baud", 0, 1, cmd_baud},
24 {"buzlev", 0, 1, loadtool_cmd_passthru},
25 {"exit", 0, 1, cmd_exit},
26 {"quit", 0, 1, cmd_exit},
27 {"r8", 1, 1, loadtool_cmd_passthru},
28 {"r16", 1, 1, loadtool_cmd_passthru},
29 {"r32", 1, 1, loadtool_cmd_passthru},
30 {"w8", 2, 2, loadtool_cmd_passthru},
31 {"w16", 2, 2, loadtool_cmd_passthru},
32 {"w32", 2, 2, loadtool_cmd_passthru},
33 {0, 0, 0, 0}
34 };
35
36 buzplay_dispatch_cmd(cmd)
37 char *cmd;
38 {
39 char *argv[10];
40 char *cp, **ap;
41 struct cmdtab *tp;
42
43 for (cp = cmd; isspace(*cp); cp++)
44 ;
45 if (!*cp || *cp == '#')
46 return(0);
47 argv[0] = cp;
48 while (*cp && !isspace(*cp))
49 cp++;
50 if (*cp)
51 *cp++ = '\0';
52 for (tp = cmdtab; tp->cmd; tp++)
53 if (!strcmp(tp->cmd, argv[0]))
54 break;
55 if (!tp->func) {
56 fprintf(stderr, "error: no such command\n");
57 return(-1);
58 }
59 for (ap = argv + 1; ; ) {
60 while (isspace(*cp))
61 cp++;
62 if (!*cp || *cp == '#')
63 break;
64 if (ap - argv - 1 >= tp->maxargs) {
65 fprintf(stderr, "error: too many arguments\n");
66 return(-1);
67 }
68 *ap++ = cp;
69 while (*cp && !isspace(*cp))
70 cp++;
71 if (*cp)
72 *cp++ = '\0';
73 }
74 if (ap - argv - 1 < tp->minargs) {
75 fprintf(stderr, "error: too few arguments\n");
76 return(-1);
77 }
78 *ap = 0;
79 return tp->func(ap - argv, argv);
80 }