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

📄 0.h

📁 早期freebsd实现
💻 H
📖 第 1 页 / 共 2 页
字号:
/*- * 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. * *	@(#)0.h	8.1 (Berkeley) 6/6/93 */#define DEBUG#define CONSETS#define	CHAR#define	STATIC#define hp21mx 0#include	<stdio.h>#include	<stdlib.h>#include	<sys/types.h>#undef rounduptypedef enum {FALSE, TRUE} bool;/* * Option flags * * The following options are recognized in the text of the program * and also on the command line: * *	b	block buffer the file output * *	i	make a listing of the procedures and functions in *		the following include files * *	l	make a listing of the program * *	n	place each include file on a new page with a header * *	p	disable post mortem and statement limit counting * *	t	disable run-time tests * *	u	card image mode; only first 72 chars of input count * *	w	suppress special diagnostic warnings * *	z	generate counters for an execution profile */#ifdef DEBUGbool	fulltrace, errtrace, testtrace, yyunique;#endif DEBUG/* * Each option has a stack of 17 option values, with opts giving * the current, top value, and optstk the value beneath it. * One refers to option `l' as, e.g., opt('l') in the text for clarity. */char	opts[ 'z' - 'A' + 1];short	optstk[ 'z' - 'A' + 1];#define opt(c) opts[c-'A']/* * Monflg is set when we are generating * a pxp profile.  this is set by the -z command line option. */bool	monflg;    /*     *	profflag is set when we are generating a prof profile.     *	this is set by the -p command line option.     */#ifdef PCbool	profflag;#endif/* * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES * * Pi uses expandable tables for * its namelist (symbol table), string table * hash table, and parse tree space.  The following * definitions specify the size of the increments * for these items in fundamental units so that * each uses approximately 1024 bytes. */#define	STRINC	1024		/* string space increment */#define	TRINC	1024		/* tree space increment */#define	HASHINC	509		/* hash table size in words, each increment */#define	NLINC	56		/* namelist increment size in nl structs *//* * The initial sizes of the structures. * These should be large enough to compile * an "average" sized program so as to minimize * storage requests. * On a small system or and 11/34 or 11/40 * these numbers can be trimmed to make the * compiler smaller. */#define	ITREE	2000#define	INL	200#define	IHASH	509/* * The following limits on hash and tree tables currently * allow approximately 1200 symbols and 20k words of tree * space.  The fundamental limit of 64k total data space * should be exceeded well before these are full. *//* * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables */#ifdef ADDR32#define TABLE_MULTIPLIER	8#endif ADDR32#ifdef ADDR16#define TABLE_MULTIPLIER	1#endif ADDR16#define	MAXHASH	(4 * TABLE_MULTIPLIER)#define	MAXNL	(12 * TABLE_MULTIPLIER)#define	MAXTREE	(40 * TABLE_MULTIPLIER)/* * MAXDEPTH is the depth of the parse stack. * STACK_MULTIPLIER is for increasing its size. */#ifdef ADDR32#define	STACK_MULTIPLIER	8#endif ADDR32#ifdef ADDR16#define	STACK_MULTIPLIER	1#endif ADDR16#define	MAXDEPTH ( 150 * STACK_MULTIPLIER )/* * ERROR RELATED DEFINITIONS *//* * Exit statuses to pexit * * AOK * ERRS		Compilation errors inhibit obj productin * NOSTART	Errors before we ever got started * DIED		We ran out of memory or some such */#define	AOK	0#define	ERRS	1#define	NOSTART	2#define	DIED	3bool	Recovery;#define	eholdnl()	Eholdnl = TRUE#define	nocascade()	Enocascade = TRUEbool	Eholdnl, Enocascade;/* * The flag eflg is set whenever we have a hard error. * The character in errpfx will precede the next error message. * When cgenflg is set code generation is suppressed. * This happens whenver we have an error (i.e. if eflg is set) * and when we are walking the tree to determine types only. */bool	eflg;char	errpfx;#define	setpfx(x)	errpfx = x#define	standard()	setpfx('s')#define	warning()	setpfx('w')#define	recovered()	setpfx('e')#define	continuation()	setpfx(' ')int	cgenflg;/* * The flag syneflg is used to suppress the diagnostics of the form *	E 10 a, defined in someprocedure, is neither used nor set * when there were syntax errors in "someprocedure". * In this case, it is likely that these warinings would be spurious. */bool	syneflg;/* * The compiler keeps its error messages in a file. * The variable efil is the unit number on which * this file is open for reading of error message text. * Similarly, the file ofil is the unit of the file * "obj" where we write the interpreter code. */short	efil;#ifdef OBJshort	ofil;short	obuf[518];#endifbool	Enoline;#define	elineoff()	Enoline = TRUE#define	elineon()	Enoline = FALSE/* * SYMBOL TABLE STRUCTURE DEFINITIONS * * The symbol table is henceforth referred to as the "namelist". * It consists of a number of structures of the form "nl" below. * These are contained in a number of segments of the symbol * table which are dynamically allocated as needed. * The major namelist manipulation routines are contained in the * file "nl.c". * * The major components of a namelist entry are the "symbol", giving * a pointer into the string table for the string associated with this * entry and the "class" which tells which of the (currently 19) * possible types of structure this is. * * Many of the classes use the "type" field for a pointer to the type * which the entry has. * * Other pieces of information in more than one class include the block * in which the symbol is defined, flags indicating whether the symbol * has been used and whether it has been assigned to, etc. * * A more complete discussion of the features of the namelist is impossible * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation * Notes" for more details. *//* * The basic namelist structure. * There is a union of data types defining the stored information * as pointers, integers, longs, or a double. * * The array disptab defines the hash header for the symbol table. * Symbols are hashed based on the low 6 bits of their pointer into * the string table; see the routines in the file "lookup.c" and also "fdec.c" * especially "funcend". */extern int	pnumcnt;struct	nl {	char	*symbol;	char	info[4];	struct	nl *type;	struct	nl *chain, *nl_next;	union {		struct nl *un_ptr[5];		int	   un_value[5];		long	   un_range[2];		double	   un_real;		struct nl  *un_nptr[5];	/* Points to conformant array bounds */	} nl_un;#	ifdef PTREE	    pPointer	inTree;#	endif PTREE};#define class		info[0]#define nl_flags	info[1]#define nl_block	info[1]#define extra_flags	info[2]#define align_info	info[3]#define range	nl_un.un_range#define value	nl_un.un_value#define ptr	nl_un.un_ptr#define real	nl_un.un_real#define nptr	nl_un.un_nptr	extern struct nl *nlp, *disptab[077+1], *Fp;extern struct nl nl[INL];/* * NL FLAGS BITS * * Definitions of the usage of the bits in * the nl_flags byte. Note that the low 5 bits of the * byte are the "nl_block" and that some classes make use * of this byte as a "width". * * The only non-obvious bit definition here is "NFILES" * which records whether a structure contains any files. * Such structures are not allowed to be dynamically allocated. */#define	BLOCKNO( flag )	( flag & 037 )#define NLFLAGS( flag ) ( flag &~ 037 )#define	NUSED	0100#define	NMOD	0040#define	NFORWD	0200#define	NFILES	0200#ifdef PC#define NEXTERN 0001	/* flag used to mark external funcs and procs */#define	NLOCAL	0002	/* variable is a local */#define	NPARAM	0004	/* variable is a parameter */#define	NGLOBAL	0010	/* variable is a global */#define	NREGVAR	0020	/* or'ed in if variable is in a register */#define NNLOCAL 0040	/* named local variable, not used in symbol table */#endif PC/* * used to mark value[ NL_FORV ] for loop variables */#define	FORVAR		1/* * Definition of the commonly used "value" fields. * The most important one is NL_OFFS which gives * the offset of a variable in its stack mark. */#define NL_OFFS	0#define	NL_CNTR	1#define NL_NLSTRT 2#define	NL_LINENO 3#define	NL_FVAR	3#define	NL_ENTLOC 4	/* FUNC, PROC - entry point */#define	NL_FCHAIN 4	/* FFUNC, FPROC - ptr to formals */#define NL_GOLEV 2#define NL_GOLINE 3#define NL_FORV 1    /*     *	nlp -> nl_un.un_ptr[] subscripts for records     *	NL_FIELDLIST	the chain of fixed fields of a record, in order.     *			the fields are also chained through ptr[NL_FIELDLIST].     *			this does not include the tag, or fields of variants.     *	NL_VARNT	pointer to the variants of a record,     *			these are then chained through the .chain field.     *	NL_VTOREC	pointer from a VARNT to the RECORD that is the variant.     *	NL_TAG		pointer from a RECORD to the tagfield     *			if there are any variants.     *	align_info	the alignment of a RECORD is in info[3].     */#define	NL_FIELDLIST	1#define	NL_VARNT	2#define	NL_VTOREC	2#define	NL_TAG		3/* and align_info is info[3].  #defined above */#define	NL_ELABEL 4	/* SCAL - ptr to definition of enums *//* * For BADUSE nl structures, NL_KINDS is a bit vector * indicating the kinds of illegal usages complained about * so far.  For kind of bad use "kind", "1 << kind" is set. * The low bit is reserved as ISUNDEF to indicate whether * this identifier is totally undefined. */#define	NL_KINDS	0#define	ISUNDEF		1    /*     *	variables come in three flavors: globals, parameters, locals;     *	they can also hide in registers, but that's a different flag     */#define PARAMVAR	1#define LOCALVAR	2#define	GLOBALVAR	3#define	NAMEDLOCALVAR	4/* * NAMELIST CLASSES * * The following are the namelist classes. * Different classes make use of the value fields * of the namelist in different ways. * * The namelist should be redesigned by providing * a number of structure definitions with one corresponding * to each namelist class, ala a variant record in Pascal. */#define	BADUSE	0#define	CONST	1#define	TYPE	2#define	VAR	3#define	ARRAY	4#define	PTRFILE	5#define	RECORD	6#define	FIELD	7#define	PROC	8#define	FUNC	9#define	FVAR	10#define	REF	11#define	PTR	12#define	FILET	13#define	SET	14#define	RANGE	15#define	LABEL	16#define	WITHPTR 17#define	SCAL	18#define	STR	19#define	PROG	20#define	IMPROPER 21#define	VARNT	22

⌨️ 快捷键说明

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