BSD 4_1c_2 release
[unix-history] / usr / src / ucb / pascal / px / vars.h
CommitLineData
1e2b51bb
KM
1/* Copyright (c) 1979 Regents of the University of California */
2
e804469b 3/* static char sccsid[] = "@(#)vars.h 1.12 1/22/83"; */
1e2b51bb
KM
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.
1e2b51bb
KM
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))
980cb17c 40#define HZ 100
1e2b51bb
KM
41#define NAMSIZ 76
42#define MAXFILES 32
43#define PREDEF 2
a7012926 44#ifdef ADDR32
1e2b51bb
KM
45#define STDLVL ((struct iorec *)(0x7ffffff1))
46#define GLVL ((struct iorec *)(0x7ffffff0))
a7012926
KM
47#endif ADDR32
48#ifdef ADDR16
9a92014d
KM
49#define STDLVL ((struct iorec *)(0xfff1))
50#define GLVL ((struct iorec *)(0xfff0))
a7012926 51#endif ADDR16
1e2b51bb
KM
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 */
79029c32 59#define PDX 3 /* invoked by the debugger "pdx" */
1e2b51bb 60#define releq 0
15834a19
KM
61#define relne 2
62#define rellt 4
63#define relgt 6
64#define relle 8
65#define relge 10
9a92014d 66typedef enum {FALSE, TRUE} bool;
1e2b51bb
KM
67
68/*
69 * interrupt and allocation routines
70 */
71extern long createtime;
72extern char *PALLOC();
73extern char *malloc();
9a92014d 74extern long time();
1e2b51bb
KM
75extern intr();
76extern memsize();
1e2b51bb
KM
77extern syserr();
78extern liberr();
79
80/*
796c7f60 81 * stack routines and structures
1e2b51bb 82 */
796c7f60
KM
83struct sze8 {
84 char element[8];
85};
1e2b51bb
KM
86extern short pop2();
87extern long pop4();
88extern double pop8();
796c7f60 89extern struct sze8 popsze8();
1e2b51bb
KM
90extern char *pushsp();
91
92/*
93 * emulated pc types
94 */
95union progcntr {
96 char *cp;
97 unsigned char *ucp;
98 short *sp;
99 unsigned short *usp;
100 long *lp;
9a92014d 101 double *dbp;
1e2b51bb
KM
102 struct hdr *hdrp;
103};
104\f
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 * | |
15834a19
KM
118 * --------------- <-- display entry "stp" points here
119 * | | <-- display entry "locvars" points here
1e2b51bb
KM
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
15834a19
KM
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:
1e2b51bb
KM
136 *
137 * -------------------------
138 * | |
139 * | Saved lino |
140 * | Saved lc |
141 * | Saved dp |
142 * | |
143 * -------------------------
144 * | |
145 * | Saved (dp) |
146 * | |
15834a19
KM
147 * | Pointer to current |
148 * | routine header info |
1e2b51bb 149 * | |
15834a19
KM
150 * | Saved value of |
151 * | "curfile" |
1e2b51bb
KM
152 * | |
153 * | Empty tos value |
154 * | |
155 * -------------------------
156 */
157\f
1e2b51bb
KM
158/*
159 * program variables
160 */
831541c9
KM
161extern union display _display; /* runtime display */
162extern struct dispsave *_dp; /* ptr to active frame */
15834a19
KM
163extern long _lino; /* current line number */
164extern int _argc; /* number of passed args */
165extern char **_argv; /* values of passed args */
9a92014d 166extern bool _nodump; /* TRUE => no post mortum dump */
831541c9 167extern long _runtst; /* TRUE => runtime tests */
15834a19
KM
168extern long _mode; /* execl by PX, PIPE, or PIX */
169extern long _stlim; /* statement limit */
170extern long _stcnt; /* statement count */
50d6e33c 171extern long _seed; /* random number seed */
15834a19
KM
172extern char *_maxptr; /* maximum valid pointer */
173extern char *_minptr; /* minimum valid pointer */
174extern long *_pcpcount; /* pointer to pxp buffer */
175extern long _cntrs; /* number of counters */
176extern long _rtns; /* number of routine cntrs */
177\f
1e2b51bb
KM
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 */
184struct 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
198struct 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};
15834a19 213\f
1e2b51bb
KM
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 */
229extern struct iorec *GETNAME();
230extern char *MKTEMP();
231
232/*
233 * file record variables
234 */
235extern struct iorechd _fchain; /* head of active file chain */
236extern struct iorec *_actfile[]; /* table of active files */
237extern long _filefre; /* last used entry in _actfile */
238
239/*
240 * standard files
241 */
242extern struct iorechd input;
243extern struct iorechd output;
244extern struct iorechd _err;
15834a19 245
1e2b51bb 246/*
15834a19 247 * Px execution profile array
1e2b51bb 248 */
15834a19
KM
249#ifdef PROFILE
250#define NUMOPS 256
251extern long _profcnts[NUMOPS];
252#endif PROFILE