|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: /* static char sccsid[] = "@(#)vars.h 1.12 1/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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.