xref: /original-bsd/usr.bin/pascal/px/vars.h (revision b64b0d54)
1 /* Copyright (c) 1979 Regents of the University of California */
2 
3 /* static char sccsid[] = "@(#)vars.h 1.12 01/22/83"; */
4 
5 #include <stdio.h>
6 
7 /*
8  * px - Berkeley Pascal interpreter
9  *
10  * Version 4.0, January 1981
11  *
12  * Original version by Ken Thompson
13  *
14  * Substantial revisions by Bill Joy and Chuck Haley
15  * November-December 1976
16  *
17  * Rewritten for VAX 11/780 by Kirk McKusick
18  * Fall 1978
19  *
20  * Rewritten in ``C'' using libpc by Kirk McKusick
21  * Winter 1981
22  *
23  * Px is described in detail in the "PX 4.0 Implementation Notes"
24  * The source code for px is in several major pieces:
25  *
26  *	int.c		C main program which reads in interpreter code
27  *	interp.c	Driver including main interpreter loop and
28  *			the interpreter instructions grouped by their
29  *			positions in the interpreter table.
30  *	utilities.c	Interpreter exit, backtrace, and runtime statistics.
31  *
32  * In addition there are several headers defining mappings for panic
33  * names into codes, and a definition of the interpreter transfer
34  * table. These are made by the script make.ed1 in this directory and
35  * the routine opc.c from ${PASCALDIR}. (see the makefile for details)
36  */
37 #define PXPFILE		"pmon.out"
38 #define	BITSPERBYTE	8
39 #define	BITSPERLONG	(BITSPERBYTE * sizeof(long))
40 #define HZ		100
41 #define NAMSIZ		76
42 #define MAXFILES	32
43 #define PREDEF		2
44 #ifdef ADDR32
45 #define STDLVL		((struct iorec *)(0x7ffffff1))
46 #define GLVL		((struct iorec *)(0x7ffffff0))
47 #endif ADDR32
48 #ifdef ADDR16
49 #define STDLVL		((struct iorec *)(0xfff1))
50 #define GLVL		((struct iorec *)(0xfff0))
51 #endif ADDR16
52 #define FILNIL		((struct iorec *)(0))
53 #define INPUT		((struct iorec *)(&input))
54 #define OUTPUT		((struct iorec *)(&output))
55 #define ERR		((struct iorec *)(&_err))
56 #define	PX	0	/* normal run of px */
57 #define	PIX	1	/* load and go */
58 #define	PIPE	2	/* bootstrap via a pipe */
59 #define	PDX	3	/* invoked by the debugger "pdx" */
60 #define releq 0
61 #define relne 2
62 #define rellt 4
63 #define relgt 6
64 #define relle 8
65 #define relge 10
66 typedef enum {FALSE, TRUE} bool;
67 
68 /*
69  * interrupt and allocation routines
70  */
71 extern long createtime;
72 extern char *PALLOC();
73 extern char *malloc();
74 extern long time();
75 extern intr();
76 extern memsize();
77 extern syserr();
78 extern liberr();
79 
80 /*
81  * stack routines and structures
82  */
83 struct sze8 {
84 	char element[8];
85 };
86 extern short pop2();
87 extern long pop4();
88 extern double pop8();
89 extern struct sze8 popsze8();
90 extern char *pushsp();
91 
92 /*
93  * emulated pc types
94  */
95 union progcntr {
96 	char *cp;
97 	unsigned char *ucp;
98 	short *sp;
99 	unsigned short *usp;
100 	long *lp;
101 	double *dbp;
102 	struct hdr *hdrp;
103 };
104 
105 /*
106  * THE RUNTIME DISPLAY
107  *
108  * The entries in the display point to the active static block marks.
109  * The first entry in the display is for the global variables,
110  * then the procedure or function at level one, etc.
111  * Each display entry points to a stack frame as shown:
112  *
113  *		base of stack frame
114  *		  ---------------
115  *		  |		|
116  *		  | block mark  |
117  *		  |		|
118  *		  ---------------  <-- display entry "stp" points here
119  *		  |             |  <-- display entry "locvars" points here
120  *		  |   local	|
121  *		  |  variables  |
122  *		  |		|
123  *		  ---------------
124  *		  |		|
125  *		  |  expression |
126  *		  |  temporary  |
127  *		  |  storage	|
128  *		  |		|
129  *		  - - - - - - - -
130  *
131  * The information in the block mark is thus at positive offsets from
132  * the display.stp pointer entries while the local variables are at negative
133  * offsets from display.locvars. The block mark actually consists of
134  * two parts. The first part is created at CALL and the second at entry,
135  * i.e. BEGIN. Thus:
136  *
137  *		-------------------------
138  *		|			|
139  *		|  Saved lino		|
140  *		|  Saved lc		|
141  *		|  Saved dp		|
142  *		|			|
143  *		-------------------------
144  *		|			|
145  *		|  Saved (dp)		|
146  *		|			|
147  *		|  Pointer to current 	|
148  *		|   routine header info	|
149  *		|			|
150  *		|  Saved value of	|
151  *		|   "curfile"		|
152  *		|			|
153  *		|  Empty tos value	|
154  *		|			|
155  *		-------------------------
156  */
157 
158 /*
159  * program variables
160  */
161 extern union display	_display;	/* runtime display */
162 extern struct dispsave	*_dp;		/* ptr to active frame */
163 extern long		_lino;		/* current line number */
164 extern int		_argc;		/* number of passed args */
165 extern char		**_argv;	/* values of passed args */
166 extern bool		_nodump;	/* TRUE => no post mortum dump */
167 extern long		_runtst;	/* TRUE => runtime tests */
168 extern long		_mode;		/* execl by PX, PIPE, or PIX */
169 extern long		_stlim;		/* statement limit */
170 extern long		_stcnt;		/* statement count */
171 extern long		_seed;		/* random number seed */
172 extern char		*_maxptr;	/* maximum valid pointer */
173 extern char		*_minptr;	/* minimum valid pointer */
174 extern long		*_pcpcount;	/* pointer to pxp buffer */
175 extern long		_cntrs;		/* number of counters */
176 extern long		_rtns;		/* number of routine cntrs */
177 
178 /*
179  * The file i/o routines maintain a notion of a "current file".
180  * A pointer to this file structure is kept in "curfile".
181  *
182  * file structures
183  */
184 struct iorechd {
185 	char		*fileptr;	/* ptr to file window */
186 	long		lcount;		/* number of lines printed */
187 	long		llimit;		/* maximum number of text lines */
188 	FILE		*fbuf;		/* FILE ptr */
189 	struct iorec	*fchain;	/* chain to next file */
190 	struct iorec	*flev;		/* ptr to associated file variable */
191 	char		*pfname;	/* ptr to name of file */
192 	short		funit;		/* file status flags */
193 	short		fblk;		/* index into active file table */
194 	long		fsize;		/* size of elements in the file */
195 	char		fname[NAMSIZ];	/* name of associated UNIX file */
196 };
197 
198 struct iorec {
199 	char		*fileptr;	/* ptr to file window */
200 	long		lcount;		/* number of lines printed */
201 	long		llimit;		/* maximum number of text lines */
202 	FILE		*fbuf;		/* FILE ptr */
203 	struct iorec	*fchain;	/* chain to next file */
204 	struct iorec	*flev;		/* ptr to associated file variable */
205 	char		*pfname;	/* ptr to name of file */
206 	short		funit;		/* file status flags */
207 	short		fblk;		/* index into active file table */
208 	long		fsize;		/* size of elements in the file */
209 	char		fname[NAMSIZ];	/* name of associated UNIX file */
210 	char		buf[BUFSIZ];	/* I/O buffer */
211 	char		window[1];	/* file window element */
212 };
213 
214 /*
215  * unit flags
216  */
217 #define	FDEF	0x80	/* 1 => reserved file name */
218 #define	FTEXT	0x40	/* 1 => text file, process EOLN */
219 #define	FWRITE	0x20	/* 1 => open for writing */
220 #define	FREAD	0x10	/* 1 => open for reading */
221 #define	TEMP	0x08	/* 1 => temporary file */
222 #define	SYNC	0x04	/* 1 => window is out of sync */
223 #define	EOLN	0x02	/* 1 => at end of line */
224 #define	EOFF	0x01	/* 1 => at end of file */
225 
226 /*
227  * file routines
228  */
229 extern struct iorec	*GETNAME();
230 extern char		*MKTEMP();
231 
232 /*
233  * file record variables
234  */
235 extern struct iorechd	_fchain;	/* head of active file chain */
236 extern struct iorec	*_actfile[];	/* table of active files */
237 extern long		_filefre;	/* last used entry in _actfile */
238 
239 /*
240  * standard files
241  */
242 extern struct iorechd	input;
243 extern struct iorechd	output;
244 extern struct iorechd	_err;
245 
246 /*
247  * Px execution profile array
248  */
249 #ifdef PROFILE
250 #define	NUMOPS 256
251 extern long _profcnts[NUMOPS];
252 #endif PROFILE
253