Annotation of 43BSD/contrib/icon/h/rt.h, revision 1.1

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))

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.