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

📄 lex.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
#define	EXTERN#include "a.h"#include "y.tab.h"#include <ctype.h>voidmain(int argc, char *argv[]){	char *p;	int nout, nproc, status, i, c;	thechar = 'q';	thestring = "power";	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) {		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);	if(p = strrchr(ofile, pathchar())) {		include[0] = ofile;		*p++ = 0;	} else		p = ofile;	if(outfile == 0) {		outfile = p;		if(p = strrchr(outfile, '.'))			if(p[1] == 's' && p[2] == 0)				p[0] = 0;		p = strrchr(outfile, 0);		p[0] = '.';		p[1] = thechar;		p[2] = 0;	}	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;	nosched = 0;	pinit(file);	for(i=0; i<nDlist; i++)		dodefine(Dlist[i]);	yyparse();	if(nerrors) {		cclean();		return nerrors;	}	pass = 2;	nosched = 0;	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,	"LR",		LLR,	D_LR,	"CTR",		LCTR,	D_CTR,	"XER",		LSPREG,	D_XER,	"MSR",		LMSR,	D_MSR,	"FPSCR",	LFPSCR,	D_FPSCR,	"SPR",		LSPR,	D_SPR,	"DCR",		LSPR,	D_DCR,	"SEG",		LSEG,	D_SREG,	"CR",		LCR,	0,	"CR0",		LCREG,	0,	"CR1",		LCREG,	1,	"CR2",		LCREG,	2,	"CR3",		LCREG,	3,	"CR4",		LCREG,	4,	"CR5",		LCREG,	5,	"CR6",		LCREG,	6,	"CR7",		LCREG,	7,	"R",		LR,	0,	"R0",		LREG,	0,	"R1",		LREG,	1,	"R2",		LREG,	2,	"R3",		LREG,	3,	"R4",		LREG,	4,	"R5",		LREG,	5,	"R6",		LREG,	6,	"R7",		LREG,	7,	"R8",		LREG,	8,	"R9",		LREG,	9,	"R10",		LREG,	10,	"R11",		LREG,	11,	"R12",		LREG,	12,	"R13",		LREG,	13,	"R14",		LREG,	14,	"R15",		LREG,	15,	"R16",		LREG,	16,	"R17",		LREG,	17,	"R18",		LREG,	18,	"R19",		LREG,	19,	"R20",		LREG,	20,	"R21",		LREG,	21,	"R22",		LREG,	22,	"R23",		LREG,	23,	"R24",		LREG,	24,	"R25",		LREG,	25,	"R26",		LREG,	26,	"R27",		LREG,	27,	"R28",		LREG,	28,	"R29",		LREG,	29,	"R30",		LREG,	30,	"R31",		LREG,	31,	"F",		LF,	0,	"F0",		LFREG,	0,	"F1",		LFREG,	1,	"F2",		LFREG,	2,	"F3",		LFREG,	3,	"F4",		LFREG,	4,	"F5",		LFREG,	5,	"F6",		LFREG,	6,	"F7",		LFREG,	7,	"F8",		LFREG,	8,	"F9",		LFREG,	9,	"F10",		LFREG,	10,	"F11",		LFREG,	11,	"F12",		LFREG,	12,	"F13",		LFREG,	13,	"F14",		LFREG,	14,	"F15",		LFREG,	15,	"F16",		LFREG,	16,	"F17",		LFREG,	17,	"F18",		LFREG,	18,	"F19",		LFREG,	19,	"F20",		LFREG,	20,	"F21",		LFREG,	21,	"F22",		LFREG,	22,	"F23",		LFREG,	23,	"F24",		LFREG,	24,	"F25",		LFREG,	25,	"F26",		LFREG,	26,	"F27",		LFREG,	27,	"F28",		LFREG,	28,	"F29",		LFREG,	29,	"F30",		LFREG,	30,	"F31",		LFREG,	31,	"CREQV",	LCROP, ACREQV,	"CRXOR",	LCROP, ACRXOR,	"CRAND",	LCROP, ACRAND,	"CROR",		LCROP, ACROR,	"CRANDN",	LCROP, ACRANDN,	"CRORN",	LCROP, ACRORN,	"CRNAND",	LCROP, ACRNAND,	"CRNOR",	LCROP, ACRNOR,	"ADD",		LADDW, AADD,	"ADDV",		LADDW, AADDV,	"ADDCC",	LADDW, AADDCC,	"ADDVCC",	LADDW, AADDVCC,	"ADDC",		LADDW, AADDC,	"ADDCV",	LADDW, AADDCV,	"ADDCCC",	LADDW, AADDCCC,	"ADDCVCC",	LADDW, AADDCVCC,	"ADDE",		LLOGW, AADDE,	"ADDEV",	LLOGW, AADDEV,	"ADDECC",	LLOGW, AADDECC,	"ADDEVCC",	LLOGW, AADDEVCC,	"ADDME",	LABS, AADDME,	"ADDMEV",	LABS, AADDMEV,	"ADDMECC",	LABS, AADDMECC,	"ADDMEVCC",	LABS, AADDMEVCC,	"ADDZE",	LABS, AADDZE,	"ADDZEV",	LABS, AADDZEV,	"ADDZECC",	LABS, AADDZECC,	"ADDZEVCC",	LABS, AADDZEVCC,	"SUB",		LADDW, ASUB,	"SUBV",		LADDW, ASUBV,	"SUBCC",	LADDW, ASUBCC,	"SUBVCC",	LADDW, ASUBVCC,	"SUBE",		LLOGW, ASUBE,	"SUBECC",	LLOGW, ASUBECC,	"SUBEV",	LLOGW, ASUBEV,	"SUBEVCC",	LLOGW, ASUBEVCC,	"SUBC",		LADDW, ASUBC,	"SUBCCC",	LADDW, ASUBCCC,	"SUBCV",	LADDW, ASUBCV,	"SUBCVCC",	LADDW, ASUBCVCC,	"SUBME",	LABS, ASUBME,	"SUBMEV",	LABS, ASUBMEV,	"SUBMECC",	LABS, ASUBMECC,	"SUBMEVCC",	LABS, ASUBMEVCC,	"SUBZE",	LABS, ASUBZE,	"SUBZEV",	LABS, ASUBZEV,	"SUBZECC",	LABS, ASUBZECC,	"SUBZEVCC",	LABS, ASUBZEVCC,	"AND",		LADDW, AAND,	"ANDCC",	LADDW, AANDCC,	/* includes andil & andiu */	"ANDN",		LLOGW, AANDN,	"ANDNCC",	LLOGW, AANDNCC,	"EQV",		LLOGW, AEQV,	"EQVCC",	LLOGW, AEQVCC,	"NAND",		LLOGW, ANAND,	"NANDCC",	LLOGW, ANANDCC,	"NOR",		LLOGW, ANOR,	"NORCC",	LLOGW, ANORCC,	"OR",		LADDW, AOR,	/* includes oril & oriu */	"ORCC",		LADDW, AORCC,	"ORN",		LLOGW, AORN,	"ORNCC",	LLOGW, AORNCC,	"XOR",		LADDW, AXOR,	/* includes xoril & xoriu */	"XORCC",	LLOGW, AXORCC,	"EXTSB",	LABS,	AEXTSB,	"EXTSBCC",	LABS,	AEXTSBCC,	"EXTSH",	LABS, AEXTSH,	"EXTSHCC",	LABS, AEXTSHCC,	"CNTLZW",	LABS, ACNTLZW,	"CNTLZWCC",	LABS, ACNTLZWCC,	"RLWMI",	LRLWM, ARLWMI,	"RLWMICC",	LRLWM, ARLWMICC,	"RLWNM",	LRLWM, ARLWNM,	"RLWNMCC", LRLWM, ARLWNMCC,	"SLW",		LSHW, ASLW,	"SLWCC",	LSHW, ASLWCC,	"SRW",		LSHW, ASRW,	"SRWCC",	LSHW, ASRWCC,	"SRAW",		LSHW, ASRAW,	"SRAWCC",	LSHW, ASRAWCC,	"BR",		LBRA, ABR,	"BC",		LBRA, ABC,	"BCL",		LBRA, ABC,	"BL",		LBRA, ABL,	"BEQ",		LBRA, ABEQ,	"BNE",		LBRA, ABNE,	"BGT",		LBRA, ABGT,	"BGE",		LBRA, ABGE,	"BLT",		LBRA, ABLT,	"BLE",		LBRA, ABLE,	"BVC",		LBRA, ABVC,	"BVS",		LBRA, ABVS,	"CMP",		LCMP, ACMP,	"CMPU",		LCMP, ACMPU,	"DIVW",		LLOGW, ADIVW,	"DIVWV",	LLOGW, ADIVWV,	"DIVWCC",	LLOGW, ADIVWCC,	"DIVWVCC",	LLOGW, ADIVWVCC,	"DIVWU",	LLOGW, ADIVWU,	"DIVWUV",	LLOGW, ADIVWUV,	"DIVWUCC",	LLOGW, ADIVWUCC,	"DIVWUVCC",	LLOGW, ADIVWUVCC,	"FABS",		LFCONV,	AFABS,	"FABSCC",	LFCONV,	AFABSCC,	"FNEG",		LFCONV,	AFNEG,	"FNEGCC",	LFCONV,	AFNEGCC,	"FNABS",	LFCONV,	AFNABS,	"FNABSCC",	LFCONV,	AFNABSCC,	"FADD",		LFADD,	AFADD,	"FADDCC",	LFADD,	AFADDCC,	"FSUB",		LFADD,  AFSUB,	"FSUBCC",	LFADD,	AFSUBCC,	"FMUL",		LFADD,	AFMUL,	"FMULCC",	LFADD,	AFMULCC,	"FDIV",		LFADD,	AFDIV,	"FDIVCC",	LFADD,	AFDIVCC,	"FRSP",		LFCONV,	AFRSP,	"FRSPCC",	LFCONV,	AFRSPCC,	"FMADD",	LFMA, AFMADD,	"FMADDCC",	LFMA, AFMADDCC,	"FMSUB",	LFMA, AFMSUB,	"FMSUBCC",	LFMA, AFMSUBCC,	"FNMADD",	LFMA, AFNMADD,	"FNMADDCC",	LFMA, AFNMADDCC,	"FNMSUB",	LFMA, AFNMSUB,	"FNMSUBCC",	LFMA, AFNMSUBCC,	"FMADDS",	LFMA, AFMADDS,	"FMADDSCC",	LFMA, AFMADDSCC,	"FMSUBS",	LFMA, AFMSUBS,	"FMSUBSCC",	LFMA, AFMSUBSCC,	"FNMADDS",	LFMA, AFNMADDS,	"FNMADDSCC",	LFMA, AFNMADDSCC,	"FNMSUBS",	LFMA, AFNMSUBS,	"FNMSUBSCC",	LFMA, AFNMSUBSCC,	"FCMPU",	LFCMP, AFCMPU,	"FCMPO",	LFCMP, AFCMPO,	"MTFSB0",	LMTFSB, AMTFSB0,	"MTFSB1",	LMTFSB,	AMTFSB1,	"FMOVD",	LFMOV, AFMOVD,	"FMOVS",	LFMOV, AFMOVS,	"FMOVDCC",	LFCONV,	AFMOVDCC,	/* fmr. */	"GLOBL",	LTEXT, AGLOBL,	"MOVB",		LMOVB, AMOVB,	"MOVBZ",	LMOVB, AMOVBZ,	"MOVBU",	LMOVB, AMOVBU,	"MOVBZU", LMOVB, AMOVBZU,	"MOVH",		LMOVB, AMOVH,	"MOVHZ",	LMOVB, AMOVHZ,	"MOVHU",	LMOVB, AMOVHU,	"MOVHZU", LMOVB, AMOVHZU,	"MOVHBR", 	LXMV, AMOVHBR,	"MOVWBR",	LXMV, AMOVWBR,	"MOVW",		LMOVW, AMOVW,	"MOVWU",	LMOVW, AMOVWU,	"MOVMW",	LMOVMW, AMOVMW,	"MOVFL",	LMOVW,	AMOVFL,	"MULLW",	LADDW, AMULLW,		/* includes multiply immediate 10-139 */

⌨️ 快捷键说明

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