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

📄 charset.c

📁 早期freebsd实现
💻 C
字号:
/* * Functions to define the character set * and do things specific to the character set. */#include "less.h"/* * Predefined character sets, * selected by the LESSCHARSET environment variable. */struct charset {	char *name;	char *desc;} charsets[] = {	{ "ascii",	"8bcccbcc18b95.b"	},	{ "latin1",	"8bcccbcc18b95.33b."	},	{ NULL }};#define	IS_BINARY_CHAR	01#define	IS_CONTROL_CHAR	02static char chardef[256];static char *binfmt = "\\%o";public int binattr = BLINK;extern char *getenv();/* * Define a charset, given a description string. * The string consists of 256 letters, * one for each character in the charset. * If the string is shorter than 256 letters, missing letters * are taken to be identical to the last one. * A decimal number followed by a letter is taken to be a  * repetition of the letter. * * Each letter is one of: *	. normal character *	b binary character *	c control character */	static voidichardef(s)	char *s;{	register char *cp;	register int n;	register char v;	n = 0;	cp = chardef;	while (*s != '\0')	{		switch (*s++)		{		case '.':			v = 0;			break;		case 'c':			v = IS_CONTROL_CHAR;			break;		case 'b':			v = IS_BINARY_CHAR|IS_CONTROL_CHAR;			break;		case '0': case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':			n = (10 * n) + (s[-1] - '0');			continue;		default:			error("invalid chardef", NULL_PARG);			quit(1);			/*NOTREACHED*/		}		do		{			if (cp >= chardef + sizeof(chardef))			{				error("chardef longer than 256", NULL_PARG);				quit(1);				/*NOTREACHED*/			}			*cp++ = v;		} while (--n > 0);		n = 0;	}	while (cp < chardef + sizeof(chardef))		*cp++ = v;}/* * Define a charset, given a charset name. * The valid charset names are listed in the "charsets" array. */	static inticharset(name)	register char *name;{	register struct charset *p;	if (name == NULL || *name == '\0')		return (0);	for (p = charsets;  p->name != NULL;  p++)	{		if (strcmp(name, p->name) == 0)		{			ichardef(p->desc);			return (1);		}	}	error("invalid charset name", NULL_PARG);	quit(1);	/*NOTREACHED*/}/* * Initialize charset data structures. */	public voidinit_charset(){	register char *s;	/*	 * Try environment variable LESSCHARSET.	 * If LESSCHARSET is not set, try LESSCHARDEF.	 * If LESSCHARDEF is not set, default to "ascii" charset.	 */	s = getenv("LESSCHARSET");	if (icharset(s))		return;	s = getenv("LESSCHARDEF");	if (s != NULL && *s != '\0')	{		ichardef(s);		return;	}	(void) icharset("ascii");	s = getenv("LESSBINFMT");	if (s != NULL && *s != '\0')	{		if (*s == '*')		{			switch (s[1])			{			case 'd':  binattr = BOLD;      break;			case 'k':  binattr = BLINK;     break;			case 'u':  binattr = UNDERLINE; break;			default:   binattr = NORMAL;    break;			}			s += 2;		}		if (*s != '\0')			binfmt = s;	}}/* * Is a given character a "binary" character? */	public intbinary_char(c)	int c;{	return (chardef[c] & IS_BINARY_CHAR);}/* * Is a given character a "control" character? */	public intcontrol_char(c)	int c;{	return (chardef[c] & IS_CONTROL_CHAR);}/* * Return the printable form of a character. * For example, in the "ascii" charset '\3' is printed as "^C". */	public char *prchar(c)	int c;{	static char buf[8];	if (!control_char(c))		sprintf(buf, "%c", c);	else if (!control_char(c ^ 0100))		sprintf(buf, "^%c", c ^ 0100);	else		sprintf(buf, binfmt, c);	return (buf);}

⌨️ 快捷键说明

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