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

📄 main.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
static char xxxvers[ ] = "\n@(#)EFL VERSION 1.14,  19 AUGUST 1980";/* Compiler for the EFL Programming Language.  Written by:		Stuart I. Feldman		Bell Laboratories		Murray Hill, New Jersey*//* Flags:	-d	EFL debugging output	-v	verbose (print out Pass numbers and memory limits)	-w	supress warning messages	-f	put Fortran output on appropriate .f files	-F	put Fortran code for input file x onto x.F	-e	divert diagnostic output to next argument	-#	do not pass comments through to output*/#include "defs"int sysflag;int nerrs	= 0;int nbad	= 0;int nwarns	= 0;int stnos[MAXSTNO];int nxtstno	= 0;int constno	= 0;int labno	= 0;int dumpic	= NO;int memdump	= NO;int dbgflag	= NO;int nowarnflag	= NO;int nocommentflag	= NO;int verbose	= NO;int dumpcore	= NO;char msg[200];struct fileblock fcb[4];struct fileblock *iifilep;struct fileblock *ibfile	= &fcb[0];struct fileblock *icfile	= &fcb[1];struct fileblock *idfile	= &fcb[2];struct fileblock *iefile	= &fcb[3];FILE *diagfile	= {stderr};FILE *codefile	= {stdout};FILE *fileptrs[MAXINCLUDEDEPTH];char *filenames[MAXINCLUDEDEPTH];char *basefile;int filelines[MAXINCLUDEDEPTH];int filedepth	= 0;char *efmacp	= NULL;char *filemacs[MAXINCLUDEDEPTH];int pushchars[MAXINCLUDEDEPTH];int ateof	= NO;int igeol	= NO;int pushlex	= NO;int eofneed	= NO;int forcerr	 = NO;int defneed	 = NO;int prevbg	 = NO;int comneed	 = NO;int optneed	 = NO;int lettneed	= NO;int iobrlevel	= 0;ptr comments	= NULL;ptr prevcomments	= NULL;ptr genequivs	= NULL;ptr arrays	= NULL;ptr generlist	= NULL;ptr knownlist	= NULL;ptr thisexec;ptr thisctl;chainp tempvarlist	= CHNULL;chainp temptypelist	= CHNULL;chainp hidlist	= CHNULL;chainp commonlist	= CHNULL;chainp gonelist	= CHNULL;int blklevel	= 0;int ctllevel	= 0;int dclsect	= 0;int instruct	= 0;int inbound	= 0;int inproc	= 0;int ncases	= 0;int graal	= 0;ptr procname	= NULL;int procclass	= 0;ptr thisargs	= NULL;int nhid[MAXBLOCKDEPTH];int ndecl[MAXBLOCKDEPTH];char ftnames[MAXFTNAMES][7];int neflnames	= 0;int nftnames;int nftnm0;int impltype[26];int ftnefl[NFTNTYPES]	= { TYINT, TYREAL, TYLOG, TYCOMPLEX, TYLREAL,				TYCHAR, TYLCOMPLEX };int eflftn[NEFLTYPES];int ftnmask[NFTNTYPES] 	= { 1, 2, 4, 8, 16, 32, 64 };struct tailoring tailor;struct system systab[] =	{		{ "portable", 0,	1, 10, 7, 15},		{ "unix", UNIX,	4, 10, 7, 15 },		{ "gcos", GCOS,	4, 10, 7, 15 },		{ "gcosbcd", GCOSBCD,	6, 10, 7, 15},		{ "cray", CRAY,	8, 10, 7, 15},		{ "ibm", IBM,	4, 10, 7, 15 },		{ NULL }	};double fieldmax	= FIELDMAX;int langopt	= 2;int dotsopt	= 0;int dbgopt	= 0;int dbglevel	= 0;int nftnch;int nftncont;int indifs[MAXINDIFS];int nxtindif;int afterif	= 0;#ifdef	gcos#	define BIT(n)	(1 << (36 - 1 - n) )#	define FORTRAN	BIT(1)#	define FDS	BIT(4)#	define EXEC	BIT(5)#	define FORM	BIT(14)#	define LNO	BIT(15)#	define BCD	BIT(16)#	define OPTZ	BIT(17)	int	compile	= FORTRAN | FDS;#endifmain(argc,argv)register int argc;register char **argv;{FILE *fd;register char *p;int neflnm0;#ifdef unix	int intrupt();	sysflag = UNIX;/*	meter();*/	if( (signal(2,1) & 01) == 0)		signal(2, intrupt);#endif#ifdef gcos/*	meter();*/	sysflag = (intss() ? GCOS : GCOSBCD);#endifcrii();--argc;++argv;tailinit(systab + sysflag);while(argc>0 && ( (argv[0][0]=='-' && argv[0][1]!='\0') || eqlstrng(argv[0]) ))	{	if(argv[0][0] == '-')	    for(p = argv[0]+1 ; *p ; ++p) switch(*p)		{		case ' ':			break;		case 'd':		case 'D':			switch( *++p)				{				case '1':					dbgflag = YES;					break;				case '2':					setyydeb();					break;				case '3':					dumpcore = YES;					break;				case '4':					dumpic = YES;					break;				case 'm':				case 'M':					memdump = YES;					break;				default:					dbgflag = YES;					--p;					break;				}			break;		case 'w':		case 'W':			nowarnflag = YES;			break;		case 'v':		case 'V':			verbose = YES;			break;		case '#':			nocommentflag = YES;			break;		case 'C':		case 'c':			nocommentflag = NO;			break;#ifdef gcos		case 'O':		case 'o':			compile |= OPTZ;			break;		case 'E':		case 'e':			compile = 0;			break;#endif		default:			fprintf(diagfile, "Illegal EFL flag %c\n", *p);			exit(1);		}	--argc;	++argv;	}kwinit();geninit();knowninit();init();implinit();neflnm0 = neflnames;#ifdef gcos	if( intss() )		compile = 0;	else		gcoutf();#endif/*	fprintf(diagfile, "EFL 1.10\n");	*/if(argc==0)	{	filenames[0] = "-";	dofile(stdin);	}else	while(argc>0)		{		if( eqlstrng(argv[0]) )			{			--argc;			++argv;			continue;			}		if(argv[0][0]=='-' && argv[0][1]=='\0')			{			basefile = "";			fd = stdin;			}		else	{			basefile = argv[0];			fd = fopen(argv[0], "r");			}		if(fd == NULL)			{			sprintf(msg, "Cannot open file %s", argv[0]);			fprintf(diagfile, "%s.  Stop\n", msg);			done(2);			}		filenames[0] = argv[0];		filedepth = 0;		nftnames = 0;		nftnm0 = 0;		neflnames = neflnm0;		dofile(fd);		if(fd != stdin)			fclose(fd);		--argc;		++argv;		}p2flush();if(verbose)	fprintf(diagfile, "End of compilation\n");/*prhisto();/* */rmiis();#ifdef gcos	gccomp();#endifdone(nbad);}dofile(fd)FILE *fd;{int k;fprintf(diagfile, "File %s:\n", filenames[0]);#ifdef gcos	if( fd==stdin && intss() && inquire(stdin, _TTY) )		freopen("*src", "rt", stdin);#endifyyin = fileptrs[0] = fd;yylineno = filelines[0] = 1;filedepth = 0;ateof = 0;do	{	nerrs = 0;	nwarns = 0;	eofneed = 0;	forcerr = 0;	comneed = 0;	optneed = 0;	defneed = 0;	lettneed = 0;	iobrlevel = 0;	prevbg = 0;	constno = 0;	labno = 0;	nxtstno = 0;	afterif = 0;	thisexec = 0;	thisctl = 0;	nxtindif = 0;	inproc = 0;	blklevel = 0;	implinit();	opiis();	swii(icfile);	if(k = yyparse())		fprintf(diagfile, "Error in source file.\n");	else  switch(graal)		{		case PARSERR:			/*			fprintf(diagfile, "error\n");			*/			break;		case PARSEOF:			break;		case PARSOPT:			propts();			break;		case PARSDCL:			fprintf(diagfile, "external declaration\n");			break;		case PARSPROC:			/* work already done in endproc */			break;		case PARSDEF:			break;		}	cliis();	if(nerrs) ++nbad;	} while(graal!=PARSEOF && !ateof);}ptr bgnproc(){ptr bgnexec();if(blklevel > 0)	{	execerr("procedure %s terminated prematurely", procnm() );	endproc();	}ctllevel = 0;procname = 0;procclass = 0;thisargs = 0;dclsect = 0;blklevel = 1;nftnm0 = nftnames;dclsect = 1;ndecl[1] = 0;nhid[1] = 0;thisctl = allexcblock();thisctl->tag = TCONTROL;thisctl->subtype = STPROC;inproc = 1;return( bgnexec() );}endproc(){char comline[50], *concat();ptr p;inproc = 0;if(nerrs == 0)	{	pass2();	unhide();	cleanst();	if(dumpic)		system( concat("od ", icfile->filename, comline) );	if(memdump)		prmem();	}else	{	fprintf(diagfile, "**Procedure %s not generated\n", procnm());	for( ; blklevel > 0 ; --blklevel)		unhide();	cleanst();	}if(nerrs==0 && nwarns>0)	if(nwarns == 1)		fprintf(diagfile,"*1 warning\n");	else	fprintf(diagfile, "*%d warnings\n", nwarns);blklevel = 0;thisargs = 0;procname = 0;procclass = 0;while(thisctl)	{	p = thisctl;	thisctl = thisctl->prevctl;	frexcblock(p);	}while(thisexec)	{	p = thisexec;	thisexec = thisexec->prevexec;	frexcblock(p);	}nftnames = nftnm0;if(verbose)	{	fprintf(diagfile, "Highwater mark %d words. ", nmemused);	fprintf(diagfile, "%ld words left over\n", totalloc-totfreed);	}}implinit(){setimpl(TYREAL, 'a', 'z');setimpl(TYINT,  'i', 'n');}init(){eflftn[TYINT] = FTNINT;eflftn[TYREAL] = FTNREAL;eflftn[TYLREAL] = FTNDOUBLE;eflftn[TYLOG] = FTNLOG;eflftn[TYCOMPLEX] = FTNCOMPLEX;eflftn[TYCHAR] = FTNINT;eflftn[TYFIELD] = FTNINT;eflftn[TYLCOMPLEX] = FTNDOUBLE;}#ifdef gcosmeter(){FILE *mout;char *cuserid(), *datime(), *s;if(equals(s = cuserid(), "efl")) return;mout = fopen("efl/eflmeter", "a");if(mout == NULL)	fprintf(diagfile,"cannot open meter file");else	{	fprintf(mout, "%s user %s at %s\n",		( rutss()? "tss  " : "batch"), s, datime() );	fclose(mout);	}}#endif#ifdef unixmeter()	/* temporary metering of non-SIF usage */{FILE *mout;int tvec[2];int uid;char *ctime(), *p;uid = getuid() & 0377;if(uid == 91) return;	/* ignore sif uses */mout = fopen("/usr/sif/efl/Meter", "a");if(mout == NULL)	fprintf(diagfile, "cannot open meter file");else	{	time(tvec);	p = ctime(tvec);	p[16] = '\0';	fprintf(mout,"User %d, %s\n",  uid, p+4);	fclose(mout);	}}intrupt(){done(0);}#endifdone(k)int k;{rmiis();exit(k);}/* if string has an embedded equal sign, set option with it*/eqlstrng(s)char *s;{register char *t;for(t = s; *t; ++t)	if(*t == '=')		{		*t = '\0';		while( *++t == ' ' )			;		setopt(s, t);		return(YES);		}return(NO);}#ifdef gcos/* redirect output unit */gcoutf(){if (!intss())	{	fputs("\t\t    Version 2.10 : read INFO/EFL (03/27/80)\n", stderr);	if (compile)		{		static char name[80] = "s*", opts[20] = "yw";		char *opt = (char *)inquire(stdout, _OPTIONS);		if (!strchr(opt, 't'))			{ /* if stdout is diverted */			sprintf(name, "%s\"s*\"",				(char *)inquire(stdout, _FILENAME));			strcpy(&opts[1], opt);			}		if (freopen(name, opts, stdout) == NULL)			cant(name);		}	}}/* call in fortran compiler if necessary */gccomp(){if (compile)	{	if (nbad > 0)	/* abort */		cretsw(EXEC);	else	{ /* good: call forty */		FILE *dstar; /* to intercept "gosys" action */		if ((dstar = fopen("d*", "wv")) == NULL)			cant("d*");		fputs("$\tforty\tascii", dstar);		if (fopen("*1", "o") == NULL)			cant("*1");		fclose(stdout, "rl");		cretsw(FORM | LNO | BCD);		if (! tailor.ftncontnu)			compile |= FORM;		csetsw(compile);		gosys("forty");		}	}}cant(s)char *s;{ffiler(s);done(1);}#endif

⌨️ 快捷键说明

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