Annotation of 43BSD/contrib/apl/src/apl.h, revision 1.1

1.1     ! root        1: static char apl_h_Sccsid[] = "apl.h @(#)apl.h  1.5     2/16/84 Berkeley ";
        !             2: /*
        !             3:  *     UNIX APL\11
        !             4:  *
        !             5:  *
        !             6:  *     UNIX APL was originally written by Ken Thompson at Bell Labs.
        !             7:  *     It spent some time at Yale and finally arrived at Purdue
        !             8:  *     University.  Since 1976 it has been modified by Jim Besemer
        !             9:  *     and John Bruner at the School of Electrical Engineering, Purdue,
        !            10:  *     under the direction of Dr. Anthony P. Reeves.  It is currently
        !            11:  *     being developed and supported at Purdue/EE by J. Bruner and
        !            12:  *     A. Reeves on both PDP-11's and VAX-11/780's
        !            13:  */
        !            14: 
        !            15: #include <sys/param.h>
        !            16: /*
        !            17:  *     New file system param.h defines MIN and MAX; we
        !            18:  *     have to undefine them to avoid conflicts
        !            19:  */
        !            20: #ifdef MIN
        !            21: #  undef MIN
        !            22: #endif MIN
        !            23: #ifdef MAX
        !            24: #  undef MAX
        !            25: #endif MAX
        !            26: 
        !            27: #include <sys/stat.h>
        !            28: #include <sys/dir.h>
        !            29: #include <sys/time.h>
        !            30: #include <setjmp.h>
        !            31: 
        !            32: /*
        !            33:  * Configuration information
        !            34:  *
        !            35:  * The C preprocessor will automatically supply "vax" if APL is compiled
        !            36:  * on a VAX-11/780.
        !            37:  *
        !            38:  * Other configuration parameters which may be specified are:
        !            39:  *
        !            40:  * PURDUE_EE           enable special Purdue/EE code
        !            41:  * VMUNIX              enable code for Berkeley virtual UNIX stuff
        !            42:  *  VFORK              use vfork() when possible (implied by VMUNIX)
        !            43:  *  VLIMIT             use 4.1bsd vlimit() (implied by VMUNIX)
        !            44:  *  NDIR               4.2bsd directory format (implied by VMUNIX)
        !            45:  * APL2                        generate single-precision version
        !            46:  */
        !            47: 
        !            48: #ifdef VMUNIX
        !            49: #define        VLIMIT
        !            50: #define        VFORK
        !            51: #endif
        !            52: 
        !            53: #define        NFDS    20              /* Number of available fd's */
        !            54: #define        MAXEOT  8               /* # of input EOT's before panic */
        !            55: 
        !            56: /*
        !            57:  * Temp file names
        !            58:  */
        !            59: 
        !            60: #define WSFILE ws_file         /* work space file */
        !            61: 
        !            62: /*
        !            63:  * Magic Numbers
        !            64:  */
        !            65: 
        !            66: #define MRANK  8
        !            67: #define CANBS  300
        !            68: #define STKS   500
        !            69: #define NLS    200
        !            70: #define NAMS   40
        !            71: #define OBJS   500
        !            72: #define MAXLAB 30
        !            73: 
        !            74: #ifndef vax
        !            75: #ifdef APL2
        !            76: #define        MAGIC   0101555         /* PDP-11 single-precision format */
        !            77: #else
        !            78: #define        MAGIC   0101554         /* PDP-11 double-precision format */
        !            79: #endif
        !            80: #else
        !            81: #ifdef APL2
        !            82: #define        MAGIC   0101557         /* VAX single-precision format */
        !            83: #else
        !            84: #define        MAGIC   0101556         /* VAX double-precision format */
        !            85: #endif
        !            86: #endif
        !            87: 
        !            88: #ifdef APL2
        !            89: #define        data    float
        !            90: #else
        !            91: #define        data    double
        !            92: #endif
        !            93: 
        !            94: /*
        !            95:  * derived constants
        !            96:  */
        !            97: 
        !            98: #define        SDAT    sizeof(data)
        !            99: #define        SINT    sizeof(int)
        !           100: 
        !           101: /*
        !           102:  * Interpreter Op Codes
        !           103:  */
        !           104: 
        !           105: #define EOF    (-1)
        !           106: #define EOL    0
        !           107: 
        !           108: #define ADD    1
        !           109: #define PLUS   2
        !           110: #define SUB    3
        !           111: #define MINUS  4
        !           112: #define MUL    5
        !           113: #define SGN    6
        !           114: #define DIV    7
        !           115: #define RECIP  8
        !           116: #define MOD    9
        !           117: #define ABS    10
        !           118: #define MIN    11
        !           119: #define FLOOR  12
        !           120: #define MAX    13
        !           121: #define CEIL   14
        !           122: #define PWR    15
        !           123: #define EXP    16
        !           124: #define LOG    17
        !           125: #define LOGE   18
        !           126: #define CIR    19
        !           127: #define PI     20
        !           128: #define COMB   21
        !           129: #define FAC    22
        !           130: 
        !           131: #define DEAL   23
        !           132: #define RAND   24
        !           133: #define DRHO   25
        !           134: #define MRHO   26
        !           135: #define DIOT   27
        !           136: #define MIOT   28
        !           137: #define ROT0   29
        !           138: #define REV0   30
        !           139: #define DTRN   31
        !           140: #define MTRN   32
        !           141: #define DIBM   33
        !           142: #define MIBM   34
        !           143: 
        !           144: #define GDU    35
        !           145: #define GDUK   36
        !           146: #define GDD    37
        !           147: #define GDDK   38
        !           148: #define EXD    39
        !           149: #define SCAN   40
        !           150: #define EXDK   41
        !           151: #define SCANK  42
        !           152: #define IPROD  43
        !           153: #define OPROD  44
        !           154: #define QUAD   45
        !           155: #define QQUAD  46
        !           156: #define BRAN0  47
        !           157: #define BRAN   48
        !           158: #define DDOM   49
        !           159: #define MDOM   50
        !           160: 
        !           161: #define COM    51
        !           162: #define RED    52
        !           163: #define COMK   53
        !           164: #define REDK   54
        !           165: #define ROT    55
        !           166: #define REV    56
        !           167: #define ROTK   57
        !           168: #define REVK   58
        !           169: #define CAT    59
        !           170: #define RAV    60
        !           171: #define CATK   61
        !           172: #define RAVK   62
        !           173: 
        !           174: #define PRINT  63
        !           175: #define QUOT   64
        !           176: #define ELID   65
        !           177: #define CQUAD  66
        !           178: #define COMNT  67
        !           179: #define INDEX  68
        !           180: #define HPRINT 69
        !           181: 
        !           182: #define LT     71
        !           183: #define LE     72
        !           184: #define GT     73
        !           185: #define GE     74
        !           186: #define EQ     75
        !           187: #define NE     76
        !           188: #define AND    77
        !           189: #define OR     78
        !           190: #define NAND   79
        !           191: #define NOR    80
        !           192: #define NOT    81
        !           193: #define EPS    82
        !           194: #define MEPS   83
        !           195: #define REP    84
        !           196: #define TAKE   85
        !           197: #define DROP   86
        !           198: #define ASGN   88
        !           199: #define IMMED  89
        !           200: 
        !           201: 
        !           202: #define NAME   90
        !           203: #define CONST  91
        !           204: #define FUN    92
        !           205: #define ARG1   93
        !           206: #define ARG2   94
        !           207: #define AUTO   95
        !           208: #define REST   96
        !           209: 
        !           210: #define COM0   97
        !           211: #define RED0   98
        !           212: #define EXD0   99
        !           213: #define SCAN0  100
        !           214: #define BASE   101
        !           215: #define MENC   102     /*      monadic encode  */
        !           216: #define LABEL  103     /* statement label */
        !           217: #define PSI    104     /* PSI input character */
        !           218: #define PSI1   105     /* PSI monadic half */
        !           219: #define PSI2   106     /* PSI dyadic half */
        !           220: #define ISP    107     /* ISP input code */
        !           221: #define ISP1   108     /* ISP monadic half */
        !           222: #define ISP2   109     /* ISP dyadic half */
        !           223: #define QWID   110     /* quad fn1 */
        !           224: #define QFUZZ  111
        !           225: #define QRUN   112
        !           226: #define QFORK  113
        !           227: #define QWAIT  114
        !           228: #define QEXEC  115
        !           229: #define FDEF   116
        !           230: #define QEXIT  117
        !           231: #define QPIPE  118
        !           232: #define QCHDIR 119
        !           233: #define QOPEN  120
        !           234: #define QCLOSE 121
        !           235: #define QREAD  122
        !           236: #define QWRITE 123
        !           237: #define QCREAT 124
        !           238: #define QSEEK  125
        !           239: #define QUNLNK 126
        !           240: #define QRD    127
        !           241: #define QDUP   128
        !           242: #define QAP    129
        !           243: #define QKILL  130
        !           244: #define QCRP   131
        !           245: #define DFMT   132
        !           246: #define MFMT   133
        !           247: #define QNC    134
        !           248: #define NILRET 135
        !           249: #define XQUAD  136
        !           250: #define SICLR  137
        !           251: #define SICLR0 138
        !           252: #define RVAL   139
        !           253: #define QSIGNL 140
        !           254: #define        QFLOAT  141             /* Float character string to data */
        !           255: #define        QNL     142             /* Produce namelist */
        !           256: 
        !           257: /*
        !           258:  * Immediate sub-op codes
        !           259:  */
        !           260: 
        !           261: #define        CLEAR   1
        !           262: #define        DIGITS  2
        !           263: #define        EDIT    3
        !           264: #define        ERASE   4
        !           265: #define        FNS     5
        !           266: #define        FUZZ    6
        !           267: #define        READ    7
        !           268: #define        ORIGIN  8
        !           269: #define        VARS    9
        !           270: #define        WIDTH   10
        !           271: #define        DEBUG   11
        !           272: #define OFF    12
        !           273: #define LOAD   13
        !           274: #define SAVE   14
        !           275: #define COPY   15
        !           276: #define CONTIN 16
        !           277: #define LIB    17
        !           278: #define DROPC  18
        !           279: #define VSAVE  19
        !           280: #define SCRIPT 20
        !           281: #define EDITF  21
        !           282: #define TRACE  22
        !           283: #define UNTRACE        23
        !           284: #define WRITE  24
        !           285: #define RESET  25
        !           286: #define SICOM  26
        !           287: #define CODE   27
        !           288: #define        DEL     28
        !           289: #define        SHELL   29
        !           290: #define        LIST    30
        !           291: #define        PRWS    31
        !           292: 
        !           293: struct  chrstrct
        !           294: {
        !           295:        char    c[2];                   /* Can't be 0 anymore (VAX) */
        !           296: };
        !           297: 
        !           298: union uci
        !           299: {
        !           300:        char    cv[sizeof(int)];        /* character array */
        !           301:        unsigned i;                     /* unsigned integer value */
        !           302: };
        !           303: 
        !           304: data   zero;
        !           305: data   one;
        !           306: data   pi;
        !           307: data   maxexp; /* the largest value such that exp(maxexp) is defined */
        !           308: data   datum;
        !           309: data   getdat();
        !           310: int    funtrace;       /* function trace enabled */
        !           311: int    labgen;         /* label processing being done */
        !           312: int    apl_term;       /* flag set if apl terminal mapping req'd */
        !           313: jmp_buf        gbl_env;        /* Used for setexit/reset */
        !           314: 
        !           315: /*
        !           316:  * Several unrelated values, which appear
        !           317:  * together in the header of an apl workspace file.
        !           318:  */
        !           319: struct
        !           320: {
        !           321:        double  fuzz;
        !           322:        int     iorg;
        !           323:        int     digits;
        !           324:        int     width;
        !           325:        int     rl;             /* Random Seed (Ph.A. S.B.B.) */
        !           326: } thread;
        !           327: 
        !           328: /*
        !           329:  * Data types
        !           330:  * Each new type should be accomodated for 
        !           331:  * in dealloc [a0.c]
        !           332:  */
        !           333: 
        !           334: #define        DA      1
        !           335: #define        CH      2
        !           336: #define        LV      3
        !           337: #define        QD      4
        !           338: #define        QQ      5
        !           339: #define        IN      6
        !           340: #define        EL      7
        !           341: #define        NF      8
        !           342: #define        MF      9
        !           343: #define        DF      10
        !           344: #define        QC      11
        !           345: #define        QV      12      /* quad variables */
        !           346: #define DU     13      /* dummy -- causes fetch error except on print */
        !           347: #define QX     14      /* latent expr. quad "Llx" */
        !           348: #define LBL    15      /* locked label value */
        !           349: #define        NTYPES  16      /* number of defined types */
        !           350: 
        !           351: /*
        !           352:  * This is a descriptor for apl data, allocated by "newdat".
        !           353:  * The actual data starts at item.dim[item.rank], and thus
        !           354:  * &item.dim[item.rank] should always == item.datap.
        !           355:  * See the comment in "newdat" (a0.c) about "dim".
        !           356:  *
        !           357:  * A null item is a vector(!), and is rank==1, size==0.
        !           358:  *
        !           359:  * the stack is the operand stack, and sp is the pointer to the
        !           360:  * top of  the stack.
        !           361:  */
        !           362: 
        !           363: struct item
        !           364: {
        !           365:        char    rank;
        !           366:        char    type;
        !           367:        int     size;
        !           368:        int     index;
        !           369:        data    *datap;
        !           370:        int     dim[MRANK];
        !           371: } *stack[STKS], **sp;
        !           372: 
        !           373: /*
        !           374:  * variable/fn (and file name) descriptor block.
        !           375:  * contains useful information about all LVals.
        !           376:  * Also kludged up to handle file names (only nlist.namep 
        !           377:  * is then used.)
        !           378:  *
        !           379:  * For fns, nlist.itemp is an array of pointers to character
        !           380:  * strings which are the compiled code for a line of the fn.
        !           381:  * (Itemp == 0) means that the fn has not yet been compiled .
        !           382:  * nlist.itemp[0] == the number of lines in the fn, and
        !           383:  * nlist.itemp[1] == the function startup code, and
        !           384:  * nlist.itemp[max] == the close down shop code.
        !           385:  */
        !           386: 
        !           387: struct nlist
        !           388: {
        !           389:        char    use;
        !           390:        char    type;   /* == LV */
        !           391:        struct item  *itemp;
        !           392:        char    *namep;
        !           393:        int     label;
        !           394: } nlist[NLS];
        !           395: 
        !           396: /*
        !           397:  * This is the structure used to implement the
        !           398:  * APL state indicator.
        !           399:  *
        !           400:  * The structure is allocated dynamically in ex_fun (ai.c),
        !           401:  * but not explicitly.   Ex_fun declares a single, local
        !           402:  * structure (allocated by C, itself), and links it to
        !           403:  * previous instances of the structure.  SI is used for
        !           404:  * two basic things:
        !           405:  *
        !           406:  *     1) error traceback (Including ")SI" stuff).
        !           407:  *     2) Restoration of the global variable environment
        !           408:  *        (or any other, pending environment).
        !           409:  *
        !           410:  * The global variable "gsip" is a pointer to the
        !           411:  * head of a chain of these structures, one for each
        !           412:  * instance of an activated function.  (Gsip == 0) implies
        !           413:  * an empty list, (gsip->sip == 0) implies the end of the list,
        !           414:  * and (gsip->np == 0) implies a state indicator seperator.
        !           415:  * (A new function was evoked with an old one pending.)
        !           416:  *
        !           417:  * Note that "gsip->funlc" is the same as the old global
        !           418:  * variable "funlc", and 
        !           419:  *
        !           420:  *     (gsip && gsip->sip ? gsip->sip->funlc : 0)
        !           421:  *
        !           422:  * is the value of the old global, "ibeam36".
        !           423:  */
        !           424: 
        !           425: struct si {
        !           426:        int     suspended;      /* fn is suspended <=1, pending <= 0 */
        !           427:        struct si *sip;         /* previous fn activation */
        !           428:        struct nlist *np;       /* current fn vital stats. */
        !           429:        int funlc;              /* current fn current line number */
        !           430:        struct item **oldsp;    /* top of operand stack upon fn entry */
        !           431:        char *oldpcp;           /* execution string upon fn entry */
        !           432:        jmp_buf env;            /* for restoration of local
        !           433:                                 * fn activation record */
        !           434: } *gsip;
        !           435: 
        !           436: /*
        !           437:  * exop[i] is the address of the i'th action routine.
        !           438:  * Because of a "symbol table overflow" problem with C,
        !           439:  * the table was moved from a1.c to its own at.c
        !           440:  */
        !           441: 
        !           442: int    (*exop[])();
        !           443: 
        !           444: double floor();
        !           445: double fabs();
        !           446: double ceil();
        !           447: double log();
        !           448: double sin();
        !           449: double cos();
        !           450: double atan();
        !           451: double atan2();
        !           452: double sqrt();
        !           453: double exp();
        !           454: double gamma();
        !           455: double ltod();
        !           456: char *rline();
        !           457: char *alloc();
        !           458: char *compile();
        !           459: struct nlist *nlook();
        !           460: struct item *fetch(), *fetch1(), *fetch2(), *extend();
        !           461: struct item *newdat(), *dupdat();
        !           462: 
        !           463: int    integ;
        !           464: int    signgam;
        !           465: int    column;
        !           466: int    intflg;
        !           467: int    echoflg;
        !           468: int    offexit;                /* if != 0, require ")off" to exit */
        !           469: int    prwsflg;
        !           470: int    ifile;
        !           471: int    wfile;
        !           472: int    debug;
        !           473: int    ttystat[3];
        !           474: long   stime;
        !           475: char   *pcp;   /* global copy of arg to exec */
        !           476: int     rowsz;
        !           477: int    mencflg;
        !           478: int    aftrace;
        !           479: char    *mencptr;
        !           480: int oldlb[MAXLAB];
        !           481: int pt;
        !           482: int syze;
        !           483: int pas1;
        !           484: int ibeam36;
        !           485: int protofile;
        !           486: int lastop;    /* last (current) operator exec'ed */
        !           487: char *scr_file;        /* scratch file name */
        !           488: char *ws_file; /* apl workspace file */
        !           489: 
        !           490: 
        !           491: struct
        !           492: {
        !           493:        char    rank;
        !           494:        char    type;
        !           495:        int     size;
        !           496:        int     dimk;
        !           497:        int     delk;
        !           498:        int     dim[MRANK];
        !           499:        int     del[MRANK];
        !           500:        int     idx[MRANK];
        !           501: } idx;
        !           502: 
        !           503: 
        !           504: /* Following are definitions for buffered I/O.
        !           505:  * To generate a version of APL without buffered I/O,
        !           506:  * leave NBUF undefined.
        !           507:  */
        !           508: 
        !           509: #define        NBUF    4               /* Number of I/O buffers */
        !           510: 
        !           511: 
        !           512: #ifdef NBUF
        !           513: 
        !           514: #ifdef vax
        !           515: #define        BLEN    512             /* Buffered I/O buffer length */
        !           516: #else
        !           517: #define        BLEN    256             /* Buffered I/O buffer length */
        !           518: #endif
        !           519: 
        !           520: struct iobuf {                 /* Buffered I/O buffer structure */
        !           521:        int b_len;              /* Buffer length */
        !           522:        int b_next;             /* Next available character */
        !           523:        int b_fd;               /* Assigned file descriptor */
        !           524:        char b_buf[BLEN];       /* Actual buffer */
        !           525: } *iobuf;
        !           526: 
        !           527: 
        !           528: struct fds {
        !           529:        dev_t   fd_dev;         /* Device major/minor number */
        !           530:        ino_t   fd_ind;         /* File inode number */
        !           531:        int     fd_pipe;        /* (1=pipe, 0=not a pipe) */
        !           532:        int     fd_buf;         /* Number of assigned buffer */
        !           533:        char    fd_lastop;      /* Last operation (0=read, 1=write) */
        !           534:        char    fd_uniq;        /* Unique flag (1=unique, 0=not unique) */
        !           535:        char    fd_dup;         /* Principal fd for dups */
        !           536:        char    fd_open;        /* (0=closed, 1=open) */
        !           537: } files[NFDS];
        !           538: 
        !           539: 
        !           540: #define        READF   readf           /* Buffered read routine */
        !           541: #define        WRITEF  writef          /* Buffered write routine */
        !           542: #define        SEEKF   lseekf          /* Buffered seek routine */
        !           543: #define        OPENF   openf           /* Buffered file open routine */
        !           544: #define        CREATF  creatf          /* Buffered file create routine */
        !           545: #define        DUPF    dupf            /* Buffered file dup routine */
        !           546: #define        CLOSEF  closef          /* Buffered file close routine */
        !           547: #define        FSTATF  fstatf          /* Buffered "fstat" call */
        !           548: #ifndef        VFORK
        !           549: #define        FORKF(x) (bflush(),fork())
        !           550: #else
        !           551: #define        FORKF(x) (bflush(),(x) ? vfork() : fork())
        !           552: #endif
        !           553: 
        !           554: #endif
        !           555: 
        !           556: 
        !           557: #ifndef        NBUF
        !           558: 
        !           559: #define        READF   read            /* Normal read routine */
        !           560: #define        WRITEF  write           /* Normal write routine */
        !           561: #define        SEEKF   lseek           /* Normal seek routine */
        !           562: #define        OPENF   open            /* Normal file open routine */
        !           563: #define        CREATF  creat           /* Normal file create routine */
        !           564: #define        DUPF    dup             /* Normal file dup routine */
        !           565: #define        CLOSEF  close           /* Normal file close routine */
        !           566: #define        FSTATF  fstat           /* Normal "fstat" call */
        !           567: #define        FORKF(x) fork()         /* Normal "fork" call */
        !           568: 
        !           569: #endif
        !           570: 
        !           571: 
        !           572: long SEEKF();                   /* declare SEEKF properly */
        !           573: 
        !           574: #define        setexit() setjmp(gbl_env)       /* "setexit" equivalent */
        !           575: #define        reset() longjmp(gbl_env)        /* "reset" equivalent */
        !           576: #define        alloc(x) malloc(x)              

unix.superglobalmegacorp.com

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