|
|
1.1 root 1: /*
2: * Definitions and declarations used throughout the run-time system.
3: */
4:
5: #include <stdio.h>
6: #include "../h/config.h"
7: #ifdef VAX
8: /*
9: * Memory sizes.
10: */
11: #define MAXHEAPSIZE 51200 /* size of the heap in bytes */
12: #define MAXSTRSPACE 51200 /* size of the string space in bytes */
13: #define STACKSIZE 2000 /* size of co-expression stack in words */
14: #define MAXSTACKS 4 /* number of coexpression stacks */
15: #define NUMBUF 10 /* number of i/o buffers available */
16: #define NBUCKETS 37 /* number of hash buckets */
17: /*
18: * Implementation specific constants.
19: */
20: #define INTSIZE 32 /* bits per integer */
21: #define LOGINTSIZE 5 /* log of INTSIZE */
22: #define MINSHORT 0100000 /* smallest short integer */
23: #define MAXSHORT 077777 /* largest short integer */
24: #define MINLONG 020000000000L /* smallest long integer */
25: #define MAXLONG 017777777777L /* largest long integer */
26: #define LGHUGE 39 /* maximum base-10 exp+1 of real */
27: #define FRAMELIMIT 2 /* maxmum negative offset in proc frame */
28: #define WORDSIZE sizeof(int *) /* size in bytes of a pointer */
29: #define STKBASE 0x7fffffff /* highest possible address for sp */
30: #define GRANSIZE 1024 /* storage allocation granule size */
31: /*
32: * Some macros for source code tailoring.
33: */
34: #define SetBound setbound()
35: #define ClearBound clrbound()
36: #define DclSave register int saveefp,savegfp;
37: #define EntryPoint(x) (char *)x + 2
38: #define Global(x) .globl x
39: #define DummyFcn(x) .globl x; x: halt
40: #define DummyData(x) .globl x; x: .long 0
41: #define DummyRef(x) .long x
42: #define gfp r10
43: #define efp r11
44: #define ipc r9
45: /*
46: * Cset initialization macros.
47: */
48: #define twd(w0, w1) ((w0)&0xffff | (w1)<<16)
49: #define cset_display(w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,wa,wb,wc,wd,we,wf) \
50: {twd(w0,w1),twd(w2,w3),twd(w4,w5),twd(w6,w7), \
51: twd(w8,w9),twd(wa,wb),twd(wc,wd),twd(we,wf)}
52: #endif VAX
53: #ifdef PORT
54: /*
55: * Memory sizes.
56: */
57: #define MAXHEAPSIZE x /* size of the heap in bytes */
58: #define MAXSTRSPACE x /* size of the string space in bytes */
59: #define STACKSIZE x /* size of coexpression stack in WORDSIZE
60: words */
61: #define MAXSTACKS x /* number of coexpression stacks */
62: #define NUMBUF x /* number of i/o buffers available */
63: #define NBUCKETS x /* number of hash buckets */
64: /*
65: * Implementation specific constants.
66: */
67: #define INTSIZE x /* bits per integer */
68: #define LOGINTSIZE x /* log of INTSIZE */
69: #define MINSHORT x /* smallest short integer */
70: #define MAXSHORT x /* largest short integer */
71: #define MINLONG x /* smallest long integer */
72: #define MAXLONG x /* largest long integer */
73: #define LGHUGE x /* maximum base-10 exp + 1 of float number */
74: #define FRAMELIMIT x /* maximum negative offset in proc frame (int) */
75: #define WORDSIZE sizeof(int *) /* size in bytes of a pointer */
76: #define STKBASE x /* highest possible address for sp */
77: #define GRANSIZE x /* storage allocation granule size */
78: /*
79: * Some macros to allow customization.
80: */
81: /*#define SetBound*/
82: /*#define ClearBound*/
83: /*#define DclSave*/
84: /*#define EntryPoint(name) (char *)name + x*/
85: /*#define Global(x)*/
86: /*#define DummyFcn(x)*/
87: /*#define DummyData(x)*/
88: /*#define DummyRef(x)*/
89: /*#define gfp x*/
90: /*#define efp x*/
91: /*#define ipc x*/
92: /*
93: * Cset initialization macros.
94: */
95: /*
96: For ints with 32 bits use these:
97:
98: #define twd(w0, w1) ((w0)&0xffff | (w1)<<16)
99: #define cset_display(w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,wa,wb,wc,wd,we,wf) \
100: {twd(w0,w1),twd(w2,w3),twd(w4,w5),twd(w6,w7), \
101: twd(w8,w9),twd(wa,wb),twd(wc,wd),twd(we,wf)}
102:
103: For ints with 16 bits use these:
104:
105: #define cset_display(w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,wa,wb,wc,wd,we,wf) \
106: {w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,wa,wb,wc,wd,we,wf}
107: */
108: #endif PORT
109:
110: #ifdef PDP11
111: #define MAXHEAPSIZE 10240 /* size of the heap in bytes */
112: #define MAXSTRSPACE 10240 /* size of the string space in bytes */
113: #define STACKSIZE 1000 /* size a coexpression stack in WORDSIZE
114: words */
115: #define MAXSTACKS 2 /* number of coexpression stacks */
116: #define NUMBUF 5 /* number of i/o buffers available */
117: #define NBUCKETS 13 /* number of hash buckets */
118: #define MAXLISTSIZE 4090 /* Defined if lists are limited in size
119: due to addressing limitations of a
120: particular architecture. Specified
121: value is the largest list element
122: block that can be made. */
123: /*
124: * Implementation specific constants.
125: */
126: #define INTSIZE 16 /* bits per integer */
127: #define LOGINTSIZE 4 /* log of INTSIZE */
128: #define LONGS /* longs are not same as ints */
129: #define MINLONG 020000000000L /* smallest long integer */
130: #define MAXLONG 017777777777L /* largest long integer */
131: #define MINSHORT 0100000 /* smallest short integer */
132: #define MAXSHORT 077777 /* largest short integer */
133: #define LGHUGE 39 /* maximum base-10 exp +1 of float number */
134: #define FRAMELIMIT 5 /* maxmum negative offset in proc frame (int) */
135: #define WORDSIZE sizeof(int *) /* size in bytes of a pointer */
136: #define STKBASE 0177776 /* highest possible address for sp */
137: #define GRANSIZE 64 /* storage allocation granule size */
138: /*
139: * Some macros to allow customization.
140: */
141: #define SetBound
142: #define ClearBound
143: #define DclSave
144: #define EntryPoint(x) (char *)x + 4
145: #define Global(x) .globl x
146: #define DummyFcn(x) .globl x; x: 0
147: #define DummyData(x) .globl x; x: 0
148: #define DummyRef(x) .globl x; x
149: /*
150: * Cset initialization macros.
151: */
152: #define cset_display(w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,wa,wb,wc,wd,we,wf) \
153: {w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,wa,wb,wc,wd,we,wf}
154: #endif PDP11
155:
156: /*
157: * Constants that are not likely to vary between implementations.
158: */
159: #define BITOFFMASK (INTSIZE-1)
160: #define CSETSIZE (256/INTSIZE) /* number of ints to hold 256 cset
161: bits. Use (256/INTSIZE)+1 if
162: 256 % INTSIZE != 0 */
163: #define LISTBLKSIZE 8 /* number of elements in an expansion
164: * list element block */
165: #define MAXSTRING 257 /* largest string in conversions */
166: #define MAXREADSTRING 2049 /* largest string to read() in one piece */
167: #define RANDA 1103515245 /* random seed multiplier */
168: #define RANDC 453816694 /* random seed additive constant */
169: #define RSCALE 4.65661286e-10 /* random scale factor = 1/(2^31-1)) */
170:
171: /*
172: * Offset in word of cset bit.
173: */
174: #define CSOFF(b) ((b) & BITOFFMASK)
175: /*
176: * Address of word of cset bit.
177: */
178: #define CSPTR(b,c) ((c) + (((b)&0377) >> LOGINTSIZE))
179: /*
180: * Set bit b in cset c.
181: */
182: #define setb(b,c) (*CSPTR(b,c) |= (01 << CSOFF(b)))
183: /*
184: * Test bit b in cset c.
185: */
186: #define tstb(b,c) ((*CSPTR(b,c) >> CSOFF(b)) & 01)
187:
188: /*
189: * Runtime data structures.
190: */
191:
192: union numeric { /* long integers or real numbers */
193: long integer;
194: double real;
195: };
196:
197: struct descrip { /* descriptor */
198: int type; /* type field */
199: union {
200: int integr; /* integer value */
201: char *cptr; /* pointer to character string */
202: union block *bptr; /* pointer to a block */
203: struct descrip *dptr; /* pointer to a descriptor */
204: } value;
205: };
206:
207: struct sdescrip {
208: int length; /* length of string */
209: char *string; /* pointer to string */
210: };
211:
212: struct b_int { /* long integer block */
213: int type; /* T_LONGINT */
214: long intval; /* value */
215: };
216:
217: struct b_real { /* real block */
218: int type; /* T_REAL */
219: double realval; /* value */
220: };
221:
222: struct b_cset { /* cset block */
223: int type; /* T_CSET */
224: int bits[CSETSIZE]; /* array of bits, one per ascii character */
225: };
226:
227: struct b_file { /* file block */
228: int type; /* T_FILE */
229: FILE *fd; /* Unix file descriptor */
230: int status; /* file status */
231: struct descrip fname; /* file name (string qualifier) */
232: };
233:
234: struct b_proc { /* procedure block */
235: int type; /* T_PROC */
236: int size; /* size of block */
237: char *entryp; /* entry point (code) */
238: int nparam; /* number of parameters */
239: int ndynam; /* number of dynamic locals */
240: int nstatic; /* number of static locals */
241: int fstatic; /* index (in global table) of first static */
242: struct descrip pname; /* procedure name (string qualifier) */
243: struct descrip lnames[1]; /* list of local names (qualifiers) */
244: };
245:
246: /*
247: * b_iproc blocks are used to statically initialize information about
248: * functions. They are identical to b_proc blocks except for
249: * the pname field which is a sdecrip (simple/string descriptor) instead
250: * of a descrip. This is done because unions can't be initialized.
251: */
252:
253: struct b_iproc { /* procedure block */
254: int ip_type; /* T_PROC */
255: int ip_size; /* size of block */
256: char *ip_entryp; /* entry point (code) */
257: int ip_nparam; /* number of parameters */
258: int ip_ndynam; /* number of dynamic locals */
259: int ip_nstatic; /* number of static locals */
260: int ip_fstatic; /* index (in global table) of first static */
261: struct sdescrip ip_pname; /* procedure name (string qualifier) */
262: struct descrip ip_lnames[1]; /* list of local names (qualifiers) */
263: };
264:
265: struct b_list { /* list header block */
266: int type; /* T_LIST */
267: int cursize; /* current list size */
268: struct descrip listhead; /* pointer to first list element block */
269: struct descrip listtail; /* pointer to last list element block */
270: };
271:
272: struct b_lelem { /* list element block */
273: int type; /* T_LELEM */
274: int size; /* size of block */
275: int nelem; /* total number of elements */
276: int first; /* index of first element */
277: int nused; /* number of used elements */
278: struct descrip listprev; /* pointer to previous list element block */
279: struct descrip listnext; /* pointer to next list element block */
280: struct descrip lslots[1]; /* array of elements */
281: };
282:
283: struct b_table { /* table header block */
284: int type; /* T_TABLE */
285: int cursize; /* current table size */
286: struct descrip defvalue; /* default table element value */
287: struct descrip buckets[NBUCKETS]; /* hash buckets */
288: };
289:
290: struct b_telem { /* table element block */
291: int type; /* T_TELEM */
292: int hashnum; /* for ordering chain */
293: struct descrip blink; /* hash bucket link */
294: struct descrip tref; /* reference field */
295: struct descrip tval; /* value field */
296: };
297:
298: #ifdef SETS
299: struct b_set { /* set header block */
300: int type; /* T_SET */
301: int setsize; /* cardinality of the set */
302: struct descrip sbucks[NBUCKETS]; /* hash buckets */
303: };
304:
305: struct b_selem { /* set element block */
306: int type; /* T_SELEM */
307: int hnum; /* hash number */
308: struct descrip setmem; /* the element */
309: struct descrip sblink; /* hash chain link */
310: };
311: #endif SETS
312:
313: struct b_record { /* record block */
314: int type; /* T_RECORD */
315: int size; /* size of block */
316: struct b_proc *recptr; /* pointer to record constructor proc */
317: struct descrip fields[1]; /* fields */
318: };
319:
320: struct b_tvsubs { /* substring trapped variable block */
321: int type; /* T_TVSUBS */
322: int sslen; /* length of substring */
323: int sspos; /* position of substring */
324: struct descrip ssvar; /* variable that substring is from */
325: };
326:
327: struct b_tvtbl { /* table element trapped variable block */
328: int type; /* T_TVTBL */
329: int hashnum; /* for ordering */
330: struct descrip tvtable; /* pointer to table header block */
331: struct descrip tvtref; /* reference field */
332: struct descrip tvtval; /* used when block is converted to telem */
333: };
334:
335: struct b_estack { /* co-expression stack block */
336: int type; /* T_ESTACK */
337: struct descrip activator; /* most recent activator */
338: int *sbase; /* stack base */
339: int *sp; /* stack pointer */
340: int *ap; /* address pointer, only on Vax */
341: int *boundary; /* Icon/C boundary */
342: int nresults; /* number of results produced */
343: struct descrip freshblk; /* refresh block pointer */
344: };
345:
346: struct b_eblock { /* co-expression heap block */
347: int type; /* T_EBLOCK */
348: int size; /* size of block */
349: int *ep; /* entry point */
350: int numargs; /* number of arguments */
351: int numlocals; /* number of locals */
352: struct descrip elems[1]; /* arguments and locals, including arg0 */
353: };
354:
355: union block { /* general heap block */
356: struct b_int longint;
357: struct b_real realblk;
358: struct b_cset cset;
359: struct b_file file;
360: struct b_proc proc;
361: struct b_list list;
362: struct b_lelem lelem;
363: struct b_table table;
364: struct b_telem telem;
365: #ifdef SETS
366: struct b_set set;
367: struct b_selem selem;
368: #endif SETS
369: struct b_record record;
370: struct b_tvsubs tvsubs;
371: struct b_tvtbl tvtbl;
372: struct b_estack estack;
373: struct b_eblock eblock;
374: };
375:
376: /*
377: * External declarations.
378: */
379:
380: extern char (*bufs)[BUFSIZ]; /* i/o buffers */
381: extern FILE **bufused; /* i/o buffer use markers */
382:
383: extern int *stacks; /* start of expression stack space */
384: extern int *estacks; /* end of expression stack space */
385: extern int *esfree; /* expression stack space free list header */
386:
387: extern int ssize; /* size of string space (bytes) */
388: extern char *strings; /* start of string space */
389: extern char *estrings; /* end of string space */
390: extern char *sfree; /* string space free pointer */
391:
392: extern int hpsize; /* size of heap (words) */
393: extern char *hpbase; /* base of heap */
394: extern char *maxheap; /* maximum address in heap */
395: extern char *hpfree; /* first free location in heap */
396:
397: extern int bsizes[]; /* sizes of heap blocks */
398: extern int firstd[]; /* offset (words) of first descrip. */
399: extern char *blkname[]; /* print names for block types. */
400:
401: extern int numbufs; /* number of buffers */
402:
403: extern int stksize; /* size of coexpression stacks in words */
404:
405: extern struct b_cset k_ascii; /* value of &ascii */
406: extern struct b_cset k_cset; /* value of &cset */
407: extern struct b_file k_errout; /* value of &errout */
408: extern struct b_file k_input; /* value of &input */
409: extern struct b_cset k_lcase; /* value of &lcase */
410: extern int k_level; /* value of &level */
411: extern int k_pos; /* value of &pos */
412: extern struct descrip k_main; /* value of &main */
413: extern struct b_file k_output; /* value of &output */
414: extern long k_random; /* value of &random */
415: extern struct descrip k_subject; /* value of &subject */
416: extern int k_trace; /* value of &trace */
417: extern struct b_cset k_ucase; /* value of &ucase */
418: extern long starttime; /* start time in milliseconds */
419: extern struct descrip nulldesc; /* universal &null */
420: extern struct descrip zerodesc; /* universal 0 */
421: extern struct descrip onedesc; /* universal 1 */
422: extern struct descrip nullstr; /* universal null string */
423: extern struct descrip blank; /* universal blank */
424: extern struct descrip letr; /* universal letter 'r' */
425: extern struct descrip maps2; /* save space for 2nd arg to map() */
426: extern struct descrip maps3; /* save space for 3rd arg to map() */
427: extern struct descrip current; /* current expression stack pointer */
428: extern struct descrip input; /* universal input file */
429: extern struct descrip errout; /* universal error file */
430: extern struct descrip lcase; /* universal lower case string */
431: extern struct descrip ucase; /* universal upper case string */
432:
433: extern int line; /* current source program line number */
434: extern char *file; /* current source program file name */
435:
436: /*
437: * Descriptor flags.
438: */
439: #ifdef VAX
440: #define F_NQUAL 0x80000000 /* set if NOT string qualifier */
441: #define F_VAR 0x40000000 /* set if variable */
442: #define F_TVAR 0x20000000 /* set if trapped variable */
443: #define F_PTR 0x10000000 /* set if value field is pointer */
444: #endif VAX
445:
446: #ifdef PORT
447: #define F_NQUAL x /* set if NOT string qualifier */
448: #define F_VAR x /* set if variable */
449: #define F_TVAR x /* set if trapped variable */
450: #define F_PTR x /* set if value field is pointer */
451: #endif PORT
452:
453: #ifdef PDP11
454: #define F_NQUAL 0100000 /* set if NOT string qualifier */
455: #define F_VAR 0040000 /* set if variable */
456: #define F_TVAR 0020000 /* set if trapped variable */
457: #define F_PTR 0010000 /* set if value field is pointer */
458: #endif PDP11
459:
460: #define TYPEMASK 63 /* type mask */
461: #define OFFSETMASK (~(F_NQUAL|F_VAR|F_TVAR)) /* offset mask for variables */
462:
463: /*
464: * Type codes (descriptors and blocks).
465: */
466:
467: #define T_INTEGER 1 /* short integer */
468: /*
469: * For 32 bit machines, e.g. the Vax, we make LONGINT's and INTEGER's
470: * the same. It would be better to have a generic integer type, and
471: * also have LONGINT's and SHORTINT's, but at the current time,
472: * LONGINT is used both to refer to integers not representable by
473: * a short, and as a generic integer type.
474: */
475: #ifdef LONGS
476: #define T_LONGINT 2 /* long integer */
477: #else LONGS
478: #define T_LONGINT 1 /* long integer */
479: #endif LONGS
480: #define T_REAL 3 /* real number */
481: #define T_CSET 4 /* cset */
482: #define T_FILE 5 /* file block */
483: #define T_PROC 6 /* procedure block */
484: #define T_LIST 7 /* list header block */
485: #define T_TABLE 8 /* table header */
486: #define T_RECORD 9 /* record block */
487: #define T_TELEM 10 /* table element block */
488: #define T_LELEM 11 /* list element block */
489: #define T_TVSUBS 12 /* substring trapped variable */
490: #define JUNK_13 13 /* (no longer used) */
491: #define T_TVTBL 14 /* table element trapped variable block */
492: #define T_TVPOS 15 /* &pos trapped variable */
493: #define T_TVRAND 16 /* &random trapped variable */
494: #define T_TVTRACE 17 /* &trace trapped variable */
495: #define T_ESTACK 18 /* expression stack block */
496: #define T_EBLOCK 19 /* expression heap block */
497: #ifdef SETS
498: #define T_SET 20 /* set header block */
499: #define T_SELEM 21 /* set element block */
500:
501: #define MAXTYPE 21 /* maximum type number */
502: #else SETS
503: #define MAXTYPE 19 /* maximum type number w/o sets */
504: #endif SETS
505:
506: /*
507: * Descriptor types and flags.
508: */
509:
510: #define D_VAR (F_VAR | F_NQUAL)
511: #define D_TVAR (F_VAR | F_TVAR | F_NQUAL)
512:
513: #define D_NULL 0
514: #define D_INTEGER (T_INTEGER | F_NQUAL)
515: #define D_LONGINT (T_LONGINT | F_PTR | F_NQUAL)
516: #define D_REAL (T_REAL | F_PTR | F_NQUAL)
517: #define D_CSET (T_CSET | F_PTR | F_NQUAL)
518: #define D_FILE (T_FILE | F_PTR | F_NQUAL)
519: #define D_PROC (T_PROC | F_PTR | F_NQUAL)
520: #define D_LIST (T_LIST | F_PTR | F_NQUAL)
521: #define D_TABLE (T_TABLE | F_PTR | F_NQUAL)
522: #ifdef SETS
523: #define D_SET (T_SET | F_PTR | F_NQUAL)
524: #define D_SELEM (T_SELEM | F_PTR | F_NQUAL)
525: #endif SETS
526: #define D_RECORD (T_RECORD | F_PTR | F_NQUAL)
527: #define D_TELEM (T_TELEM | F_PTR | F_NQUAL)
528: #define D_LELEM (T_LELEM | F_PTR | F_NQUAL)
529: #define D_TVSUBS (T_TVSUBS | D_TVAR)
530: #define D_TVTBL (T_TVTBL | D_TVAR)
531: #define D_TVPOS (T_TVPOS | D_TVAR)
532: #define D_TVRAND (T_TVRAND | D_TVAR)
533: #define D_TVTRACE (T_TVTRACE | D_TVAR)
534: #define D_ESTACK (T_ESTACK | F_PTR | F_NQUAL)
535: #define D_EBLOCK (T_EBLOCK | F_PTR | F_NQUAL)
536:
537: /*
538: * File status flags in status field of file blocks.
539: */
540:
541: #define FS_READ 01 /* read access */
542: #define FS_WRITE 02 /* write access */
543: #define FS_CREATE 04 /* file created on open */
544: #define FS_APPEND 010 /* append mode */
545: #define FS_PIPE 020 /* reading/writing on a pipe */
546:
547: /*
548: * Macros for testing descriptors. d must be of type struct descrip.
549: */
550:
551: #define NULLDESC(d) (((d).type|(d).value.integr)==0) /* check for &null */
552:
553: /*
554: * String qualifiers.
555: */
556: #define QUAL(d) (!((d).type & F_NQUAL)) /* check for qualifier */
557: #define STRLEN(d) ((d).type) /* get length of string */
558: #define STRLOC(d) ((d).value.cptr) /* get address of string */
559:
560: /*
561: * Values, d must not be qualifier or variable.
562: */
563: #define TYPE(d) ((d).type & TYPEMASK) /* get type code */
564: #define POINTER(d) ((d).type & F_PTR) /* check for pointer */
565: #define INTVAL(d) ((d).value.integr) /* get short integer value */
566: #define BLKLOC(d) ((d).value.bptr) /* get pointer to block */
567:
568: /*
569: * Variables, d must not be qualifier.
570: */
571: #define VAR(d) ((d).type & F_VAR) /* check for variable */
572: #define TVAR(d) ((d).type & F_TVAR) /* check for trapped var */
573: #define OFFSET(d) ((d).type & OFFSETMASK) /* get offset field */
574: #define VARLOC(d) ((d).value.dptr) /* get pointer to descriptor */
575: #define TVARLOC(d) ((d).value.bptr) /* get ptr to t.v. block */
576:
577: /*
578: * Macros to define procedure blocks.
579: */
580: #define IDENT(x) x
581: #define CAT(x,y) IDENT(x)y
582: #define Procblock(f,nargs)\
583: struct b_iproc CAT(B,f) = {\
584: T_PROC,\
585: vsizeof(struct b_proc),\
586: EntryPoint(CAT(X,f)),\
587: nargs,\
588: -1,\
589: 0, 0,\
590: {sizeof("f")-1,"f"}};
591:
592: #define Opblock(a,b,c) Opblock1(a,b,c,0)
593: #define Opblockx(a,b,c,d) Opblock1(a,b,c,-d)
594: #define Opblock1(f,nargs,sname,realargs)\
595: struct b_iproc CAT(B,f) = {\
596: T_PROC,\
597: vsizeof(struct b_proc),\
598: EntryPoint(f),\
599: nargs,\
600: -1,\
601: realargs,\
602: 0,\
603: {sizeof(sname)-1,sname}};
604:
605: /*
606: * Macros to access Icon arguments from C-language library procedures.
607: * Library procedures must have exactly one argument, named nargs.
608: */
609:
610: /*
611: * n-th argument.
612: */
613: #define ARG(n) (*((struct descrip *)(&nargs+1)+(nargs-n)))
614: /*
615: * Type field of n-th argument.
616: */
617: #define ARGTYPE(n) (*(&nargs+1+2*(nargs-n)))
618: /*
619: * Value field of n-th argument.
620: */
621: #define ARGVAL(n) (*(&nargs+2+2*(nargs-n)))
622:
623: /*
624: * Minimum of x and y.
625: */
626: #define MIN(x,y) ((x)<(y)?(x):(y))
627:
628: /*
629: * Maximum of x and y.
630: */
631: #define MAX(x,y) ((x)>(y)?(x):(y))
632:
633: /*
634: * Derefence d.
635: */
636: #define DeRef(d) if(!QUAL(d)&&VAR(d))deref(&d);
637:
638: /*
639: * vsizeof is for use with variable-sized (i.e., indefinite)
640: * structures containing an array declared of size 1
641: * to avoid compiler warnings associated with 0-sized arrays.
642: */
643:
644: #define vsizeof(s) (sizeof(s) - sizeof(struct descrip))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.