1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "dat.h"
5*74a4d8c2SCharles.Forsyth #include "fns.h"
6*74a4d8c2SCharles.Forsyth #include "io.h"
7*74a4d8c2SCharles.Forsyth
8*74a4d8c2SCharles.Forsyth static Queue* consiq;
9*74a4d8c2SCharles.Forsyth static Queue* consoq;
10*74a4d8c2SCharles.Forsyth
11*74a4d8c2SCharles.Forsyth void
bothputs(char * s,int n)12*74a4d8c2SCharles.Forsyth bothputs(char *s, int n)
13*74a4d8c2SCharles.Forsyth {
14*74a4d8c2SCharles.Forsyth uartputs(s, n);
15*74a4d8c2SCharles.Forsyth // cgascreenputs(s, n);
16*74a4d8c2SCharles.Forsyth }
17*74a4d8c2SCharles.Forsyth
18*74a4d8c2SCharles.Forsyth static void (*consputs)(char*, int) = 0;
19*74a4d8c2SCharles.Forsyth
20*74a4d8c2SCharles.Forsyth void
consinit(void)21*74a4d8c2SCharles.Forsyth consinit(void)
22*74a4d8c2SCharles.Forsyth {
23*74a4d8c2SCharles.Forsyth char *p;
24*74a4d8c2SCharles.Forsyth int baud, port;
25*74a4d8c2SCharles.Forsyth static int cgadone;
26*74a4d8c2SCharles.Forsyth
27*74a4d8c2SCharles.Forsyth if((p = getconf("console")) == 0 || strcmp(p, "lcd") == 0 || strcmp(p, "screen") == 0){
28*74a4d8c2SCharles.Forsyth consiq = qopen(4*1024, 0, 0, 0);
29*74a4d8c2SCharles.Forsyth consoq = qopen(8*1024, 0, 0, 0);
30*74a4d8c2SCharles.Forsyth consputs = uartputs;
31*74a4d8c2SCharles.Forsyth if(!cgadone) {
32*74a4d8c2SCharles.Forsyth cgadone = 1;
33*74a4d8c2SCharles.Forsyth //screeninit();
34*74a4d8c2SCharles.Forsyth //kbdinit();
35*74a4d8c2SCharles.Forsyth port = 1;
36*74a4d8c2SCharles.Forsyth baud = 9600;
37*74a4d8c2SCharles.Forsyth uartspecial(port, baud, &consiq, &consoq, kbdchar);
38*74a4d8c2SCharles.Forsyth }
39*74a4d8c2SCharles.Forsyth return;
40*74a4d8c2SCharles.Forsyth }
41*74a4d8c2SCharles.Forsyth if(0 || strstr(p, "lcd") == 0)
42*74a4d8c2SCharles.Forsyth consputs = bothputs;
43*74a4d8c2SCharles.Forsyth else
44*74a4d8c2SCharles.Forsyth consputs = uartputs;
45*74a4d8c2SCharles.Forsyth
46*74a4d8c2SCharles.Forsyth port = strtoul(p, 0, 0);
47*74a4d8c2SCharles.Forsyth baud = 0;
48*74a4d8c2SCharles.Forsyth if(p = getconf("baud"))
49*74a4d8c2SCharles.Forsyth baud = strtoul(p, 0, 0);
50*74a4d8c2SCharles.Forsyth if(baud == 0)
51*74a4d8c2SCharles.Forsyth baud = 9600;
52*74a4d8c2SCharles.Forsyth uartspecial(port, baud, &consiq, &consoq, kbdchar);
53*74a4d8c2SCharles.Forsyth }
54*74a4d8c2SCharles.Forsyth
55*74a4d8c2SCharles.Forsyth void
kbdchar(Queue * q,int c)56*74a4d8c2SCharles.Forsyth kbdchar(Queue *q, int c)
57*74a4d8c2SCharles.Forsyth {
58*74a4d8c2SCharles.Forsyth c &= 0x7F;
59*74a4d8c2SCharles.Forsyth if(c == 0x10)
60*74a4d8c2SCharles.Forsyth panic("^p");
61*74a4d8c2SCharles.Forsyth if(q == 0) {
62*74a4d8c2SCharles.Forsyth if(consiq != 0)
63*74a4d8c2SCharles.Forsyth qbputc(consiq, c);
64*74a4d8c2SCharles.Forsyth } else
65*74a4d8c2SCharles.Forsyth qbputc(q, c);
66*74a4d8c2SCharles.Forsyth }
67*74a4d8c2SCharles.Forsyth
68*74a4d8c2SCharles.Forsyth static int
getline(char * buf,int size,int dotimeout)69*74a4d8c2SCharles.Forsyth getline(char *buf, int size, int dotimeout)
70*74a4d8c2SCharles.Forsyth {
71*74a4d8c2SCharles.Forsyth int c, i=0;
72*74a4d8c2SCharles.Forsyth ulong start;
73*74a4d8c2SCharles.Forsyth char echo;
74*74a4d8c2SCharles.Forsyth
75*74a4d8c2SCharles.Forsyth for (;;) {
76*74a4d8c2SCharles.Forsyth start = m->ticks;
77*74a4d8c2SCharles.Forsyth do{
78*74a4d8c2SCharles.Forsyth if(dotimeout && ((m->ticks - start) > 5*HZ))
79*74a4d8c2SCharles.Forsyth return -2;
80*74a4d8c2SCharles.Forsyth c = qbgetc(consiq);
81*74a4d8c2SCharles.Forsyth }while(c == -1);
82*74a4d8c2SCharles.Forsyth if(c == '\r')
83*74a4d8c2SCharles.Forsyth c = '\n'; /* turn carriage return into newline */
84*74a4d8c2SCharles.Forsyth if(c == '\177')
85*74a4d8c2SCharles.Forsyth c = '\010'; /* turn delete into backspace */
86*74a4d8c2SCharles.Forsyth if(c == '\025')
87*74a4d8c2SCharles.Forsyth echo = '\n'; /* echo ^U as a newline */
88*74a4d8c2SCharles.Forsyth else
89*74a4d8c2SCharles.Forsyth echo = c;
90*74a4d8c2SCharles.Forsyth (*consputs)(&echo, 1);
91*74a4d8c2SCharles.Forsyth
92*74a4d8c2SCharles.Forsyth if(c == '\010'){
93*74a4d8c2SCharles.Forsyth if(i > 0)
94*74a4d8c2SCharles.Forsyth i--; /* bs deletes last character */
95*74a4d8c2SCharles.Forsyth continue;
96*74a4d8c2SCharles.Forsyth }
97*74a4d8c2SCharles.Forsyth /* a newline ends a line */
98*74a4d8c2SCharles.Forsyth if (c == '\n')
99*74a4d8c2SCharles.Forsyth break;
100*74a4d8c2SCharles.Forsyth /* ^U wipes out the line */
101*74a4d8c2SCharles.Forsyth if (c =='\025')
102*74a4d8c2SCharles.Forsyth return -1;
103*74a4d8c2SCharles.Forsyth if(i == size)
104*74a4d8c2SCharles.Forsyth return size;
105*74a4d8c2SCharles.Forsyth buf[i++] = c;
106*74a4d8c2SCharles.Forsyth }
107*74a4d8c2SCharles.Forsyth buf[i] = 0;
108*74a4d8c2SCharles.Forsyth return i;
109*74a4d8c2SCharles.Forsyth }
110*74a4d8c2SCharles.Forsyth
111*74a4d8c2SCharles.Forsyth int
getstr(char * prompt,char * buf,int size,char * def)112*74a4d8c2SCharles.Forsyth getstr(char *prompt, char *buf, int size, char *def)
113*74a4d8c2SCharles.Forsyth {
114*74a4d8c2SCharles.Forsyth int len, isdefault;
115*74a4d8c2SCharles.Forsyth
116*74a4d8c2SCharles.Forsyth buf[0] = 0;
117*74a4d8c2SCharles.Forsyth isdefault = (def && *def);
118*74a4d8c2SCharles.Forsyth for (;;) {
119*74a4d8c2SCharles.Forsyth if(isdefault)
120*74a4d8c2SCharles.Forsyth print("%s[default==%s]: ", prompt, def);
121*74a4d8c2SCharles.Forsyth else
122*74a4d8c2SCharles.Forsyth print("%s: ", prompt);
123*74a4d8c2SCharles.Forsyth len = getline(buf, size, isdefault);
124*74a4d8c2SCharles.Forsyth switch(len){
125*74a4d8c2SCharles.Forsyth case -1:
126*74a4d8c2SCharles.Forsyth /* ^U typed */
127*74a4d8c2SCharles.Forsyth continue;
128*74a4d8c2SCharles.Forsyth case -2:
129*74a4d8c2SCharles.Forsyth /* timeout, use default */
130*74a4d8c2SCharles.Forsyth (*consputs)("\n", 1);
131*74a4d8c2SCharles.Forsyth len = 0;
132*74a4d8c2SCharles.Forsyth break;
133*74a4d8c2SCharles.Forsyth default:
134*74a4d8c2SCharles.Forsyth break;
135*74a4d8c2SCharles.Forsyth }
136*74a4d8c2SCharles.Forsyth if(len >= size){
137*74a4d8c2SCharles.Forsyth print("line too long\n");
138*74a4d8c2SCharles.Forsyth continue;
139*74a4d8c2SCharles.Forsyth }
140*74a4d8c2SCharles.Forsyth break;
141*74a4d8c2SCharles.Forsyth }
142*74a4d8c2SCharles.Forsyth if(len == 0 && isdefault)
143*74a4d8c2SCharles.Forsyth strcpy(buf, def);
144*74a4d8c2SCharles.Forsyth return 0;
145*74a4d8c2SCharles.Forsyth }
146*74a4d8c2SCharles.Forsyth
147*74a4d8c2SCharles.Forsyth int
sprint(char * s,char * fmt,...)148*74a4d8c2SCharles.Forsyth sprint(char *s, char *fmt, ...)
149*74a4d8c2SCharles.Forsyth {
150*74a4d8c2SCharles.Forsyth return donprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s;
151*74a4d8c2SCharles.Forsyth }
152*74a4d8c2SCharles.Forsyth
153*74a4d8c2SCharles.Forsyth int
print(char * fmt,...)154*74a4d8c2SCharles.Forsyth print(char *fmt, ...)
155*74a4d8c2SCharles.Forsyth {
156*74a4d8c2SCharles.Forsyth char buf[PRINTSIZE];
157*74a4d8c2SCharles.Forsyth int n;
158*74a4d8c2SCharles.Forsyth
159*74a4d8c2SCharles.Forsyth if(consputs == 0)
160*74a4d8c2SCharles.Forsyth return 0;
161*74a4d8c2SCharles.Forsyth n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
162*74a4d8c2SCharles.Forsyth (*consputs)(buf, n);
163*74a4d8c2SCharles.Forsyth return n;
164*74a4d8c2SCharles.Forsyth }
165*74a4d8c2SCharles.Forsyth
166*74a4d8c2SCharles.Forsyth void
panic(char * fmt,...)167*74a4d8c2SCharles.Forsyth panic(char *fmt, ...)
168*74a4d8c2SCharles.Forsyth {
169*74a4d8c2SCharles.Forsyth char buf[PRINTSIZE];
170*74a4d8c2SCharles.Forsyth int n;
171*74a4d8c2SCharles.Forsyth
172*74a4d8c2SCharles.Forsyth if(consputs){
173*74a4d8c2SCharles.Forsyth (*consputs)("panic: ", 7);
174*74a4d8c2SCharles.Forsyth n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
175*74a4d8c2SCharles.Forsyth (*consputs)(buf, n);
176*74a4d8c2SCharles.Forsyth (*consputs)("\n", 1);
177*74a4d8c2SCharles.Forsyth }
178*74a4d8c2SCharles.Forsyth spllo();
179*74a4d8c2SCharles.Forsyth for(;;)
180*74a4d8c2SCharles.Forsyth idle();
181*74a4d8c2SCharles.Forsyth }
182