void panic(char *fmt, ...) { int n; va_list arg; char buf[PRINTSIZE]; strcpy(buf, "panic: "); va_start(arg, fmt); n = vseprint(buf+7, buf+sizeof(buf), fmt, arg) - buf; va_end(arg); buf[n] = '\n'; consputs(buf, n+1); //floppymemwrite(); splhi(); for(;;); if(etherdetach) etherdetach(); if(sddetach) sddetach(); consputs("\nPress almost any key to reset...", 32); spllo(); while(consiq.getc(&consiq) == -1) ; warp86(nil, 0); }
/* * Print a string on the console. Convert \n to \r\n for serial * line consoles. Locking of the queues is left up to the screen * or uart code. Multi-line messages to serial consoles may get * interspersed with other messages. */ static void putstrn0(char *str, int n, int usewrite) { kmesgputs(str, n); if(consputs != nil) consputs(str, n); if(consuartputs != nil) consuartputs(str, n); }
int print(char *fmt, ...) { int n; va_list arg; char buf[PRINTSIZE]; va_start(arg, fmt); n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf; va_end(arg); consputs(buf, n); return n; }
int getstr(char *prompt, char *buf, int size, char *def, int timeout) { int len, isdefault; char pbuf[PRINTSIZE]; buf[0] = 0; isdefault = (def && *def); if(isdefault == 0){ timeout = 0; sprint(pbuf, "%s: ", prompt); } else if(timeout) sprint(pbuf, "%s[default==%s (%ds timeout)]: ", prompt, def, timeout); else sprint(pbuf, "%s[default==%s]: ", prompt, def); for (;;) { print(pbuf); len = getline(buf, size, timeout); switch(len){ case 0: /* RETURN */ if(isdefault) break; continue; case -1: /* ^U typed */ continue; case -2: /* timeout, use default */ consputs("\n", 1); len = 0; break; default: break; } if(len >= size){ print("line too long\n"); continue; } break; } if(len == 0 && isdefault) strcpy(buf, def); return 0; }
static int getline(char *buf, int size, int timeout) { int c, i=0; uint32_t start; char echo; for (;;) { start = m->ticks; do{ /* timeout seconds to first char */ if(timeout && ((m->ticks - start) > timeout*HZ)) return -2; c = consiq.getc(&consiq); }while(c == -1); timeout = 0; if(c == '\r') c = '\n'; /* turn carriage return into newline */ if(c == '\177') c = '\010'; /* turn delete into backspace */ if(c == '\025') echo = '\n'; /* echo ^U as a newline */ else echo = c; consputs(&echo, 1); if(c == '\010'){ if(i > 0) i--; /* bs deletes last character */ continue; } /* a newline ends a line */ if (c == '\n') break; /* ^U wipes out the line */ if (c =='\025') return -1; if(i == size) return size; buf[i++] = c; } buf[i] = 0; return i; }