xref: /inferno-os/appl/cmd/promptstring.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.ForsythRAWON_STR := "*";
2*37da2899SCharles.Forsyth
3*37da2899SCharles.ForsythRAWON : con 0;
4*37da2899SCharles.ForsythRAWOFF : con 1;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythpromptstring(prompt, def: string, mode: int): string
7*37da2899SCharles.Forsyth{
8*37da2899SCharles.Forsyth	if(mode == RAWON || def == nil || def == "")
9*37da2899SCharles.Forsyth		sys->fprint(stdout, "%s: ", prompt);
10*37da2899SCharles.Forsyth	else
11*37da2899SCharles.Forsyth		sys->fprint(stdout, "%s [%s]: ", prompt, def);
12*37da2899SCharles.Forsyth	(eof, resp) := readline(stdin, mode);
13*37da2899SCharles.Forsyth	if(eof)
14*37da2899SCharles.Forsyth		exit;
15*37da2899SCharles.Forsyth	if(resp == "")
16*37da2899SCharles.Forsyth		resp = def;
17*37da2899SCharles.Forsyth	return resp;
18*37da2899SCharles.Forsyth}
19*37da2899SCharles.Forsyth
20*37da2899SCharles.Forsythreadline(fd: ref Sys->FD, mode: int): (int, string)
21*37da2899SCharles.Forsyth{
22*37da2899SCharles.Forsyth	i: int;
23*37da2899SCharles.Forsyth	eof: int;
24*37da2899SCharles.Forsyth	fdctl: ref Sys->FD;
25*37da2899SCharles.Forsyth
26*37da2899SCharles.Forsyth	eof = 0;
27*37da2899SCharles.Forsyth	buf := array[128] of byte;
28*37da2899SCharles.Forsyth	tmp := array[128] of byte;
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsyth	if(mode == RAWON){
31*37da2899SCharles.Forsyth		fdctl = sys->open("/dev/consctl", sys->OWRITE);
32*37da2899SCharles.Forsyth		if(fdctl == nil || sys->write(fdctl,array of byte "rawon",5) != 5){
33*37da2899SCharles.Forsyth			sys->fprint(stderr, "unable to change console mode");
34*37da2899SCharles.Forsyth			return (1,nil);
35*37da2899SCharles.Forsyth		}
36*37da2899SCharles.Forsyth	}
37*37da2899SCharles.Forsyth
38*37da2899SCharles.Forsyth	for(sofar := 0; sofar < 128; sofar += i){
39*37da2899SCharles.Forsyth		i = sys->read(fd, tmp, 128 - sofar);
40*37da2899SCharles.Forsyth		if(i <= 0){
41*37da2899SCharles.Forsyth			eof = 1;
42*37da2899SCharles.Forsyth			break;
43*37da2899SCharles.Forsyth		}
44*37da2899SCharles.Forsyth		if(tmp[i-1] == byte '\n'){
45*37da2899SCharles.Forsyth			for(j := 0; j < i-1; j++){
46*37da2899SCharles.Forsyth				buf[sofar+j] = tmp[j];
47*37da2899SCharles.Forsyth				if(mode == RAWON && RAWON_STR != nil)
48*37da2899SCharles.Forsyth				   sys->write(stdout,array of byte RAWON_STR,1);
49*37da2899SCharles.Forsyth			}
50*37da2899SCharles.Forsyth			sofar += j;
51*37da2899SCharles.Forsyth			if(mode == RAWON)
52*37da2899SCharles.Forsyth				sys->write(stdout,array of byte "\n",1);
53*37da2899SCharles.Forsyth			break;
54*37da2899SCharles.Forsyth		}
55*37da2899SCharles.Forsyth		else {
56*37da2899SCharles.Forsyth			for(j := 0; j < i; j++){
57*37da2899SCharles.Forsyth				buf[sofar+j] = tmp[j];
58*37da2899SCharles.Forsyth				if(mode == RAWON && RAWON_STR != nil)
59*37da2899SCharles.Forsyth				   sys->write(stdout,array of byte RAWON_STR,1);
60*37da2899SCharles.Forsyth			}
61*37da2899SCharles.Forsyth		}
62*37da2899SCharles.Forsyth	}
63*37da2899SCharles.Forsyth	if(mode == RAWON)
64*37da2899SCharles.Forsyth		sys->write(fdctl,array of byte "rawoff",6);
65*37da2899SCharles.Forsyth	return (eof, string buf[0:sofar]);
66*37da2899SCharles.Forsyth}
67