FreeCalypso > hg > freecalypso-sw
annotate loadtools/ltdispatch.c @ 55:278052b6afda
loadtools: started laying the foundation for flash support
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
|---|---|
| date | Sun, 23 Jun 2013 20:13:59 +0000 |
| parents | b015036286f3 |
| children | 10996c267de4 |
| rev | line source |
|---|---|
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
1 /* |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
2 * This module implements the command dispatch for fc-loadtool |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
3 */ |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
4 |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
5 #include <ctype.h> |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
6 #include <stdio.h> |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
7 #include <string.h> |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
8 #include <strings.h> |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
9 #include <stdlib.h> |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
10 |
|
52
b015036286f3
fc-loadtool: fast-baud communication with loadagent implemented, works!
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
36
diff
changeset
|
11 extern int cmd_baud(); |
|
35
05af070c4b60
loadtool: preparations for dump2bin and dump2srec
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
29
diff
changeset
|
12 extern int cmd_crc32(); |
|
36
65111e6eee9e
loadtool: dump2bin and dump2srec implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
35
diff
changeset
|
13 extern int cmd_dump2bin(); |
|
65111e6eee9e
loadtool: dump2bin and dump2srec implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
35
diff
changeset
|
14 extern int cmd_dump2srec(); |
|
29
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
15 extern int cmd_exec(); |
|
27
ae6294b8a015
loadtool: exit jump0 implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
22
diff
changeset
|
16 extern int cmd_exit(); |
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
17 extern int loadtool_cmd_passthru(); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
18 |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
19 static struct cmdtab { |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
20 char *cmd; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
21 int minargs; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
22 int maxargs; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
23 int (*func)(); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
24 } cmdtab[] = { |
|
52
b015036286f3
fc-loadtool: fast-baud communication with loadagent implemented, works!
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
36
diff
changeset
|
25 {"baud", 0, 1, cmd_baud}, |
|
35
05af070c4b60
loadtool: preparations for dump2bin and dump2srec
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
29
diff
changeset
|
26 {"crc32", 2, 2, cmd_crc32}, |
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
27 {"dump", 2, 2, loadtool_cmd_passthru}, |
|
36
65111e6eee9e
loadtool: dump2bin and dump2srec implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
35
diff
changeset
|
28 {"dump2bin", 3, 3, cmd_dump2bin}, |
|
65111e6eee9e
loadtool: dump2bin and dump2srec implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
35
diff
changeset
|
29 {"dump2srec", 3, 3, cmd_dump2srec}, |
|
29
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
30 {"exec", 1, 1, cmd_exec}, |
|
27
ae6294b8a015
loadtool: exit jump0 implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
22
diff
changeset
|
31 {"exit", 0, 1, cmd_exit}, |
|
ae6294b8a015
loadtool: exit jump0 implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
22
diff
changeset
|
32 {"quit", 0, 1, cmd_exit}, |
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
33 {"r8", 1, 1, loadtool_cmd_passthru}, |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
34 {"r16", 1, 1, loadtool_cmd_passthru}, |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
35 {"r32", 1, 1, loadtool_cmd_passthru}, |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
36 {"w8", 2, 2, loadtool_cmd_passthru}, |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
37 {"w16", 2, 2, loadtool_cmd_passthru}, |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
38 {"w32", 2, 2, loadtool_cmd_passthru}, |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
39 {0, 0, 0, 0} |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
40 }; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
41 |
|
29
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
42 loadtool_dispatch_cmd(cmd, is_script) |
|
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
43 char *cmd; |
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
44 { |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
45 char *argv[10]; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
46 char *cp, **ap; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
47 struct cmdtab *tp; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
48 |
|
29
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
49 for (cp = cmd; isspace(*cp); cp++) |
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
50 ; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
51 if (!*cp || *cp == '#') |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
52 return(0); |
|
29
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
53 if (is_script) |
|
dacf45e3d20f
loadtool: scripting functionality implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
27
diff
changeset
|
54 printf("Script command: %s\n", cp); |
|
22
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
55 argv[0] = cp; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
56 while (*cp && !isspace(*cp)) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
57 cp++; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
58 if (*cp) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
59 *cp++ = '\0'; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
60 for (tp = cmdtab; tp->cmd; tp++) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
61 if (!strcmp(tp->cmd, argv[0])) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
62 break; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
63 if (!tp->func) { |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
64 fprintf(stderr, "error: no such command\n"); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
65 return(-1); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
66 } |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
67 for (ap = argv + 1; ; ) { |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
68 while (isspace(*cp)) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
69 cp++; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
70 if (!*cp || *cp == '#') |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
71 break; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
72 if (ap - argv - 1 > tp->maxargs) { |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
73 fprintf(stderr, "error: too many arguments\n"); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
74 return(-1); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
75 } |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
76 *ap++ = cp; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
77 while (*cp && !isspace(*cp)) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
78 cp++; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
79 if (*cp) |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
80 *cp++ = '\0'; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
81 } |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
82 if (ap - argv - 1 < tp->minargs) { |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
83 fprintf(stderr, "error: too few arguments\n"); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
84 return(-1); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
85 } |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
86 *ap = 0; |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
87 return tp->func(ap - argv, argv); |
|
e658a84b37df
loadtool coming along
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff
changeset
|
88 } |
