diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/cmd/fs.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/cmd/fs.b')
| -rw-r--r-- | appl/cmd/fs.b | 109 |
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); +} |
