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

📄 devkbmap.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* *  keyboard map */#include	"u.h"#include	"../port/lib.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"../port/error.h"enum{	Qdir,	Qdata,};Dirtab kbmaptab[]={	".",		{Qdir, 0, QTDIR},	0,	0555,	"kbmap",	{Qdata, 0},		0,	0600,};#define	NKBFILE	sizeof(kbmaptab)/sizeof(kbmaptab[0])#define	KBLINELEN	(3*NUMSIZE+1)	/* t code val\n */static Chan *kbmapattach(char *spec){	return devattach(L'κ', spec);}static Walkqid*kbmapwalk(Chan *c, Chan *nc, char **name, int nname){	return devwalk(c, nc, name, nname, kbmaptab, NKBFILE, devgen);}static intkbmapstat(Chan *c, uchar *dp, int n){	return devstat(c, dp, n, kbmaptab, NKBFILE, devgen);}static Chan*kbmapopen(Chan *c, int omode){	if(!iseve())		error(Eperm);	return devopen(c, omode, kbmaptab, NKBFILE, devgen);}static voidkbmapclose(Chan *c){	if(c->aux){		free(c->aux);		c->aux = nil;	}}static longkbmapread(Chan *c, void *a, long n, vlong offset){	char *bp;	char tmp[KBLINELEN+1];	int t, sc;	Rune r;	if(c->qid.type == QTDIR)		return devdirread(c, a, n, kbmaptab, NKBFILE, devgen);	switch((int)(c->qid.path)){	case Qdata:		if(kbdgetmap(offset/KBLINELEN, &t, &sc, &r)) {			bp = tmp;			bp += readnum(0, bp, NUMSIZE, t, NUMSIZE);			bp += readnum(0, bp, NUMSIZE, sc, NUMSIZE);			bp += readnum(0, bp, NUMSIZE, r, NUMSIZE);			*bp++ = '\n';			*bp = 0;			n = readstr(offset%KBLINELEN, a, n, tmp);		} else			n = 0;		break;	default:		n=0;		break;	}	return n;}static longkbmapwrite(Chan *c, void *a, long n, vlong){	char line[100], *lp, *b;	int key, m, l;	Rune r;	if(c->qid.type == QTDIR)		error(Eperm);	switch((int)(c->qid.path)){	case Qdata:		b = a;		l = n;		lp = line;		if(c->aux){			strcpy(line, c->aux);			lp = line+strlen(line);			free(c->aux);			c->aux = nil;		}		while(--l >= 0) {			*lp++  = *b++;			if(lp[-1] == '\n' || lp == &line[sizeof(line)-1]) {				*lp = 0;				if(*line == 0)					error(Ebadarg);				if(*line == '\n' || *line == '#'){					lp = line;					continue;				}				lp = line;				while(*lp == ' ' || *lp == '\t')					lp++;				m = strtoul(line, &lp, 0);				key = strtoul(lp, &lp, 0);				while(*lp == ' ' || *lp == '\t')					lp++;				r = 0;				if(*lp == '\'' && lp[1])					chartorune(&r, lp+1);				else if(*lp == '^' && lp[1]){					chartorune(&r, lp+1);					if(0x40 <= r && r < 0x60)						r -= 0x40;					else						error(Ebadarg);				}else if(*lp == 'M' && ('1' <= lp[1] && lp[1] <= '5'))					r = 0xF900+lp[1]-'0';				else if(*lp>='0' && *lp<='9') /* includes 0x... */					r = strtoul(lp, &lp, 0);				else					error(Ebadarg);				kbdputmap(m, key, r);				lp = line;			}		}		if(lp != line){			l = lp-line;			c->aux = lp = smalloc(l+1);			memmove(lp, line, l);			lp[l] = 0;		}		break;	default:		error(Ebadusefd);	}	return n;}Dev kbmapdevtab = {	L'κ',	"kbmap",	devreset,	devinit,	devshutdown,	kbmapattach,	kbmapwalk,	kbmapstat,	kbmapopen,	devcreate,	kbmapclose,	kbmapread,	devbread,	kbmapwrite,	devbwrite,	devremove,	devwstat,};

⌨️ 快捷键说明

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