summaryrefslogtreecommitdiff
path: root/appl/cmd/fs.b
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /appl/cmd/fs.b
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'appl/cmd/fs.b')
-rw-r--r--appl/cmd/fs.b109
1 files changed, 109 insertions, 0 deletions
diff --git a/appl/cmd/fs.b b/appl/cmd/fs.b
new file mode 100644
index 00000000..0314b0bf
--- /dev/null
+++ b/appl/cmd/fs.b
@@ -0,0 +1,109 @@
+implement Fs;
+include "sys.m";
+ sys: Sys;
+include "draw.m";
+include "sh.m";
+include "readdir.m";
+include "fslib.m";
+ fslib: Fslib;
+ Report, Value, type2s: import fslib;
+ Fschan, Fsdata, Entrychan, Entry,
+ Quit: import Fslib;
+
+# fs distribution:
+
+# {filter -d {not {match -r '\.(dis|sbl)$'}} {filter {path /module/fslib.m /module/bundle.m /module/unbundle.m /appl/cmd/fs.b /appl/cmd/fs /appl/lib/fslib.b} /}}
+
+Fs: module {
+ init: fn(nil: ref Draw->Context, argv: list of string);
+};
+
+badmod(path: string)
+{
+ sys->fprint(stderr(), "fs: cannot load %s: %r\n", path);
+ raise "fail:bad module";
+}
+
+init(ctxt: ref Draw->Context, argv: list of string)
+{
+ sys = load Sys Sys->PATH;
+ fslib = load Fslib Fslib->PATH;
+ if(fslib == nil)
+ badmod(Fslib->PATH);
+ fslib->init();
+ argv = tl argv;
+
+ if(argv == nil)
+ usage();
+ report := Report.new();
+ s := hd argv;
+ if(tl argv == nil && s != nil && s[0] == '{' && s[len s - 1] == '}')
+ s = "void " + hd argv;
+ else {
+ s = "void {" + hd argv;
+ for(argv = tl argv; argv != nil; argv = tl argv){
+ a := hd argv;
+ if(a == nil || a[0] != '{') # }
+ s += sys->sprint(" %q", a);
+ else
+ s += " " + hd argv;
+ }
+ s += "}";
+ }
+ m := load Fsmodule "/dis/fs/eval.dis";
+ if(m == nil)
+ badmod("/dis/fs/eval.dis");
+ if(!fslib->typecompat("as", m->types())){
+ sys->fprint(stderr(), "fs: eval module implements incompatible type (usage: %s)\n",
+ fslib->cmdusage("eval", m->types()));
+ raise "fail:bad eval module";
+ }
+ m->init();
+ v := m->run(ctxt, report, nil, ref Value.S(s) :: nil);
+ fail: string;
+ if(v == nil)
+ fail = "error";
+ else{
+ sync := v.v().i;
+ sync <-= 1;
+ }
+ report.enable();
+ while((e := <-report.reportc) != nil)
+ sys->fprint(stderr(), "fs: %s\n", e);
+ if(fail != nil)
+ raise "fail:" +fail;
+}
+
+usage()
+{
+ fd := stderr();
+ sys->fprint(fd, "usage: fs expression\n");
+ sys->fprint(fd, "verbs are:\n");
+ if((readdir := load Readdir Readdir->PATH) == nil){
+ sys->fprint(fd, "fs: cannot load %s: %r\n", Readdir->PATH);
+ }else{
+ (a, nil) := readdir->init("/dis/fs", Readdir->NAME|Readdir->COMPACT);
+ for(i := 0; i < len a; i++){
+ f := a[i].name;
+ if(len f < 4 || f[len f - 4:] != ".dis")
+ continue;
+ m := load Fsmodule "/dis/fs/" + f;
+ if(m == nil)
+ sys->fprint(fd, "\t(%s: cannot load: %r)\n", f[0:len f - 4]);
+ else
+ sys->fprint(fd, "\t%s\n", fslib->cmdusage(f[0:len f - 4], m->types()));
+ }
+ }
+ sys->fprint(fd, "automatic conversions:\n");
+ sys->fprint(fd, "\tstring -> fs {walk string}\n");
+ sys->fprint(fd, "\tfs -> entries {entries fs}\n");
+ sys->fprint(fd, "\tstring -> gate {match string}\n");
+ sys->fprint(fd, "\tentries -> void {print entries}\n");
+ sys->fprint(fd, "\tcommand -> string {run command}\n");
+ raise "fail:usage";
+}
+
+stderr(): ref Sys->FD
+{
+ return sys->fildes(2);
+}