xref: /inferno-os/appl/cmd/tclsh.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Tclsh;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythinclude "draw.m";
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "bufio.m";
9*37da2899SCharles.Forsyth	bufmod : Bufio;
10*37da2899SCharles.ForsythIobuf : import bufmod;
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsythinclude "tk.m";
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsythinclude "../lib/tcl.m";
15*37da2899SCharles.Forsyth	tcl : Tcl_Core;
16*37da2899SCharles.Forsyth
17*37da2899SCharles.ForsythTclsh: module {
18*37da2899SCharles.Forsyth	init:	fn(ctxt: ref Draw->Context, argv: list of string);
19*37da2899SCharles.Forsyth};
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsythinit(ctxt: ref Draw->Context, argv : list of string){
22*37da2899SCharles.Forsyth	sys=load Sys Sys->PATH;
23*37da2899SCharles.Forsyth	tcl=load Tcl_Core Tcl_Core->PATH;
24*37da2899SCharles.Forsyth	if (tcl==nil){
25*37da2899SCharles.Forsyth		sys->print("Cannot load Tcl (%r)\n");
26*37da2899SCharles.Forsyth		exit;
27*37da2899SCharles.Forsyth	}
28*37da2899SCharles.Forsyth	bufmod=load Bufio Bufio->PATH;
29*37da2899SCharles.Forsyth	if (bufmod==nil){
30*37da2899SCharles.Forsyth		sys->print("Cannot load Bufio (%r)\n");
31*37da2899SCharles.Forsyth		exit;
32*37da2899SCharles.Forsyth	}
33*37da2899SCharles.Forsyth	lines:=chan of string;
34*37da2899SCharles.Forsyth	tcl->init(ctxt,argv);
35*37da2899SCharles.Forsyth	new_inp := "tcl%";
36*37da2899SCharles.Forsyth	spawn tcl->grab_lines(nil,nil,lines);
37*37da2899SCharles.Forsyth	for(;;){
38*37da2899SCharles.Forsyth		alt{
39*37da2899SCharles.Forsyth			line := <-lines =>
40*37da2899SCharles.Forsyth				line = tcl->prepass(line);
41*37da2899SCharles.Forsyth				msg:= tcl->evalcmd(line,0);
42*37da2899SCharles.Forsyth				if (msg!=nil)
43*37da2899SCharles.Forsyth					sys->print("%s\n",msg);
44*37da2899SCharles.Forsyth				sys->print("%s ", new_inp);
45*37da2899SCharles.Forsyth				tcl->clear_error();
46*37da2899SCharles.Forsyth		}
47*37da2899SCharles.Forsyth	}
48*37da2899SCharles.Forsyth}
49