summaryrefslogtreecommitdiff
path: root/sys/src/cmd/fossil/Ccli.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/fossil/Ccli.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/fossil/Ccli.c')
-rwxr-xr-xsys/src/cmd/fossil/Ccli.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/sys/src/cmd/fossil/Ccli.c b/sys/src/cmd/fossil/Ccli.c
new file mode 100755
index 000000000..775cb6206
--- /dev/null
+++ b/sys/src/cmd/fossil/Ccli.c
@@ -0,0 +1,112 @@
+#include "stdinc.h"
+
+#include "9.h"
+
+typedef struct {
+ char* argv0;
+ int (*cmd)(int, char*[]);
+} Cmd;
+
+static struct {
+ VtLock* lock;
+ Cmd* cmd;
+ int ncmd;
+ int hi;
+} cbox;
+
+enum {
+ NCmdIncr = 20,
+};
+
+int
+cliError(char* fmt, ...)
+{
+ char *p;
+ va_list arg;
+
+ va_start(arg, fmt);
+ p = vsmprint(fmt, arg);
+ vtSetError("%s", p);
+ free(p);
+ va_end(arg);
+
+ return 0;
+}
+
+int
+cliExec(char* buf)
+{
+ int argc, i, r;
+ char *argv[20], *p;
+
+ p = vtStrDup(buf);
+ if((argc = tokenize(p, argv, nelem(argv)-1)) == 0){
+ vtMemFree(p);
+ return 1;
+ }
+ argv[argc] = 0;
+
+ if(argv[0][0] == '#'){
+ vtMemFree(p);
+ return 1;
+ }
+
+ vtLock(cbox.lock);
+ for(i = 0; i < cbox.hi; i++){
+ if(strcmp(cbox.cmd[i].argv0, argv[0]) == 0){
+ vtUnlock(cbox.lock);
+ if(!(r = cbox.cmd[i].cmd(argc, argv)))
+ consPrint("%s\n", vtGetError());
+ vtMemFree(p);
+ return r;
+ }
+ }
+ vtUnlock(cbox.lock);
+
+ consPrint("%s: - eh?\n", argv[0]);
+ vtMemFree(p);
+
+ return 0;
+}
+
+int
+cliAddCmd(char* argv0, int (*cmd)(int, char*[]))
+{
+ int i;
+ Cmd *opt;
+
+ vtLock(cbox.lock);
+ for(i = 0; i < cbox.hi; i++){
+ if(strcmp(argv0, cbox.cmd[i].argv0) == 0){
+ vtUnlock(cbox.lock);
+ return 0;
+ }
+ }
+ if(i >= cbox.hi){
+ if(cbox.hi >= cbox.ncmd){
+ cbox.cmd = vtMemRealloc(cbox.cmd,
+ (cbox.ncmd+NCmdIncr)*sizeof(Cmd));
+ memset(&cbox.cmd[cbox.ncmd], 0, NCmdIncr*sizeof(Cmd));
+ cbox.ncmd += NCmdIncr;
+ }
+ }
+
+ opt = &cbox.cmd[cbox.hi];
+ opt->argv0 = argv0;
+ opt->cmd = cmd;
+ cbox.hi++;
+ vtUnlock(cbox.lock);
+
+ return 1;
+}
+
+int
+cliInit(void)
+{
+ cbox.lock = vtLockAlloc();
+ cbox.cmd = vtMemAllocZ(NCmdIncr*sizeof(Cmd));
+ cbox.ncmd = NCmdIncr;
+ cbox.hi = 0;
+
+ return 1;
+}