xref: /inferno-os/appl/lib/tcl_utils.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Tcl_Utils;
2*37da2899SCharles.Forsythinclude "sys.m";
3*37da2899SCharles.Forsythinclude "draw.m";
4*37da2899SCharles.Forsythinclude "tk.m";
5*37da2899SCharles.Forsythinclude "tcl.m";
6*37da2899SCharles.Forsythinclude "tcllib.m";
7*37da2899SCharles.Forsythinclude "utils.m";
8*37da2899SCharles.Forsyth
9*37da2899SCharles.Forsythbreak_it(s : string) : array of string {
10*37da2899SCharles.Forsyth	argv:= array[200] of string;
11*37da2899SCharles.Forsyth	buf : string;
12*37da2899SCharles.Forsyth	argc := 0;
13*37da2899SCharles.Forsyth	nc := 0;
14*37da2899SCharles.Forsyth   outer:
15*37da2899SCharles.Forsyth	for (i := 0; i < len s ; ) {
16*37da2899SCharles.Forsyth		case int s[i] {
17*37da2899SCharles.Forsyth		' ' or '\t' or '\n' =>
18*37da2899SCharles.Forsyth			if (nc > 0) {	# end of a word?
19*37da2899SCharles.Forsyth				argv[argc++] = buf;
20*37da2899SCharles.Forsyth				buf = nil;
21*37da2899SCharles.Forsyth				nc = 0;
22*37da2899SCharles.Forsyth			}
23*37da2899SCharles.Forsyth			i++;
24*37da2899SCharles.Forsyth		'{' =>
25*37da2899SCharles.Forsyth			if (s[i+1]=='}'){
26*37da2899SCharles.Forsyth				argv[argc++] = nil;
27*37da2899SCharles.Forsyth				buf = nil;
28*37da2899SCharles.Forsyth				nc = 0;
29*37da2899SCharles.Forsyth				i+=2;
30*37da2899SCharles.Forsyth			}else{
31*37da2899SCharles.Forsyth				nbra := 1;
32*37da2899SCharles.Forsyth				for (i++; i < len s; i++) {
33*37da2899SCharles.Forsyth					if (s[i] == '{')
34*37da2899SCharles.Forsyth						nbra++;
35*37da2899SCharles.Forsyth					else if (s[i] == '}') {
36*37da2899SCharles.Forsyth						nbra--;
37*37da2899SCharles.Forsyth					if (nbra == 0) {
38*37da2899SCharles.Forsyth							i++;
39*37da2899SCharles.Forsyth							continue outer;
40*37da2899SCharles.Forsyth						}
41*37da2899SCharles.Forsyth					}
42*37da2899SCharles.Forsyth					buf[nc++] = s[i];
43*37da2899SCharles.Forsyth				}
44*37da2899SCharles.Forsyth			}
45*37da2899SCharles.Forsyth		* =>
46*37da2899SCharles.Forsyth			buf[nc++] = s[i++];
47*37da2899SCharles.Forsyth		}
48*37da2899SCharles.Forsyth	}
49*37da2899SCharles.Forsyth	if (nc > 0)	# fix up last word if present
50*37da2899SCharles.Forsyth		argv[argc++] = buf;
51*37da2899SCharles.Forsyth	ret := array[argc] of string;
52*37da2899SCharles.Forsyth	ret[0:] = argv[0:argc];
53*37da2899SCharles.Forsyth	return ret;
54*37da2899SCharles.Forsyth}
55*37da2899SCharles.Forsyth
56*37da2899SCharles.Forsytharr_resize(argv : array of string) : array of string {
57*37da2899SCharles.Forsyth	ret := array[len argv + 25] of string;
58*37da2899SCharles.Forsyth	ret[0:]=argv;
59*37da2899SCharles.Forsyth	return ret;
60*37da2899SCharles.Forsyth}
61*37da2899SCharles.Forsyth
62