nlist.c

来自「lcc,一个可变目标c语言编译器的源码」· C语言 代码 · 共 105 行

C
105
字号
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "cpp.h"extern	int getopt(int, char *const *, const char *);extern	char	*optarg;extern	int	optind;extern	int	verbose;extern	int	Cplusplus;Nlist	*kwdefined;#define	NLSIZE	128static Nlist	*nlist[NLSIZE];struct	kwtab {	char	*kw;	int	val;	int	flag;} kwtab[] = {	"if",		KIF,		ISKW,	"ifdef",	KIFDEF,		ISKW,	"ifndef",	KIFNDEF,	ISKW,	"elif",		KELIF,		ISKW,	"else",		KELSE,		ISKW,	"endif",	KENDIF,		ISKW,	"include",	KINCLUDE,	ISKW,	"define",	KDEFINE,	ISKW,	"undef",	KUNDEF,		ISKW,	"line",		KLINE,		ISKW,	"error",	KERROR,		ISKW,	"pragma",	KPRAGMA,	ISKW,	"eval",		KEVAL,		ISKW,	"defined",	KDEFINED,	ISDEFINED+ISUNCHANGE,	"ident",	KPRAGMA,	ISKW,	/* treat like pragma (ignored) */	"__LINE__",	KLINENO,	ISMAC+ISUNCHANGE,	"__FILE__",	KFILE,		ISMAC+ISUNCHANGE,	"__DATE__",	KDATE,		ISMAC+ISUNCHANGE,	"__TIME__",	KTIME,		ISMAC+ISUNCHANGE,	"__STDC__",	KSTDC,		ISUNCHANGE,	NULL};unsigned long	namebit[077+1];Nlist 	*np;voidsetup_kwtab(void){	struct kwtab *kp;	Nlist *np;	Token t;	static Token deftoken[1] = {{ NAME, 0, 0, 0, 7, (uchar*)"defined" }};	static Tokenrow deftr = { deftoken, deftoken, deftoken+1, 1 };	for (kp=kwtab; kp->kw; kp++) {		t.t = (uchar*)kp->kw;		t.len = strlen(kp->kw);		np = lookup(&t, 1);		np->flag = kp->flag;		np->val = kp->val;		if (np->val == KDEFINED) {			kwdefined = np;			np->val = NAME;			np->vp = &deftr;			np->ap = 0;		}	}}Nlist *lookup(Token *tp, int install){	unsigned int h;	Nlist *np;	uchar *cp, *cpe;	h = 0;	for (cp=tp->t, cpe=cp+tp->len; cp<cpe; )		h += *cp++;	h %= NLSIZE;	np = nlist[h];	while (np) {		if (*tp->t==*np->name && tp->len==np->len 		 && strncmp((char*)tp->t, (char*)np->name, tp->len)==0)			return np;		np = np->next;	}	if (install) {		np = new(Nlist);		np->vp = NULL;		np->ap = NULL;		np->flag = 0;		np->val = 0;		np->len = tp->len;		np->name = newstring(tp->t, tp->len, 0);		np->next = nlist[h];		nlist[h] = np;		quickset(tp->t[0], tp->len>1? tp->t[1]:0);		return np;	}	return NULL;}

⌨️ 快捷键说明

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