Blame


1 6f4d00ee 2013-09-23 0intro #include "stdinc.h"
2 6f4d00ee 2013-09-23 0intro
3 6f4d00ee 2013-09-23 0intro #include "9.h"
4 6f4d00ee 2013-09-23 0intro
5 6f4d00ee 2013-09-23 0intro typedef struct {
6 6f4d00ee 2013-09-23 0intro char* argv0;
7 6f4d00ee 2013-09-23 0intro int (*cmd)(int, char*[]);
8 6f4d00ee 2013-09-23 0intro } Cmd;
9 6f4d00ee 2013-09-23 0intro
10 6f4d00ee 2013-09-23 0intro static struct {
11 4b576658 2013-09-23 0intro QLock lock;
12 6f4d00ee 2013-09-23 0intro Cmd* cmd;
13 6f4d00ee 2013-09-23 0intro int ncmd;
14 6f4d00ee 2013-09-23 0intro int hi;
15 6f4d00ee 2013-09-23 0intro } cbox;
16 6f4d00ee 2013-09-23 0intro
17 6f4d00ee 2013-09-23 0intro enum {
18 6f4d00ee 2013-09-23 0intro NCmdIncr = 20,
19 6f4d00ee 2013-09-23 0intro };
20 6f4d00ee 2013-09-23 0intro
21 6f4d00ee 2013-09-23 0intro int
22 6f4d00ee 2013-09-23 0intro cliError(char* fmt, ...)
23 6f4d00ee 2013-09-23 0intro {
24 6f4d00ee 2013-09-23 0intro char *p;
25 6f4d00ee 2013-09-23 0intro va_list arg;
26 6f4d00ee 2013-09-23 0intro
27 6f4d00ee 2013-09-23 0intro va_start(arg, fmt);
28 6f4d00ee 2013-09-23 0intro p = vsmprint(fmt, arg);
29 4b576658 2013-09-23 0intro werrstr("%s", p);
30 6f4d00ee 2013-09-23 0intro free(p);
31 6f4d00ee 2013-09-23 0intro va_end(arg);
32 6f4d00ee 2013-09-23 0intro
33 6f4d00ee 2013-09-23 0intro return 0;
34 6f4d00ee 2013-09-23 0intro }
35 6f4d00ee 2013-09-23 0intro
36 6f4d00ee 2013-09-23 0intro int
37 6f4d00ee 2013-09-23 0intro cliExec(char* buf)
38 6f4d00ee 2013-09-23 0intro {
39 6f4d00ee 2013-09-23 0intro int argc, i, r;
40 6f4d00ee 2013-09-23 0intro char *argv[20], *p;
41 6f4d00ee 2013-09-23 0intro
42 4b576658 2013-09-23 0intro p = vtstrdup(buf);
43 6f4d00ee 2013-09-23 0intro if((argc = tokenize(p, argv, nelem(argv)-1)) == 0){
44 4b576658 2013-09-23 0intro vtfree(p);
45 6f4d00ee 2013-09-23 0intro return 1;
46 6f4d00ee 2013-09-23 0intro }
47 6f4d00ee 2013-09-23 0intro argv[argc] = 0;
48 6f4d00ee 2013-09-23 0intro
49 6f4d00ee 2013-09-23 0intro if(argv[0][0] == '#'){
50 4b576658 2013-09-23 0intro vtfree(p);
51 6f4d00ee 2013-09-23 0intro return 1;
52 6f4d00ee 2013-09-23 0intro }
53 6f4d00ee 2013-09-23 0intro
54 4b576658 2013-09-23 0intro qlock(&cbox.lock);
55 6f4d00ee 2013-09-23 0intro for(i = 0; i < cbox.hi; i++){
56 6f4d00ee 2013-09-23 0intro if(strcmp(cbox.cmd[i].argv0, argv[0]) == 0){
57 4b576658 2013-09-23 0intro qunlock(&cbox.lock);
58 6f4d00ee 2013-09-23 0intro if(!(r = cbox.cmd[i].cmd(argc, argv)))
59 4b576658 2013-09-23 0intro consPrint("%r\n");
60 4b576658 2013-09-23 0intro vtfree(p);
61 6f4d00ee 2013-09-23 0intro return r;
62 6f4d00ee 2013-09-23 0intro }
63 6f4d00ee 2013-09-23 0intro }
64 4b576658 2013-09-23 0intro qunlock(&cbox.lock);
65 6f4d00ee 2013-09-23 0intro
66 6f4d00ee 2013-09-23 0intro consPrint("%s: - eh?\n", argv[0]);
67 4b576658 2013-09-23 0intro vtfree(p);
68 6f4d00ee 2013-09-23 0intro
69 6f4d00ee 2013-09-23 0intro return 0;
70 6f4d00ee 2013-09-23 0intro }
71 6f4d00ee 2013-09-23 0intro
72 6f4d00ee 2013-09-23 0intro int
73 6f4d00ee 2013-09-23 0intro cliAddCmd(char* argv0, int (*cmd)(int, char*[]))
74 6f4d00ee 2013-09-23 0intro {
75 6f4d00ee 2013-09-23 0intro int i;
76 6f4d00ee 2013-09-23 0intro Cmd *opt;
77 6f4d00ee 2013-09-23 0intro
78 4b576658 2013-09-23 0intro qlock(&cbox.lock);
79 6f4d00ee 2013-09-23 0intro for(i = 0; i < cbox.hi; i++){
80 6f4d00ee 2013-09-23 0intro if(strcmp(argv0, cbox.cmd[i].argv0) == 0){
81 4b576658 2013-09-23 0intro qunlock(&cbox.lock);
82 6f4d00ee 2013-09-23 0intro return 0;
83 6f4d00ee 2013-09-23 0intro }
84 6f4d00ee 2013-09-23 0intro }
85 6f4d00ee 2013-09-23 0intro if(i >= cbox.hi){
86 6f4d00ee 2013-09-23 0intro if(cbox.hi >= cbox.ncmd){
87 4b576658 2013-09-23 0intro cbox.cmd = vtrealloc(cbox.cmd,
88 6f4d00ee 2013-09-23 0intro (cbox.ncmd+NCmdIncr)*sizeof(Cmd));
89 6f4d00ee 2013-09-23 0intro memset(&cbox.cmd[cbox.ncmd], 0, NCmdIncr*sizeof(Cmd));
90 6f4d00ee 2013-09-23 0intro cbox.ncmd += NCmdIncr;
91 6f4d00ee 2013-09-23 0intro }
92 6f4d00ee 2013-09-23 0intro }
93 6f4d00ee 2013-09-23 0intro
94 6f4d00ee 2013-09-23 0intro opt = &cbox.cmd[cbox.hi];
95 6f4d00ee 2013-09-23 0intro opt->argv0 = argv0;
96 6f4d00ee 2013-09-23 0intro opt->cmd = cmd;
97 6f4d00ee 2013-09-23 0intro cbox.hi++;
98 4b576658 2013-09-23 0intro qunlock(&cbox.lock);
99 6f4d00ee 2013-09-23 0intro
100 6f4d00ee 2013-09-23 0intro return 1;
101 6f4d00ee 2013-09-23 0intro }
102 6f4d00ee 2013-09-23 0intro
103 6f4d00ee 2013-09-23 0intro int
104 6f4d00ee 2013-09-23 0intro cliInit(void)
105 6f4d00ee 2013-09-23 0intro {
106 4b576658 2013-09-23 0intro cbox.cmd = vtmallocz(NCmdIncr*sizeof(Cmd));
107 6f4d00ee 2013-09-23 0intro cbox.ncmd = NCmdIncr;
108 6f4d00ee 2013-09-23 0intro cbox.hi = 0;
109 6f4d00ee 2013-09-23 0intro
110 6f4d00ee 2013-09-23 0intro return 1;
111 6f4d00ee 2013-09-23 0intro }