⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 console.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
字号:
#include "u.h"#include "lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h"static IOQ consiq;static IOQ consoq;static int useuart;int	debug = 0;voidconsinit(void){	char *p;	int baud, port;	qinit(&consiq);	kbdinit();	if((p = getconf("console")) == 0 || cistrcmp(p, "cga") == 0)		return;	qinit(&consoq);	port = strtoul(p, 0, 0);	baud = 0;	if(p = getconf("baud"))		baud = strtoul(p, 0, 0);	if(baud == 0)		baud = 9600;	uartspecial(port, kbdchar, conschar, baud);	useuart = 1;	uartputs(&consoq, "\n", 1);}voidconsdrain(void){	if(useuart)		uartdrain();}voidkbdchar(int c){	c &= 0x7F;	if(c == 0x10)		panic("^p");	if(c == 0x12)		debug = !debug;	consiq.putc(&consiq, c);}intconschar(void){	return consoq.getc(&consoq);}voidconsputs(char* s, int n){	cgascreenputs(s, n);	if(useuart)		uartputs(&consoq, s, n);}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) > 15*HZ))	/* 15 seconds to first char */				return -2;			c = consiq.getc(&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 dotimeout){	int len, isdefault;	buf[0] = 0;	isdefault = (def && *def);	if(isdefault == 0)		dotimeout = 0;	for (;;) {		if(isdefault)			print("%s[default==%s]: ", prompt, def);		else			print("%s: ", prompt);		len = getline(buf, size, dotimeout);		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;}intsnprint(char *s, int n, char *fmt, ...){	return donprint(s, s+n, fmt, (&fmt+1)) - s;}intprint(char *fmt, ...){	char buf[PRINTSIZE];	int n;	n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;	consputs(buf, n);	return n;}voidpanic(char *fmt, ...){	int n;	char buf[PRINTSIZE];	consputs("panic: ", 7);	n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;	consputs(buf, n);	consputs("\n", 1);for(;;) splhi();	for(n=0; n<20; n++)		microdelay(500);	spllo();	consdrain();	i8042reset();	print("Takes a licking and keeps on ticking...\n");	for(;;)		idle();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -