main.c

来自「早期freebsd实现」· C语言 代码 · 共 471 行

C
471
字号
/*- * Copyright (c) 1980, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char copyright[] ="@(#) Copyright (c) 1980, 1993\n\	The Regents of the University of California.  All rights reserved.\n";#endif /* not lint */#ifndef lintstatic char sccsid[] = "@(#)main.c	8.1 (Berkeley) 6/6/93";#endif /* not lint */#include "whoami.h"#include "0.h"#include "tree_ty.h"		/* must be included for yy.h */#include "yy.h"#include <signal.h>#include "objfmt.h"#include "config.h"/* * This version of pi has been in use at Berkeley since May 1977 * and is very stable. Please report any problems with the error * recovery to the second author at the address given in the file * READ_ME.  The second author takes full responsibility for any bugs * in the syntactic error recovery. */char	piusage[]	= "pi [ -blnpstuw ] [ -i file ... ] name.p";char	*usageis	= piusage;#ifdef OBJchar	pixusage[]	= "pix [ -blnpstuw ] [ -i file ... ] name.p [ arg ... ]";char	*obj	= "obj";#endif OBJ#ifdef PCchar	*pcname = "pc.pc0";char	pcusage[]	= "pc [ options ] [ -o file ] [ -i file ... ] name.p";FILE	*pcstream = NULL;#endif PC#ifdef PTREE    char	*pTreeName = "pi.pTree";#endif PTREEint	onintr();extern	char *lastname;FILE	*ibuf;/* * these are made real variables * so they can be changed * if you are compiling on a smaller machine */double	MAXINT	=  2147483647.;double	MININT	= -2147483648.;/* * Main program for pi. * Process options, then call yymain * to do all the real work. */main(argc, argv)	int argc;	char *argv[];{	register char *cp;	register c;	FILE *fopen();	extern char *myctime();	extern long lseek();	int i;	if (argv[0][0] == 'a')		err_file += err_pathlen , how_file += how_pathlen;#	ifdef OBJ	    if (argv[0][0] == '-' && argv[0][1] == 'o') {		    obj = &argv[0][2];		    usageis = pixusage;		    how_file[strlen(how_file)] = 'x';		    ofil = 3;	    } else {		    ofil = creat(obj, 0755);		    if (ofil < 0) {			    perror(obj);			    pexit(NOSTART);		    }	    }#	endif OBJ	argv++, argc--;	if (argc == 0) {		i = fork();		if (i == -1)			goto usage;		if (i == 0) {			execl("/bin/cat", "cat", how_file, 0);			goto usage;		}		while (wait(&i) != -1)			continue;		pexit(NOSTART);	}#	ifdef OBJ	    opt('p') = opt('t') = opt('b') = 1;#if defined(vax) || defined(tahoe)	    /* pdx is currently supported on the vax and the tahoe */	    opt('g') = 1;#endif	    while (argc > 0) {		    cp = argv[0];		    if (*cp++ != '-')			    break;		    while (c = *cp++) switch (c) {#ifdef DEBUG			    case 'k':			    case 'r':			    case 'y':				    togopt(c);				    continue;			    case 'K':				    yycosts();				    pexit(NOSTART);			    case 'A':				    testtrace = TRUE;			    case 'F':				    fulltrace = TRUE;			    case 'E':				    errtrace = TRUE;				    opt('r')++;				    continue;			    case 'U':				    yyunique = FALSE;				    continue;#endif			    case 'b':				    opt('b') = 2;				    continue;			    case 'i':				    pflist = argv + 1;				    pflstc = 0;				    while (argc > 1) {					    if (dotted(argv[1], 'p'))						    break;					    pflstc++, argc--, argv++;				    }				    if (pflstc == 0)					    goto usage;				    continue;			    case 'g':			    case 'l':			    case 'n':			    case 'p':			    case 's':			    case 't':			    case 'u':			    case 'w':				    togopt(c);				    continue;			    case 'z':				    monflg = TRUE;				    continue;			    case 'L':				    togopt( 'L' );				    continue;			    default:    usage:				    Perror( "Usage", usageis);				    pexit(NOSTART);		    }		    argc--, argv++;	    }#	endif OBJ#	ifdef PC	    opt( 'b' ) = 1;	    opt( 'g' ) = 0;	    opt( 't' ) = 0;	    opt( 'p' ) = 0;	    usageis = pcusage;	    while ( argc > 0 ) {		cp = argv[0];		if ( *cp++ != '-' ) {		    break;		}		c = *cp++;		switch( c ) {#ifdef DEBUG		    case 'k':		    case 'r':		    case 'y':			    togopt(c);			    break;		    case 'K':			    yycosts();			    pexit(NOSTART);		    case 'A':			    testtrace = TRUE;			    /* and fall through */		    case 'F':			    fulltrace = TRUE;			    /* and fall through */		    case 'E':			    errtrace = TRUE;			    opt('r')++;			    break;		    case 'U':			    yyunique = FALSE;			    break;#endif		    case 'b':			    opt('b') = 2;			    break;		    case 'i':			    pflist = argv + 1;			    pflstc = 0;			    while (argc > 1) {				    if (dotted(argv[1], 'p'))					    break;				    pflstc++, argc--, argv++;			    }			    if (pflstc == 0)				    goto usage;			    break;			/*			 *	output file for the first pass			 */		    case 'o':			    if ( argc < 2 ) {				goto usage;			    }			    argv++;			    argc--;			    pcname = argv[0];			    break;			    case 'J':			    togopt( 'J' );			    break;		    case 'C':				/*				 * since -t is an ld switch, use -C				 * to turn on tests				 */			    togopt( 't' );			    break;		    case 'g':				/*				 *	sdb symbol table				 */			    togopt( 'g' );			    break;		    case 'l':		    case 's':		    case 'u':		    case 'w':			    togopt(c);			    break;		    case 'p':				/*				 *	-p on the command line means profile				 */			    profflag = TRUE;			    break;		    case 'z':			    monflg = TRUE;			    break;		    case 'L':			    togopt( 'L' );			    break;		    default:usage:			    Perror( "Usage", usageis);			    pexit(NOSTART);		}		argc--;		argv++;	    }#	endif PC	if (argc != 1)		goto usage;	efil = open ( err_file, 0 );	if ( efil < 0 )		perror(err_file), pexit(NOSTART);	filename = argv[0];	if (!dotted(filename, 'p')) {		Perror(filename, "Name must end in '.p'");		pexit(NOSTART);	}	close(0);	if ( ( ibuf = fopen( filename , "r" ) ) == NULL )		perror(filename), pexit(NOSTART);	ibp = ibuf;#	ifdef PC	    if ( ( pcstream = fopen( pcname , "w" ) ) == NULL ) {		perror( pcname );		pexit( NOSTART );	    }	    stabsource( filename, TRUE );#	endif PC#	ifdef PTREE#	    define	MAXpPAGES	16	    if ( ! pCreate( pTreeName , MAXpPAGES ) ) {		perror( pTreeName );		pexit( NOSTART );	    }#	endif PTREE	if ( signal( SIGINT , SIG_IGN ) != SIG_IGN )		(void) signal( SIGINT , onintr );	if (opt('l')) {		opt('n')++;		yysetfile(filename);		opt('n')--;	}	yymain();	/* No return */}pchr(c)	char c;{	putc ( c , stdout );}#ifdef PCchar	ugh[]	= "Fatal error in pc\n";#endif#ifdef OBJchar	ugh[]	= "Fatal error in pi\n";#endif/* * Exit from the Pascal system. * We throw in an ungraceful termination * message if c > 1 indicating a severe * error such as running out of memory * or an internal inconsistency. */pexit(c)	int c;{	if (opt('l') && c != DIED && c != NOSTART)		while (getline() != -1)			continue;	yyflush();	switch (c) {		case DIED:			write(2, ugh, sizeof ugh);		case NOSTART:		case ERRS:#			ifdef OBJ			    if (ofil > 0)				    unlink(obj);			/*			 * remove symbol table temp files			 */			    removenlfile();#			endif OBJ#			ifdef PC			    if ( pcstream != NULL ) {				unlink( pcname );			    }#			endif PC			break;		case AOK:#			ifdef OBJ			    pflush();			/*			 * copy symbol table temp files to obj file			 */			    copynlfile();#			endif OBJ#			ifdef PC			    puteof();#			endif PC			break;	}	/*	 *	this to gather statistics on programs being compiled	 *	taken 20 june 79 	... peter	 *	 *  if (fork() == 0) {	 *  	char *cp = "-0";	 *  	cp[1] += c;	 *  	execl("/usr/lib/gather", "gather", cp, filename, 0);	 *  	exit(1);	 *  }	 */#	ifdef PTREE	    pFinish();#	endif	exit(c);}onintr(){	(void) signal( SIGINT , SIG_IGN );	pexit(NOSTART);}/* * Get an error message from the error message file */geterr(seekpt, buf)	int seekpt;	char *buf;{	(void) lseek(efil, (long) seekpt, 0);	if (read(efil, buf, 256) <= 0)		perror(err_file), pexit(DIED);}header(){	extern char *version;	static char anyheaders;	gettime( filename );	if (anyheaders && opt('n'))		putc( '\f' , stdout );	anyheaders++;#	ifdef OBJ	    printf("Berkeley Pascal PI -- Version %s\n\n%s  %s\n\n",		    version, myctime((int *) (&tvec)), filename);#	endif OBJ#	ifdef PC	    printf("Berkeley Pascal PC -- Version %s\n\n%s  %s\n\n",		    version, myctime((int *) (&tvec)), filename);#	endif PC}

⌨️ 快捷键说明

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