forked from rsta2/circle
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathp9cmd.cpp
More file actions
77 lines (62 loc) · 1.2 KB
/
p9cmd.cpp
File metadata and controls
77 lines (62 loc) · 1.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "p9cmd.h"
#include "p9error.h"
#include <circle/string.h>
#include <assert.h>
void cmderror (Cmdbuf *cb, const char *err)
{
if (cb->argc > 0)
{
CString Cmd;
for (unsigned i = 0; i < cb->argc; i++)
{
if (i > 0)
{
Cmd.Append (" ");
}
Cmd.Append (cb->f[i]);
}
print ("%s\n", (const char *) Cmd);
}
error (err);
}
Cmdbuf *parsecmd (const void *str, long n)
{
Cmdbuf *pCmdbuf = (Cmdbuf *) malloc (sizeof (Cmdbuf));
assert (pCmdbuf != 0);
strncpy (pCmdbuf->buf, (const char *) str, sizeof pCmdbuf->buf-1);
pCmdbuf->buf[sizeof pCmdbuf->buf-1] = '\0';
pCmdbuf->argc = 0;
char *pSavePtr;
for (unsigned i = 0; i < nelem (pCmdbuf->f); i++)
{
char *p = strtok_r (i == 0 ? pCmdbuf->buf : 0, " \t\n", &pSavePtr);
pCmdbuf->f[i] = p;
if (p == 0)
{
break;
}
CString Arg (p);
if (Arg.Replace ("\\x20", " ") > 0)
{
strcpy (p, Arg);
}
pCmdbuf->argc++;
}
return pCmdbuf;
}
Cmdtab *lookupcmd (Cmdbuf *cb, Cmdtab *ct, size_t nelem)
{
if (cb->argc == 0)
{
cmderror (cb, "Command expected");
}
for (unsigned i = 0; i < nelem; i++, ct++)
{
if (strcasecmp (cb->f[0], ct->cmd) == 0)
{
return ct;
}
}
cmderror (cb, "Invalid command");
return 0;
}