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