forsyth20121205-174063a80cc13 years agoHistory
173 lines · 2.8 KB · C
RawDownload
#include "u.h"#include "lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h" static Queue*	consiq;static Queue*	consoq; voidbothputs(char *s, int n){	uartputs(s, n);	screenputs(s, n);} static void (*consputs)(char*, int) = bothputs;	/* or screenputs */ voidconsinit(void){	char *p;	int baud, port;	static int cgadone; 	p = getconf("console");	if(0)	if(p == 0 || strcmp(p, "lcd") == 0 || strcmp(p, "screen") == 0){		consiq = qopen(4*1024, 0, 0, 0);		consoq = qopen(8*1024, 0, 0, 0);		consputs = screenputs;		return;	}	if(p!=0 && strstr(p, "lcd") == 0)		consputs = bothputs;	else		consputs = uartputs;//consputs = screenputs;	port = 0;	if(p)		port = strtoul(p, 0, 0);	baud = 0;	if(p = getconf("baud"))		baud = strtoul(p, 0, 0);	if(baud == 0)		baud = 9600;	uartspecial(port, baud, &consiq, &consoq, kbdchar);} voidkbdchar(Queue *q, int c){	c &= 0x7F;	if(c == 0x10)		panic("^p");	qbputc(q, c);} static intgetline(char *buf, int size, int dotimeout){	int c, i=0;	ulong start;	char echo; 	for (;;) {		start = m->ticks;		do{			if(dotimeout && ((m->ticks - start) > 5*HZ))				return -2;			c = qbgetc(consiq);		}while(c == -1);		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;} intgetstr(char *prompt, char *buf, int size, char *def){	int len, isdefault; 	buf[0] = 0;	isdefault = (def && *def);	for (;;) {		if(isdefault)			print("%s[default==%s]: ", prompt, def);		else			print("%s: ", prompt);		len = getline(buf, size, isdefault);		switch(len){		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;} intsprint(char *s, char *fmt, ...){	return donprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s;} intprint(char *fmt, ...){	char buf[PRINTSIZE];	int n; 	if(consputs == 0)		return 0;	n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;	(*consputs)(buf, n);	return n;} voidpanic(char *fmt, ...){	char buf[PRINTSIZE];	int n; 	if(consputs){		(*consputs)("panic: ", 7);		n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;		(*consputs)(buf, n);		(*consputs)("\n", 1);	}	spllo();	for(;;)		idle();}