1 6f4d00ee 2013-09-23 0intro #include "stdinc.h"
3 6f4d00ee 2013-09-23 0intro #include "9.h"
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*[]);
10 6f4d00ee 2013-09-23 0intro static struct {
11 4b576658 2013-09-23 0intro QLock lock;
18 6f4d00ee 2013-09-23 0intro NCmdIncr = 20,
22 6f4d00ee 2013-09-23 0intro cliError(char* fmt, ...)
25 6f4d00ee 2013-09-23 0intro va_list arg;
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);
31 6f4d00ee 2013-09-23 0intro va_end(arg);
37 6f4d00ee 2013-09-23 0intro cliExec(char* buf)
39 6f4d00ee 2013-09-23 0intro int argc, i, r;
40 6f4d00ee 2013-09-23 0intro char *argv[20], *p;
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);
47 6f4d00ee 2013-09-23 0intro argv[argc] = 0;
49 6f4d00ee 2013-09-23 0intro if(argv[0][0] == '#'){
50 4b576658 2013-09-23 0intro vtfree(p);
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);
64 4b576658 2013-09-23 0intro qunlock(&cbox.lock);
66 6f4d00ee 2013-09-23 0intro consPrint("%s: - eh?\n", argv[0]);
67 4b576658 2013-09-23 0intro vtfree(p);
73 6f4d00ee 2013-09-23 0intro cliAddCmd(char* argv0, int (*cmd)(int, char*[]))
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);
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;
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);
100 6f4d00ee 2013-09-23 0intro return 1;
104 6f4d00ee 2013-09-23 0intro cliInit(void)
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;
110 6f4d00ee 2013-09-23 0intro return 1;