1*37da2899SCharles.Forsythimplement Fs; 2*37da2899SCharles.Forsythinclude "sys.m"; 3*37da2899SCharles.Forsyth sys: Sys; 4*37da2899SCharles.Forsythinclude "draw.m"; 5*37da2899SCharles.Forsythinclude "sh.m"; 6*37da2899SCharles.Forsythinclude "readdir.m"; 7*37da2899SCharles.Forsythinclude "fslib.m"; 8*37da2899SCharles.Forsyth fslib: Fslib; 9*37da2899SCharles.Forsyth Report, Value, type2s: import fslib; 10*37da2899SCharles.Forsyth Fschan, Fsdata, Entrychan, Entry, 11*37da2899SCharles.Forsyth Quit: import Fslib; 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsyth# fs distribution: 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsyth# {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} /}} 16*37da2899SCharles.Forsyth 17*37da2899SCharles.ForsythFs: module { 18*37da2899SCharles.Forsyth init: fn(nil: ref Draw->Context, argv: list of string); 19*37da2899SCharles.Forsyth}; 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsythbadmod(path: string) 22*37da2899SCharles.Forsyth{ 23*37da2899SCharles.Forsyth sys->fprint(stderr(), "fs: cannot load %s: %r\n", path); 24*37da2899SCharles.Forsyth raise "fail:bad module"; 25*37da2899SCharles.Forsyth} 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsythinit(ctxt: ref Draw->Context, argv: list of string) 28*37da2899SCharles.Forsyth{ 29*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 30*37da2899SCharles.Forsyth fslib = load Fslib Fslib->PATH; 31*37da2899SCharles.Forsyth if(fslib == nil) 32*37da2899SCharles.Forsyth badmod(Fslib->PATH); 33*37da2899SCharles.Forsyth fslib->init(); 34*37da2899SCharles.Forsyth argv = tl argv; 35*37da2899SCharles.Forsyth 36*37da2899SCharles.Forsyth if(argv == nil) 37*37da2899SCharles.Forsyth usage(); 38*37da2899SCharles.Forsyth report := Report.new(); 39*37da2899SCharles.Forsyth s := hd argv; 40*37da2899SCharles.Forsyth if(tl argv == nil && s != nil && s[0] == '{' && s[len s - 1] == '}') 41*37da2899SCharles.Forsyth s = "void " + hd argv; 42*37da2899SCharles.Forsyth else { 43*37da2899SCharles.Forsyth s = "void {" + hd argv; 44*37da2899SCharles.Forsyth for(argv = tl argv; argv != nil; argv = tl argv){ 45*37da2899SCharles.Forsyth a := hd argv; 46*37da2899SCharles.Forsyth if(a == nil || a[0] != '{') # } 47*37da2899SCharles.Forsyth s += sys->sprint(" %q", a); 48*37da2899SCharles.Forsyth else 49*37da2899SCharles.Forsyth s += " " + hd argv; 50*37da2899SCharles.Forsyth } 51*37da2899SCharles.Forsyth s += "}"; 52*37da2899SCharles.Forsyth } 53*37da2899SCharles.Forsyth m := load Fsmodule "/dis/fs/eval.dis"; 54*37da2899SCharles.Forsyth if(m == nil) 55*37da2899SCharles.Forsyth badmod("/dis/fs/eval.dis"); 56*37da2899SCharles.Forsyth if(!fslib->typecompat("as", m->types())){ 57*37da2899SCharles.Forsyth sys->fprint(stderr(), "fs: eval module implements incompatible type (usage: %s)\n", 58*37da2899SCharles.Forsyth fslib->cmdusage("eval", m->types())); 59*37da2899SCharles.Forsyth raise "fail:bad eval module"; 60*37da2899SCharles.Forsyth } 61*37da2899SCharles.Forsyth m->init(); 62*37da2899SCharles.Forsyth v := m->run(ctxt, report, nil, ref Value.S(s) :: nil); 63*37da2899SCharles.Forsyth fail: string; 64*37da2899SCharles.Forsyth if(v == nil) 65*37da2899SCharles.Forsyth fail = "error"; 66*37da2899SCharles.Forsyth else{ 67*37da2899SCharles.Forsyth sync := v.v().i; 68*37da2899SCharles.Forsyth sync <-= 1; 69*37da2899SCharles.Forsyth } 70*37da2899SCharles.Forsyth report.enable(); 71*37da2899SCharles.Forsyth while((e := <-report.reportc) != nil) 72*37da2899SCharles.Forsyth sys->fprint(stderr(), "fs: %s\n", e); 73*37da2899SCharles.Forsyth if(fail != nil) 74*37da2899SCharles.Forsyth raise "fail:" +fail; 75*37da2899SCharles.Forsyth} 76*37da2899SCharles.Forsyth 77*37da2899SCharles.Forsythusage() 78*37da2899SCharles.Forsyth{ 79*37da2899SCharles.Forsyth fd := stderr(); 80*37da2899SCharles.Forsyth sys->fprint(fd, "usage: fs expression\n"); 81*37da2899SCharles.Forsyth sys->fprint(fd, "verbs are:\n"); 82*37da2899SCharles.Forsyth if((readdir := load Readdir Readdir->PATH) == nil){ 83*37da2899SCharles.Forsyth sys->fprint(fd, "fs: cannot load %s: %r\n", Readdir->PATH); 84*37da2899SCharles.Forsyth }else{ 85*37da2899SCharles.Forsyth (a, nil) := readdir->init("/dis/fs", Readdir->NAME|Readdir->COMPACT); 86*37da2899SCharles.Forsyth for(i := 0; i < len a; i++){ 87*37da2899SCharles.Forsyth f := a[i].name; 88*37da2899SCharles.Forsyth if(len f < 4 || f[len f - 4:] != ".dis") 89*37da2899SCharles.Forsyth continue; 90*37da2899SCharles.Forsyth m := load Fsmodule "/dis/fs/" + f; 91*37da2899SCharles.Forsyth if(m == nil) 92*37da2899SCharles.Forsyth sys->fprint(fd, "\t(%s: cannot load: %r)\n", f[0:len f - 4]); 93*37da2899SCharles.Forsyth else 94*37da2899SCharles.Forsyth sys->fprint(fd, "\t%s\n", fslib->cmdusage(f[0:len f - 4], m->types())); 95*37da2899SCharles.Forsyth } 96*37da2899SCharles.Forsyth } 97*37da2899SCharles.Forsyth sys->fprint(fd, "automatic conversions:\n"); 98*37da2899SCharles.Forsyth sys->fprint(fd, "\tstring -> fs {walk string}\n"); 99*37da2899SCharles.Forsyth sys->fprint(fd, "\tfs -> entries {entries fs}\n"); 100*37da2899SCharles.Forsyth sys->fprint(fd, "\tstring -> gate {match string}\n"); 101*37da2899SCharles.Forsyth sys->fprint(fd, "\tentries -> void {print entries}\n"); 102*37da2899SCharles.Forsyth sys->fprint(fd, "\tcommand -> string {run command}\n"); 103*37da2899SCharles.Forsyth raise "fail:usage"; 104*37da2899SCharles.Forsyth} 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsythstderr(): ref Sys->FD 107*37da2899SCharles.Forsyth{ 108*37da2899SCharles.Forsyth return sys->fildes(2); 109*37da2899SCharles.Forsyth} 110