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

📄 kb_encode.c

📁 早期freebsd实现
💻 C
字号:
/* * Copyright (c) 1992, 1993 *	The Regents of the University of California.  All rights reserved. * * This code is derived from software contributed to Berkeley by * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * from: $Hdr: kb_encode.c,v 4.300 91/06/09 06:14:51 root Rel41 $ SONY * *	@(#)kb_encode.c	8.1 (Berkeley) 6/10/93 */#ifdef IPC_MRX#include <sys/param.h>#include <sys/systm.h>#include <sys/types.h>#include <sys/ioctl.h>#include <news3400/iop/keyboard.h>#include <news3400/iop/kbreg.h>#else#include <sys/param.h>#include <sys/systm.h>#include <sys/types.h>#include <sys/ioctl.h>#include <news3400/iop/keyboard.h>#include <news3400/iop/kbreg.h>#endif#include <sys/malloc.h>extern int tmode;extern int country;extern Pfk_table pfk_table[];extern Pfk_table pfk_init[];extern Key_table *key_table_addr;int	kbd_status;int	shifttype;extern int iscaps;static kbd_shift(), kbd_pfunc(), kbd_normal(), put_kana();/* *	kbd_encode(c) *		int c;		keyboard address code * *	kbd_encode() converts keyboard address code to character code. *	kbd_encode() calls back machine dependent function * *		put_code(buf, cnt) *			char *buf;	encoded characters *			int cnt;	character count * *	to store encoded data. */kbd_encode(c)	register int c;{	register Key_table *kp;	register int c_mask;	c_mask = c & 0x7f;	c &= 0xff;	if (c_mask > N_KEY)		return (0);	kp = &key_table_addr[c_mask];	if (c & OFF)		kp->key_flags &= ~KEY_PRESS;	else if ((kp->key_flags & KEY_PRESS) && 	    ((kbd_status & KBD_NOTREPT) || (kp->key_flags & NOT_REPT)))		return (0);	else		kp->key_flags |= KEY_PRESS;	if (kp->key_flags & (PSH_SHFT|SW_SHFT)) {		kbd_shift(c);		return (0);	}	if ((kp->key_flags & ALT_FUNC) && (kbd_status & KBD_ALT) ||	    (kp->key_flags & PRG_FUNC))		return (kbd_pfunc(c));	return (kbd_normal(c));}#define KFLAGSW(a, b)	((a) ? (kbd_status |= (b)) : (kbd_status &= ~(b)))#define	LOCKTYPE(a, b)	(shifttype = ((a) ? (a) : (b)))statickbd_shift(c)	register int c;{	register Key_table *kp = &key_table_addr[c & 0x7f];	register int push = (c & OFF) == 0;	switch (kp->normal_code) {	case S_CTRL:		KFLAGSW(push, KBD_CTRL);		break;	case S_RSHFT:		KFLAGSW(push, KBD_RSHIFT);		break;	case S_LSHFT:		KFLAGSW(push, KBD_LSHIFT);		break;	case S_ALT:		KFLAGSW(push, KBD_ALT);		break;	case S_CAPS:		if (push) {			kbd_status ^= KBD_CAPS;			LOCKTYPE(iscaps, CAPSLOCK);		}		break;	case S_AN:		if (push) {			kbd_status &= ~KBD_KANA;		}		break;	case S_KANA:		if (push) {			switch (country) {			case K_JAPANESE_J:				kbd_status |= KBD_KANA;			default:				break;			}		}		break;	case S_ALTGR:		KFLAGSW(push, KBD_ALTGR);		break;	default:		break;	}	return (0);}statickbd_pfunc(c)	register int c;{	register Pfk_table *kp;	if (c & OFF)		return (0);	for (kp = pfk_table; kp < pfk_table + N_PFK; kp++) {		if (kp->pfk_addr != c)			continue;		if (kbd_status & KBD_SHIFT)			return (put_code(kp->pfk_shift.key_string,			    kp->pfk_shift.key_length));		return (put_code(kp->pfk_normal.key_string,		    kp->pfk_normal.key_length));	}	return (0);}#define	PUT(cond, code, len)		((cond) ? put_code(code, len) : 0)#define	PUT_KANA(cond, code, len)	((cond) ? put_kana(code, len) : 0)statickbd_normal(c)	int c;{	register Key_table *kp = &key_table_addr[c & 0x7f];	if (c & OFF)		return (0);	if (kbd_status & KBD_ALT)		return (PUT(kp->key_flags & A, &kp->alt_code, 1));	if (kbd_status & KBD_CTRL)		return (PUT(kp->key_flags & C, &kp->ctrl_code, 1));	if (kbd_status & KBD_ALTGR)		return (PUT(kp->key_flags & G, &kp->kana_code, 1));	if (kbd_status & KBD_KANA) {		if (kbd_status & KBD_SHIFT)			return (PUT_KANA(kp->key_flags & J, &kp->kshft_code, 1));		return (PUT_KANA(kp->key_flags & K, &kp->kana_code, 1));	}	if (kbd_status & KBD_CAPS) {		if ((kbd_status & KBD_SHIFT) && (kp->key_flags & S)) {			if (kp->key_flags & CAP_LOCK) {				switch (shifttype) {				case CAPSLOCK:					return (put_code(&kp->shift_code, 1));				case SHIFTLOCK:				case SHIFTLOCK2:					return (put_code(&kp->normal_code, 1));				default:					return (0);				}			}			switch (shifttype) {			case CAPSLOCK:			case SHIFTLOCK:				return (put_code(&kp->shift_code, 1));			case SHIFTLOCK2:				return (put_code(&kp->normal_code, 1));			default:				return (0);			}		}		if (kp->key_flags & N) {			if (kp->key_flags & CAP_LOCK)				return (put_code(&kp->shift_code, 1));			switch (shifttype) {			case CAPSLOCK:			case SHIFTLOCK:				return (put_code(&kp->normal_code, 1));			case SHIFTLOCK2:				return (put_code(&kp->shift_code, 1));			default:				return (0);			}		}	}	if (kbd_status & KBD_SHIFT) 		return (PUT(kp->key_flags & S, &kp->shift_code, 1));	return (PUT(kp->key_flags & N, &kp->normal_code, 1));}kbd_string(cmd, p)	int cmd;	register Pfk_string *p;{	register Key_string *pk;	if (p->pfk_num < 0 || p->pfk_num >= N_PFK)		return (0);	switch (p->pfk_shift) {	case PF_NORMAL:		pk = &pfk_table[p->pfk_num].pfk_normal;		break;	case PF_SHIFT:		pk = &pfk_table[p->pfk_num].pfk_shift;		break;	default:		return (0);	}	switch (cmd) {	case KIOCSETS:		if (pk->key_string != NULL) {			free(pk->key_string, M_DEVBUF);			pk->key_string = NULL;			pk->key_length = 0;		}		if (pk->key_length = p->pfk_string.key_length) {			pk->key_string =			    (char *)malloc(p->pfk_string.key_length, M_DEVBUF, M_WAITOK);			bcopy(p->pfk_string.key_string, pk->key_string,			    p->pfk_string.key_length);		} else			pk->key_string = NULL;		bcopy(p->pfk_string.key_string, pk->key_string,		    p->pfk_string.key_length);		pk->key_length = p->pfk_string.key_length;		break;	case KIOCGETS:		p->pfk_string.key_length =		    min(p->pfk_string.key_length, pk->key_length);		bcopy(pk->key_string, p->pfk_string.key_string,		    p->pfk_string.key_length);		break;	default:		return (0);	}	return (0);}kbd_init(){	int i;	Pfk_string pfk_buf;	for (i = 0; i < N_PFK; i++) {		pfk_table[i].pfk_addr = pfk_init[i].pfk_addr;		if (pfk_init[i].pfk_normal.key_length > 0) {			pfk_buf.pfk_num = i;			pfk_buf.pfk_shift = PF_NORMAL;			pfk_buf.pfk_string = pfk_init[i].pfk_normal;			kbd_string(KIOCSETS, &pfk_buf);		}		if (pfk_init[i].pfk_shift.key_length > 0) {			pfk_buf.pfk_num = i;			pfk_buf.pfk_shift = PF_SHIFT;			pfk_buf.pfk_string = pfk_init[i].pfk_shift;			kbd_string(KIOCSETS, &pfk_buf);		}	}	kbd_status = 0;}kbd_repeat(f)	int f;{	if (f)		kbd_status &= ~KBD_NOTREPT;	else		kbd_status |= KBD_NOTREPT;	return (0);}staticput2char(c1, c2)	int c1, c2;{	char buf[2];	buf[0] = c1;	buf[1] = c2;	return (put_code(buf, 2));}#define	SS2		0x8estaticput_kana(s, len)	register u_char *s;	int len;{	register int i;	register u_char *p;	u_char eucbuf[8];	if (len <= 0)		return (0);#ifdef KM_EUC	if ((tmode == KM_EUC) && ((*s >= 0xa1) && (*s <= 0xdf))) {		p = eucbuf;		for (i = len; i > 0; i--) {			*p++ = SS2;			*p++ = *s++;		}		return (put_code(eucbuf, len * 2));	}#endif /* KM_EUC */	return (put_code(s, len));}

⌨️ 快捷键说明

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