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