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