xref: /inferno-os/appl/cmd/fs.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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