xref: /inferno-os/appl/cmd/sh/test.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Shellbuiltin;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsythinclude "draw.m";
6*37da2899SCharles.Forsythinclude "sh.m";
7*37da2899SCharles.Forsyth	sh: Sh;
8*37da2899SCharles.Forsyth	Listnode, Context: import sh;
9*37da2899SCharles.Forsyth	myself: Shellbuiltin;
10*37da2899SCharles.Forsythinclude "itslib.m";
11*37da2899SCharles.Forsyth	itslib: Itslib;
12*37da2899SCharles.Forsyth	Tconfig, S_INFO, S_WARN, S_ERROR, S_FATAL: import itslib;
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsythtconf: ref Tconfig;
15*37da2899SCharles.Forsyth
16*37da2899SCharles.Forsythinitbuiltin(ctxt: ref Context, shmod: Sh): string
17*37da2899SCharles.Forsyth{
18*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
19*37da2899SCharles.Forsyth	itslib = load Itslib Itslib->PATH;
20*37da2899SCharles.Forsyth	if (itslib != nil)
21*37da2899SCharles.Forsyth		tconf = itslib->init();
22*37da2899SCharles.Forsyth	sh = shmod;
23*37da2899SCharles.Forsyth	myself = load Shellbuiltin "$self";
24*37da2899SCharles.Forsyth	if (myself == nil)
25*37da2899SCharles.Forsyth		ctxt.fail("bad module", sys->sprint("its: cannot load self: %r"));
26*37da2899SCharles.Forsyth	ctxt.addbuiltin("report", myself);
27*37da2899SCharles.Forsyth	return nil;
28*37da2899SCharles.Forsyth}
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsythgetself(): Shellbuiltin
31*37da2899SCharles.Forsyth{
32*37da2899SCharles.Forsyth	return myself;
33*37da2899SCharles.Forsyth}
34*37da2899SCharles.Forsyth
35*37da2899SCharles.Forsyth
36*37da2899SCharles.Forsythwhatis(nil: ref Sh->Context, nil: Sh, nil: string, nil: int): string
37*37da2899SCharles.Forsyth{
38*37da2899SCharles.Forsyth	return nil;
39*37da2899SCharles.Forsyth}
40*37da2899SCharles.Forsyth
41*37da2899SCharles.Forsyth
42*37da2899SCharles.Forsyth
43*37da2899SCharles.Forsythrunbuiltin(ctxt: ref Sh->Context, nil: Sh,
44*37da2899SCharles.Forsyth			cmd: list of ref Sh->Listnode, nil: int): string
45*37da2899SCharles.Forsyth{
46*37da2899SCharles.Forsyth	case (hd cmd).word {
47*37da2899SCharles.Forsyth	"report" =>
48*37da2899SCharles.Forsyth		if (len cmd < 4)
49*37da2899SCharles.Forsyth			rusage(ctxt);
50*37da2899SCharles.Forsyth		cmd = tl cmd;
51*37da2899SCharles.Forsyth		sevstr := (hd cmd).word;
52*37da2899SCharles.Forsyth		sev := sevtran(sevstr);
53*37da2899SCharles.Forsyth		if (sev < 0)
54*37da2899SCharles.Forsyth			rusage(ctxt);
55*37da2899SCharles.Forsyth		cmd = tl cmd;
56*37da2899SCharles.Forsyth		verb := (hd cmd).word;
57*37da2899SCharles.Forsyth		cmd = tl cmd;
58*37da2899SCharles.Forsyth		mtext := "";
59*37da2899SCharles.Forsyth		i := 0;
60*37da2899SCharles.Forsyth		while (len cmd) {
61*37da2899SCharles.Forsyth			msg :=  (hd cmd).word;
62*37da2899SCharles.Forsyth			cmd = tl cmd;
63*37da2899SCharles.Forsyth			if (i++ > 0)
64*37da2899SCharles.Forsyth				mtext = mtext + " ";
65*37da2899SCharles.Forsyth			mtext = mtext + msg;
66*37da2899SCharles.Forsyth		}
67*37da2899SCharles.Forsyth		if (tconf != nil)
68*37da2899SCharles.Forsyth			tconf.report(int sev, int verb, mtext);
69*37da2899SCharles.Forsyth		else
70*37da2899SCharles.Forsyth			sys->fprint(sys->fildes(2), "[itslib missing] %s %s\n", sevstr, mtext);
71*37da2899SCharles.Forsyth	}
72*37da2899SCharles.Forsyth	return nil;
73*37da2899SCharles.Forsyth}
74*37da2899SCharles.Forsyth
75*37da2899SCharles.Forsyth
76*37da2899SCharles.Forsythrunsbuiltin(nil: ref Sh->Context, nil: Sh,
77*37da2899SCharles.Forsyth			nil: list of ref Sh->Listnode): list of ref Listnode
78*37da2899SCharles.Forsyth{
79*37da2899SCharles.Forsyth	return nil;
80*37da2899SCharles.Forsyth}
81*37da2899SCharles.Forsyth
82*37da2899SCharles.Forsyth
83*37da2899SCharles.Forsythsevtran(sname: string): int
84*37da2899SCharles.Forsyth{
85*37da2899SCharles.Forsyth	SEVMAP :=  array[] of {"INF", "WRN", "ERR", "FTL"};
86*37da2899SCharles.Forsyth	for (i:=0; i<len SEVMAP; i++)
87*37da2899SCharles.Forsyth		if (sname == SEVMAP[i])
88*37da2899SCharles.Forsyth			return i;
89*37da2899SCharles.Forsyth	return -1;
90*37da2899SCharles.Forsyth}
91*37da2899SCharles.Forsyth
92*37da2899SCharles.Forsythrusage(ctxt: ref Context)
93*37da2899SCharles.Forsyth{
94*37da2899SCharles.Forsyth	ctxt.fail("usage", "usage: report INF|WRN|ERR|FTL verbosity message[...]");
95*37da2899SCharles.Forsyth}
96*37da2899SCharles.Forsyth
97