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

📄 lex.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <ctype.h>#define	EXTERN#include "a.h"#include "y.tab.h"voidmain(int argc, char *argv[]){	char *p;	int nout, nproc, status, i, c;	thechar = '8';	thestring = "386";	memset(debug, 0, sizeof(debug));	cinit();	outfile = 0;	include[ninclude++] = ".";	ARGBEGIN {	default:		c = ARGC();		if(c >= 0 || c < sizeof(debug))			debug[c] = 1;		break;	case 'o':		outfile = ARGF();		break;	case 'D':		p = ARGF();		if(p)			Dlist[nDlist++] = p;		break;	case 'I':		p = ARGF();		setinclude(p);		break;	} ARGEND	if(*argv == 0) {		print("usage: %ca [-options] file.s\n", thechar);		errorexit();	}	if(argc > 1 && systemtype(Windows)){		print("can't assemble multiple files on windows\n");		errorexit();	}	if(argc > 1 && !systemtype(Windows)) {		nproc = 1;		if(p = getenv("NPROC"))			nproc = atol(p);	/* */		c = 0;		nout = 0;		for(;;) {			while(nout < nproc && argc > 0) {				i = myfork();				if(i < 0) {					i = mywait(&status);					if(i < 0)						errorexit();					if(status)						c++;					nout--;					continue;				}				if(i == 0) {					print("%s:\n", *argv);					if(assemble(*argv))						errorexit();					exits(0);				}				nout++;				argc--;				argv++;			}			i = mywait(&status);			if(i < 0) {				if(c)					errorexit();				exits(0);			}			if(status)				c++;			nout--;		}	}	if(assemble(argv[0]))		errorexit();	exits(0);}intassemble(char *file){	char ofile[100], incfile[20], *p;	int i, of;	strcpy(ofile, file);	p = utfrrune(ofile, pathchar());	if(p) {		include[0] = ofile;		*p++ = 0;	} else		p = ofile;	if(outfile == 0) {		outfile = p;		if(outfile){			p = utfrrune(outfile, '.');			if(p)				if(p[1] == 's' && p[2] == 0)					p[0] = 0;			p = utfrune(outfile, 0);			p[0] = '.';			p[1] = thechar;			p[2] = 0;		} else			outfile = "/dev/null";	}	p = getenv("INCLUDE");	if(p) {		setinclude(p);	} else {		if(systemtype(Plan9)) {			sprint(incfile,"/%s/include", thestring);			setinclude(strdup(incfile));		}	}	of = mycreat(outfile, 0664);	if(of < 0) {		yyerror("%ca: cannot create %s", thechar, outfile);		errorexit();	}	Binit(&obuf, of, OWRITE);	pass = 1;	pinit(file);	for(i=0; i<nDlist; i++)		dodefine(Dlist[i]);	yyparse();	if(nerrors) {		cclean();		return nerrors;	}	pass = 2;	outhist();	pinit(file);	for(i=0; i<nDlist; i++)		dodefine(Dlist[i]);	yyparse();	cclean();	return nerrors;}struct{	char	*name;	ushort	type;	ushort	value;} itab[] ={	"SP",		LSP,	D_AUTO,	"SB",		LSB,	D_EXTERN,	"FP",		LFP,	D_PARAM,	"PC",		LPC,	D_BRANCH,	"AL",		LBREG,	D_AL,	"CL",		LBREG,	D_CL,	"DL",		LBREG,	D_DL,	"BL",		LBREG,	D_BL,	"AH",		LBREG,	D_AH,	"CH",		LBREG,	D_CH,	"DH",		LBREG,	D_DH,	"BH",		LBREG,	D_BH,	"AX",		LLREG,	D_AX,	"CX",		LLREG,	D_CX,	"DX",		LLREG,	D_DX,	"BX",		LLREG,	D_BX,/*	"SP",		LLREG,	D_SP,	*/	"BP",		LLREG,	D_BP,	"SI",		LLREG,	D_SI,	"DI",		LLREG,	D_DI,	"F0",		LFREG,	D_F0+0,	"F1",		LFREG,	D_F0+1,	"F2",		LFREG,	D_F0+2,	"F3",		LFREG,	D_F0+3,	"F4",		LFREG,	D_F0+4,	"F5",		LFREG,	D_F0+5,	"F6",		LFREG,	D_F0+6,	"F7",		LFREG,	D_F0+7,	"CS",		LSREG,	D_CS,	"SS",		LSREG,	D_SS,	"DS",		LSREG,	D_DS,	"ES",		LSREG,	D_ES,	"FS",		LSREG,	D_FS,	"GS",		LSREG,	D_GS,	"GDTR",		LBREG,	D_GDTR,	"IDTR",		LBREG,	D_IDTR,	"LDTR",		LBREG,	D_LDTR,	"MSW",		LBREG,	D_MSW,	"TASK",		LBREG,	D_TASK,	"CR0",		LBREG,	D_CR+0,	"CR1",		LBREG,	D_CR+1,	"CR2",		LBREG,	D_CR+2,	"CR3",		LBREG,	D_CR+3,	"CR4",		LBREG,	D_CR+4,	"CR5",		LBREG,	D_CR+5,	"CR6",		LBREG,	D_CR+6,	"CR7",		LBREG,	D_CR+7,	"DR0",		LBREG,	D_DR+0,	"DR1",		LBREG,	D_DR+1,	"DR2",		LBREG,	D_DR+2,	"DR3",		LBREG,	D_DR+3,	"DR4",		LBREG,	D_DR+4,	"DR5",		LBREG,	D_DR+5,	"DR6",		LBREG,	D_DR+6,	"DR7",		LBREG,	D_DR+7,	"TR0",		LBREG,	D_TR+0,	"TR1",		LBREG,	D_TR+1,	"TR2",		LBREG,	D_TR+2,	"TR3",		LBREG,	D_TR+3,	"TR4",		LBREG,	D_TR+4,	"TR5",		LBREG,	D_TR+5,	"TR6",		LBREG,	D_TR+6,	"TR7",		LBREG,	D_TR+7,	"AAA",		LTYPE0,	AAAA,	"AAD",		LTYPE0,	AAAD,	"AAM",		LTYPE0,	AAAM,	"AAS",		LTYPE0,	AAAS,	"ADCB",		LTYPE3,	AADCB,	"ADCL",		LTYPE3,	AADCL,	"ADCW",		LTYPE3,	AADCW,	"ADDB",		LTYPE3,	AADDB,	"ADDL",		LTYPE3,	AADDL,	"ADDW",		LTYPE3,	AADDW,	"ADJSP",	LTYPE2,	AADJSP,	"ANDB",		LTYPE3,	AANDB,	"ANDL",		LTYPE3,	AANDL,	"ANDW",		LTYPE3,	AANDW,	"ARPL",		LTYPE3,	AARPL,	"BOUNDL",	LTYPE3,	ABOUNDL,	"BOUNDW",	LTYPE3,	ABOUNDW,	"BSFL",		LTYPE3,	ABSFL,	"BSFW",		LTYPE3,	ABSFW,	"BSRL",		LTYPE3,	ABSRL,	"BSRW",		LTYPE3,	ABSRW,	"BTCL",		LTYPE3,	ABTCL,	"BTCW",		LTYPE3,	ABTCW,	"BTL",		LTYPE3,	ABTL,	"BTRL",		LTYPE3,	ABTRL,	"BTRW",		LTYPE3,	ABTRW,	"BTSL",		LTYPE3,	ABTSL,	"BTSW",		LTYPE3,	ABTSW,	"BTW",		LTYPE3,	ABTW,	"BYTE",		LTYPE2,	ABYTE,	"CALL",		LTYPEC,	ACALL,	"CLC",		LTYPE0,	ACLC,	"CLD",		LTYPE0,	ACLD,	"CLI",		LTYPE0,	ACLI,	"CLTS",		LTYPE0,	ACLTS,	"CMC",		LTYPE0,	ACMC,	"CMPB",		LTYPE4,	ACMPB,	"CMPL",		LTYPE4,	ACMPL,	"CMPW",		LTYPE4,	ACMPW,	"CMPSB",	LTYPE0,	ACMPSB,	"CMPSL",	LTYPE0,	ACMPSL,	"CMPSW",	LTYPE0,	ACMPSW,	"DAA",		LTYPE0,	ADAA,	"DAS",		LTYPE0,	ADAS,	"DATA",		LTYPED,	ADATA,	"DECB",		LTYPE1,	ADECB,	"DECL",		LTYPE1,	ADECL,	"DECW",		LTYPE1,	ADECW,	"DIVB",		LTYPE2,	ADIVB,	"DIVL",		LTYPE2,	ADIVL,	"DIVW",		LTYPE2,	ADIVW,	"END",		LTYPE0,	AEND,	"ENTER",	LTYPE2,	AENTER,	"GLOBL",	LTYPET,	AGLOBL,	"HLT",		LTYPE0,	AHLT,	"IDIVB",	LTYPE2,	AIDIVB,	"IDIVL",	LTYPE2,	AIDIVL,	"IDIVW",	LTYPE2,	AIDIVW,	"IMULB",	LTYPE2,	AIMULB,	"IMULL",	LTYPE2,	AIMULL,	"IMULW",	LTYPE2,	AIMULW,	"INB",		LTYPE0,	AINB,	"INL",		LTYPE0,	AINL,	"INW",		LTYPE0,	AINW,	"INCB",		LTYPE1,	AINCB,	"INCL",		LTYPE1,	AINCL,	"INCW",		LTYPE1,	AINCW,	"INSB",		LTYPE0,	AINSB,	"INSL",		LTYPE0,	AINSL,	"INSW",		LTYPE0,	AINSW,	"INT",		LTYPE2,	AINT,	"INTO",		LTYPE0,	AINTO,	"IRETL",	LTYPE0,	AIRETL,	"IRETW",	LTYPE0,	AIRETW,	"JOS",		LTYPER,	AJOS,	"JO",		LTYPER,	AJOS,	/* alternate */	"JOC",		LTYPER,	AJOC,	"JNO",		LTYPER,	AJOC,	/* alternate */	"JCS",		LTYPER,	AJCS,	"JB",		LTYPER,	AJCS,	/* alternate */	"JC",		LTYPER,	AJCS,	/* alternate */	"JNAE",		LTYPER,	AJCS,	/* alternate */	"JLO",		LTYPER,	AJCS,	/* alternate */	"JCC",		LTYPER,	AJCC,	"JAE",		LTYPER,	AJCC,	/* alternate */	"JNB",		LTYPER,	AJCC,	/* alternate */	"JNC",		LTYPER,	AJCC,	/* alternate */	"JHS",		LTYPER,	AJCC,	/* alternate */	"JEQ",		LTYPER,	AJEQ,	"JE",		LTYPER,	AJEQ,	/* alternate */	"JZ",		LTYPER,	AJEQ,	/* alternate */	"JNE",		LTYPER,	AJNE,	"JNZ",		LTYPER,	AJNE,	/* alternate */	"JLS",		LTYPER,	AJLS,	"JBE",		LTYPER,	AJLS,	/* alternate */	"JNA",		LTYPER,	AJLS,	/* alternate */	"JHI",		LTYPER,	AJHI,	"JA",		LTYPER,	AJHI,	/* alternate */	"JNBE",		LTYPER,	AJHI,	/* alternate */	"JMI",		LTYPER,	AJMI,	"JS",		LTYPER,	AJMI,	/* alternate */	"JPL",		LTYPER,	AJPL,	"JNS",		LTYPER,	AJPL,	/* alternate */	"JPS",		LTYPER,	AJPS,	"JP",		LTYPER,	AJPS,	/* alternate */	"JPE",		LTYPER,	AJPS,	/* alternate */	"JPC",		LTYPER,	AJPC,	"JNP",		LTYPER,	AJPC,	/* alternate */	"JPO",		LTYPER,	AJPC,	/* alternate */	"JLT",		LTYPER,	AJLT,	"JL",		LTYPER,	AJLT,	/* alternate */	"JNGE",		LTYPER,	AJLT,	/* alternate */	"JGE",		LTYPER,	AJGE,	"JNL",		LTYPER,	AJGE,	/* alternate */	"JLE",		LTYPER,	AJLE,	"JNG",		LTYPER,	AJLE,	/* alternate */	"JGT",		LTYPER,	AJGT,	"JG",		LTYPER,	AJGT,	/* alternate */	"JNLE",		LTYPER,	AJGT,	/* alternate */	"JCXZ",		LTYPER,	AJCXZ,	"JMP",		LTYPEC,	AJMP,	"LAHF",		LTYPE0,	ALAHF,	"LARL",		LTYPE3,	ALARL,	"LARW",		LTYPE3,	ALARW,	"LEAL",		LTYPE3,	ALEAL,	"LEAW",		LTYPE3,	ALEAW,	"LEAVEL",	LTYPE0,	ALEAVEL,	"LEAVEW",	LTYPE0,	ALEAVEW,	"LOCK",		LTYPE0,	ALOCK,	"LODSB",	LTYPE0,	ALODSB,	"LODSL",	LTYPE0,	ALODSL,	"LODSW",	LTYPE0,	ALODSW,	"LONG",		LTYPE2,	ALONG,	"LOOP",		LTYPER,	ALOOP,	"LOOPEQ",	LTYPER,	ALOOPEQ,	"LOOPNE",	LTYPER,	ALOOPNE,	"LSLL",		LTYPE3,	ALSLL,	"LSLW",		LTYPE3,	ALSLW,	"MOVB",		LTYPE3,	AMOVB,	"MOVL",		LTYPEM,	AMOVL,	"MOVW",		LTYPEM,	AMOVW,	"MOVBLSX",	LTYPE3, AMOVBLSX,	"MOVBLZX",	LTYPE3, AMOVBLZX,	"MOVBWSX",	LTYPE3, AMOVBWSX,	"MOVBWZX",	LTYPE3, AMOVBWZX,	"MOVWLSX",	LTYPE3, AMOVWLSX,	"MOVWLZX",	LTYPE3, AMOVWLZX,	"MOVSB",	LTYPE0,	AMOVSB,	"MOVSL",	LTYPE0,	AMOVSL,	"MOVSW",	LTYPE0,	AMOVSW,	"MULB",		LTYPE2,	AMULB,	"MULL",		LTYPE2,	AMULL,	"MULW",		LTYPE2,	AMULW,	"NEGB",		LTYPE1,	ANEGB,	"NEGL",		LTYPE1,	ANEGL,	"NEGW",		LTYPE1,	ANEGW,	"NOP",		LTYPEN,	ANOP,	"NOTB",		LTYPE1,	ANOTB,	"NOTL",		LTYPE1,	ANOTL,	"NOTW",		LTYPE1,	ANOTW,	"ORB",		LTYPE3,	AORB,	"ORL",		LTYPE3,	AORL,	"ORW",		LTYPE3,	AORW,	"OUTB",		LTYPE0,	AOUTB,	"OUTL",		LTYPE0,	AOUTL,	"OUTW",		LTYPE0,	AOUTW,	"OUTSB",	LTYPE0,	AOUTSB,	"OUTSL",	LTYPE0,	AOUTSL,	"OUTSW",	LTYPE0,	AOUTSW,	"POPAL",	LTYPE0,	APOPAL,	"POPAW",	LTYPE0,	APOPAW,	"POPFL",	LTYPE0,	APOPFL,	"POPFW",	LTYPE0,	APOPFW,	"POPL",		LTYPE1,	APOPL,	"POPW",		LTYPE1,	APOPW,	"PUSHAL",	LTYPE0,	APUSHAL,	"PUSHAW",	LTYPE0,	APUSHAW,	"PUSHFL",	LTYPE0,	APUSHFL,	"PUSHFW",	LTYPE0,	APUSHFW,	"PUSHL",	LTYPE2,	APUSHL,	"PUSHW",	LTYPE2,	APUSHW,	"RCLB",		LTYPE3,	ARCLB,	"RCLL",		LTYPE3,	ARCLL,	"RCLW",		LTYPE3,	ARCLW,	"RCRB",		LTYPE3,	ARCRB,	"RCRL",		LTYPE3,	ARCRL,	"RCRW",		LTYPE3,	ARCRW,	"REP",		LTYPE0,	AREP,	"REPN",		LTYPE0,	AREPN,	"RET",		LTYPE0,	ARET,	"ROLB",		LTYPE3,	AROLB,	"ROLL",		LTYPE3,	AROLL,	"ROLW",		LTYPE3,	AROLW,	"RORB",		LTYPE3,	ARORB,	"RORL",		LTYPE3,	ARORL,	"RORW",		LTYPE3,	ARORW,	"SAHF",		LTYPE0,	ASAHF,	"SALB",		LTYPE3,	ASALB,	"SALL",		LTYPE3,	ASALL,	"SALW",		LTYPE3,	ASALW,	"SARB",		LTYPE3,	ASARB,	"SARL",		LTYPE3,	ASARL,	"SARW",		LTYPE3,	ASARW,	"SBBB",		LTYPE3,	ASBBB,	"SBBL",		LTYPE3,	ASBBL,	"SBBW",		LTYPE3,	ASBBW,	"SCASB",	LTYPE0,	ASCASB,	"SCASL",	LTYPE0,	ASCASL,	"SCASW",	LTYPE0,	ASCASW,	"SETCC",	LTYPE1,	ASETCC,	"SETCS",	LTYPE1,	ASETCS,	"SETEQ",	LTYPE1,	ASETEQ,	"SETGE",	LTYPE1,	ASETGE,

⌨️ 快捷键说明

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