Annotation of researchv10no/cmd/f2c/init.c, revision 1.1.1.1

1.1       root        1: /****************************************************************
                      2: Copyright 1990, 1992, 1993 by AT&T Bell Laboratories and Bellcore.
                      3: 
                      4: Permission to use, copy, modify, and distribute this software
                      5: and its documentation for any purpose and without fee is hereby
                      6: granted, provided that the above copyright notice appear in all
                      7: copies and that both that the copyright notice and this
                      8: permission notice and warranty disclaimer appear in supporting
                      9: documentation, and that the names of AT&T Bell Laboratories or
                     10: Bellcore or any of their entities not be used in advertising or
                     11: publicity pertaining to distribution of the software without
                     12: specific, written prior permission.
                     13: 
                     14: AT&T and Bellcore disclaim all warranties with regard to this
                     15: software, including all implied warranties of merchantability
                     16: and fitness.  In no event shall AT&T or Bellcore be liable for
                     17: any special, indirect or consequential damages or any damages
                     18: whatsoever resulting from loss of use, data or profits, whether
                     19: in an action of contract, negligence or other tortious action,
                     20: arising out of or in connection with the use or performance of
                     21: this software.
                     22: ****************************************************************/
                     23: 
                     24: #include "defs.h"
                     25: #include "output.h"
                     26: #include "iob.h"
                     27: 
                     28: /* State required for the C output */
                     29: char *fl_fmt_string;           /* Float format string */
                     30: char *db_fmt_string;           /* Double format string */
                     31: char *cm_fmt_string;           /* Complex format string */
                     32: char *dcm_fmt_string;          /* Double complex format string */
                     33: 
                     34: chainp new_vars = CHNULL;      /* List of newly created locals in this
                     35:                                   function.  These may have identifiers
                     36:                                   which have underscores and more than VL
                     37:                                   characters */
                     38: chainp used_builtins = CHNULL; /* List of builtins used by this function.
                     39:                                   These are all Addrps with UNAM_EXTERN
                     40:                                   */
                     41: chainp assigned_fmts = CHNULL; /* assigned formats */
                     42: chainp allargs;                        /* union of args in all entry points */
                     43: chainp earlylabs;              /* labels seen before enddcl() */
                     44: char main_alias[52];           /* PROGRAM name, if any is given */
                     45: int tab_size = 4;
                     46: 
                     47: 
                     48: FILEP infile;
                     49: FILEP diagfile;
                     50: 
                     51: FILEP c_file;
                     52: FILEP pass1_file;
                     53: FILEP initfile;
                     54: FILEP blkdfile;
                     55: 
                     56: 
                     57: char token[MAXTOKENLEN];
                     58: int toklen;
                     59: long lineno;                   /* Current line in the input file, NOT the
                     60:                                   Fortran statement label number */
                     61: char *infname;
                     62: int needkwd;
                     63: struct Labelblock *thislabel   = NULL;
                     64: int nerr;
                     65: int nwarn;
                     66: 
                     67: flag saveall;
                     68: flag substars;
                     69: int parstate   = OUTSIDE;
                     70: flag headerdone        = NO;
                     71: int blklevel;
                     72: int doin_setbound;
                     73: int impltype[26];
                     74: ftnint implleng[26];
                     75: int implstg[26];
                     76: 
                     77: int tyint      = TYLONG ;
                     78: int tylogical  = TYLONG;
                     79: int tylog      = TYLOGICAL;
                     80: int typesize[NTYPES] = {
                     81:        1, SZADDR, 1, SZSHORT, SZLONG,
                     82: #ifdef TYQUAD
                     83:                2*SZLONG,
                     84: #endif
                     85:                SZLONG, 2*SZLONG,
                     86:                2*SZLONG, 4*SZLONG, 1, SZSHORT, SZLONG, 1, 1, 0,
                     87:                4*SZLONG + SZADDR,      /* sizeof(cilist) */
                     88:                4*SZLONG + 2*SZADDR,    /* sizeof(icilist) */
                     89:                4*SZLONG + 5*SZADDR,    /* sizeof(olist) */
                     90:                2*SZLONG + SZADDR,      /* sizeof(cllist) */
                     91:                2*SZLONG,               /* sizeof(alist) */
                     92:                11*SZLONG + 15*SZADDR   /* sizeof(inlist) */
                     93:                };
                     94: 
                     95: int typealign[NTYPES] = {
                     96:        1, ALIADDR, 1, ALISHORT, ALILONG,
                     97: #ifdef TYQUAD
                     98:        ALIDOUBLE,
                     99: #endif
                    100:        ALILONG, ALIDOUBLE,
                    101:        ALILONG, ALIDOUBLE, 1, ALISHORT, ALILONG, 1, 1, 1,
                    102:        ALILONG, ALILONG, ALILONG, ALILONG, ALILONG, ALILONG};
                    103: 
                    104: int type_choice[4] = { TYDREAL, TYSHORT, TYLONG,  TYSHORT };
                    105: 
                    106: char *typename[] = {
                    107:        "<<unknown>>",
                    108:        "address",
                    109:        "integer1",
                    110:        "shortint",
                    111:        "integer",
                    112: #ifdef TYQUAD
                    113:        "longint",
                    114: #endif
                    115:        "real",
                    116:        "doublereal",
                    117:        "complex",
                    118:        "doublecomplex",
                    119:        "logical1",
                    120:        "shortlogical",
                    121:        "logical",
                    122:        "char"  /* character */
                    123:        };
                    124: 
                    125: int type_pref[NTYPES] = { 0, 0, 3, 5, 7,
                    126: #ifdef TYQUAD
                    127:                         10,
                    128: #endif
                    129:                                8, 11, 9, 12, 1, 4, 6, 2 };
                    130: 
                    131: char *protorettypes[] = {
                    132:        "?", "??", "integer1", "shortint", "integer",
                    133: #ifdef TYQUAD
                    134:        "longint",
                    135: #endif
                    136:        "real", "doublereal",
                    137:        "C_f", "Z_f", "logical1", "shortlogical", "logical", "H_f", "int"
                    138:        };
                    139: 
                    140: char *casttypes[TYSUBR+1] = {
                    141:        "U_fp", "??bug??", "I1_fp",
                    142:        "J_fp", "I_fp",
                    143: #ifdef TYQUAD
                    144:        "Q_fp",
                    145: #endif
                    146:        "R_fp", "D_fp", "C_fp", "Z_fp",
                    147:        "L1_fp", "L2_fp", "L_fp", "H_fp", "S_fp"
                    148:        };
                    149: char *usedcasts[TYSUBR+1];
                    150: 
                    151: char *dfltarg[] = {
                    152:        0, 0, "(integer1 *)0",
                    153:        "(shortint *)0", "(integer *)0",
                    154: #ifdef TYQUAD
                    155:        "(longint *)0",
                    156: #endif
                    157:        "(real *)0",
                    158:        "(doublereal *)0", "(complex *)0", "(doublecomplex *)0",
                    159:        "(logical1 *)0","(shortlogical *)0)", "(logical *)0", "(char *)0"
                    160:        };
                    161: 
                    162: static char *dflt0proc[] = {
                    163:        0, 0, "(integer1 (*)())0",
                    164:        "(shortint (*)())0", "(integer (*)())0",
                    165: #ifdef TYQUAD
                    166:        "(longint (*)())0",
                    167: #endif
                    168:        "(real (*)())0",
                    169:        "(doublereal (*)())0", "(complex (*)())0", "(doublecomplex (*)())0",
                    170:        "(logical1 (*)())0", "(shortlogical (*)())0",
                    171:        "(logical (*)())0", "(char (*)())0", "(int (*)())0"
                    172:        };
                    173: 
                    174: char *dflt1proc[] = { "(U_fp)0", "(??bug??)0", "(I1_fp)0",
                    175:        "(J_fp)0", "(I_fp)0",
                    176: #ifdef TYQUAD
                    177:        "(Q_fp)0",
                    178: #endif
                    179:        "(R_fp)0", "(D_fp)0", "(C_fp)0", "(Z_fp)0",
                    180:        "(L1_fp)0","(L2_fp)0",
                    181:        "(L_fp)0", "(H_fp)0", "(S_fp)0"
                    182:        };
                    183: 
                    184: char **dfltproc = dflt0proc;
                    185: 
                    186: static char Bug[] = "bug";
                    187: 
                    188: char *ftn_types[] = { "external", "??", "integer*1",
                    189:        "integer*2", "integer",
                    190: #ifdef TYQUAD
                    191:        "integer*8",
                    192: #endif
                    193:        "real",
                    194:        "double precision", "complex", "double complex",
                    195:        "logical*1", "logical*2",
                    196:        "logical", "character", "subroutine",
                    197:        Bug,Bug,Bug,Bug,Bug,Bug,Bug,Bug,Bug, "ftnlen"
                    198:        };
                    199: 
                    200: int init_ac[TYSUBR+1] = { 0,0,0,0,0,0,0,
                    201: #ifdef TYQUAD
                    202:                          0,
                    203: #endif
                    204:                          1, 1, 0, 0, 0, 2};
                    205: 
                    206: int proctype   = TYUNKNOWN;
                    207: char *procname;
                    208: int rtvlabel[NTYPES0];
                    209: Addrp retslot;                 /* Holds automatic variable which was
                    210:                                   allocated the function return value
                    211:                                   */
                    212: Addrp xretslot[NTYPES0];       /* for multiple entry points */
                    213: int cxslot     = -1;
                    214: int chslot     = -1;
                    215: int chlgslot   = -1;
                    216: int procclass  = CLUNKNOWN;
                    217: int nentry;
                    218: int nallargs;
                    219: int nallchargs;
                    220: flag multitype;
                    221: ftnint procleng;
                    222: long lastiolabno;
                    223: int lastlabno;
                    224: int lastvarno;
                    225: int lastargslot;
                    226: int autonum[TYVOID];
                    227: char *av_pfix[TYVOID] = {"??TYUNKNOWN??", "a","i1","s","i",
                    228: #ifdef TYQUAD
                    229:                         "i8",
                    230: #endif
                    231:                        "r","d","q","z","L1","L2","L","ch",
                    232:                         "??TYSUBR??", "??TYERROR??","ci", "ici",
                    233:                         "o", "cl", "al", "ioin" };
                    234: 
                    235: extern int maxctl;
                    236: struct Ctlframe *ctls;
                    237: struct Ctlframe *ctlstack;
                    238: struct Ctlframe *lastctl;
                    239: 
                    240: Namep regnamep[MAXREGVAR];
                    241: int highregvar;
                    242: int nregvar;
                    243: 
                    244: extern int maxext;
                    245: Extsym *extsymtab;
                    246: Extsym *nextext;
                    247: Extsym *lastext;
                    248: 
                    249: extern int maxequiv;
                    250: struct Equivblock *eqvclass;
                    251: 
                    252: extern int maxhash;
                    253: struct Hashentry *hashtab;
                    254: struct Hashentry *lasthash;
                    255: 
                    256: extern int maxstno;            /* Maximum number of statement labels */
                    257: struct Labelblock *labeltab;
                    258: struct Labelblock *labtabend;
                    259: struct Labelblock *highlabtab;
                    260: 
                    261: int maxdim     = MAXDIM;
                    262: struct Rplblock *rpllist       = NULL;
                    263: struct Chain *curdtp   = NULL;
                    264: flag toomanyinit;
                    265: ftnint curdtelt;
                    266: chainp templist[TYVOID];
                    267: chainp holdtemps;
                    268: int dorange    = 0;
                    269: struct Entrypoint *entries     = NULL;
                    270: 
                    271: chainp chains  = NULL;
                    272: 
                    273: flag inioctl;
                    274: int iostmt;
                    275: int nioctl;
                    276: int nequiv     = 0;
                    277: int eqvstart   = 0;
                    278: int nintnames  = 0;
                    279: extern int maxlablist;
                    280: struct Labelblock **labarray;
                    281: 
                    282: struct Literal *litpool;
                    283: int nliterals;
                    284: 
                    285: char dflttype[26];
                    286: char hextoi_tab[Table_size], Letters[Table_size];
                    287: char *ei_first, *ei_next, *ei_last;
                    288: char *wh_first, *wh_next, *wh_last;
                    289: 
                    290: #define ALLOCN(n,x)    (struct x *) ckalloc((n)*sizeof(struct x))
                    291: 
                    292: fileinit()
                    293: {
                    294:        register char *s;
                    295:        register int i, j;
                    296:        extern void fmt_init(), mem_init(), np_init();
                    297: 
                    298:        lastiolabno = 100000;
                    299:        lastlabno = 0;
                    300:        lastvarno = 0;
                    301:        nliterals = 0;
                    302:        nerr = 0;
                    303: 
                    304:        infile = stdin;
                    305: 
                    306:        memset(dflttype, tyreal, 26);
                    307:        memset(dflttype + 'i' - 'a', tyint, 6);
                    308:        memset(hextoi_tab, 16, sizeof(hextoi_tab));
                    309:        for(i = 0, s = "0123456789abcdef"; *s; i++, s++)
                    310:                hextoi(*s) = i;
                    311:        for(i = 10, s = "ABCDEF"; *s; i++, s++)
                    312:                hextoi(*s) = i;
                    313:        for(j = 0, s = "abcdefghijklmnopqrstuvwxyz"; i = *s++; j++)
                    314:                Letters[i] = Letters[i+'A'-'a'] = j;
                    315: 
                    316:        ctls = ALLOCN(maxctl+1, Ctlframe);
                    317:        extsymtab = ALLOCN(maxext, Extsym);
                    318:        eqvclass = ALLOCN(maxequiv, Equivblock);
                    319:        hashtab = ALLOCN(maxhash, Hashentry);
                    320:        labeltab = ALLOCN(maxstno, Labelblock);
                    321:        litpool = ALLOCN(maxliterals, Literal);
                    322:        labarray = (struct Labelblock **)ckalloc(maxlablist*
                    323:                                        sizeof(struct Labelblock *));
                    324:        fmt_init();
                    325:        mem_init();
                    326:        np_init();
                    327: 
                    328:        ctlstack = ctls++;
                    329:        lastctl = ctls + maxctl;
                    330:        nextext = extsymtab;
                    331:        lastext = extsymtab + maxext;
                    332:        lasthash = hashtab + maxhash;
                    333:        labtabend = labeltab + maxstno;
                    334:        highlabtab = labeltab;
                    335:        main_alias[0] = '\0';
                    336:        if (forcedouble)
                    337:                dfltproc[TYREAL] = dfltproc[TYDREAL];
                    338: 
                    339: /* Initialize the routines for providing C output */
                    340: 
                    341:        out_init ();
                    342: }
                    343: 
                    344: hashclear()    /* clear hash table */
                    345: {
                    346:        register struct Hashentry *hp;
                    347:        register Namep p;
                    348:        register struct Dimblock *q;
                    349:        register int i;
                    350: 
                    351:        for(hp = hashtab ; hp < lasthash ; ++hp)
                    352:                if(p = hp->varp)
                    353:                {
                    354:                        frexpr(p->vleng);
                    355:                        if(q = p->vdim)
                    356:                        {
                    357:                                for(i = 0 ; i < q->ndim ; ++i)
                    358:                                {
                    359:                                        frexpr(q->dims[i].dimsize);
                    360:                                        frexpr(q->dims[i].dimexpr);
                    361:                                }
                    362:                                frexpr(q->nelt);
                    363:                                frexpr(q->baseoffset);
                    364:                                frexpr(q->basexpr);
                    365:                                free( (charptr) q);
                    366:                        }
                    367:                        if(p->vclass == CLNAMELIST)
                    368:                                frchain( &(p->varxptr.namelist) );
                    369:                        free( (charptr) p);
                    370:                        hp->varp = NULL;
                    371:                }
                    372:        }
                    373: 
                    374: procinit()
                    375: {
                    376:        register struct Labelblock *lp;
                    377:        struct Chain *cp;
                    378:        int i;
                    379:        struct memblock;
                    380:        extern struct memblock *curmemblock, *firstmemblock;
                    381:        extern char *mem_first, *mem_next, *mem_last, *mem0_last;
                    382:        extern void frexchain();
                    383: 
                    384:        curmemblock = firstmemblock;
                    385:        mem_next = mem_first;
                    386:        mem_last = mem0_last;
                    387:        ei_next = ei_first = ei_last = 0;
                    388:        wh_next = wh_first = wh_last = 0;
                    389:        iob_list = 0;
                    390:        for(i = 0; i < 9; i++)
                    391:                io_structs[i] = 0;
                    392: 
                    393:        parstate = OUTSIDE;
                    394:        headerdone = NO;
                    395:        blklevel = 1;
                    396:        saveall = NO;
                    397:        substars = NO;
                    398:        nwarn = 0;
                    399:        thislabel = NULL;
                    400:        needkwd = 0;
                    401: 
                    402:        proctype = TYUNKNOWN;
                    403:        procname = "MAIN_";
                    404:        procclass = CLUNKNOWN;
                    405:        nentry = 0;
                    406:        nallargs = nallchargs = 0;
                    407:        multitype = NO;
                    408:        retslot = NULL;
                    409:        for(i = 0; i < NTYPES0; i++) {
                    410:                frexpr((expptr)xretslot[i]);
                    411:                xretslot[i] = 0;
                    412:                }
                    413:        cxslot = -1;
                    414:        chslot = -1;
                    415:        chlgslot = -1;
                    416:        procleng = 0;
                    417:        blklevel = 1;
                    418:        lastargslot = 0;
                    419: 
                    420:        for(lp = labeltab ; lp < labtabend ; ++lp)
                    421:                lp->stateno = 0;
                    422: 
                    423:        hashclear();
                    424: 
                    425: /* Clear the list of newly generated identifiers from the previous
                    426:    function */
                    427: 
                    428:        frexchain(&new_vars);
                    429:        frexchain(&used_builtins);
                    430:        frchain(&assigned_fmts);
                    431:        frchain(&allargs);
                    432:        frchain(&earlylabs);
                    433: 
                    434:        nintnames = 0;
                    435:        highlabtab = labeltab;
                    436: 
                    437:        ctlstack = ctls - 1;
                    438:        for(i = TYADDR; i < TYVOID; i++) {
                    439:                for(cp = templist[i]; cp ; cp = cp->nextp)
                    440:                        free( (charptr) (cp->datap) );
                    441:                frchain(templist + i);
                    442:                autonum[i] = 0;
                    443:                }
                    444:        holdtemps = NULL;
                    445:        dorange = 0;
                    446:        nregvar = 0;
                    447:        highregvar = 0;
                    448:        entries = NULL;
                    449:        rpllist = NULL;
                    450:        inioctl = NO;
                    451:        eqvstart += nequiv;
                    452:        nequiv = 0;
                    453:        dcomplex_seen = 0;
                    454: 
                    455:        for(i = 0 ; i<NTYPES0 ; ++i)
                    456:                rtvlabel[i] = 0;
                    457: 
                    458:        if(undeftype)
                    459:                setimpl(TYUNKNOWN, (ftnint) 0, 'a', 'z');
                    460:        else
                    461:        {
                    462:                setimpl(tyreal, (ftnint) 0, 'a', 'z');
                    463:                setimpl(tyint,  (ftnint) 0, 'i', 'n');
                    464:        }
                    465:        setimpl(-STGBSS, (ftnint) 0, 'a', 'z'); /* set class */
                    466:        setlog();
                    467: }
                    468: 
                    469: 
                    470: 
                    471: 
                    472: setimpl(type, length, c1, c2)
                    473: int type;
                    474: ftnint length;
                    475: int c1, c2;
                    476: {
                    477:        int i;
                    478:        char buff[100];
                    479: 
                    480:        if(c1==0 || c2==0)
                    481:                return;
                    482: 
                    483:        if(c1 > c2) {
                    484:                sprintf(buff, "characters out of order in implicit:%c-%c", c1, c2);
                    485:                err(buff);
                    486:                }
                    487:        else {
                    488:                c1 = letter(c1);
                    489:                c2 = letter(c2);
                    490:                if(type < 0)
                    491:                        for(i = c1 ; i<=c2 ; ++i)
                    492:                                implstg[i] = - type;
                    493:                else {
                    494:                        type = lengtype(type, length);
                    495:                        if(type == TYCHAR) {
                    496:                                if (length < 0) {
                    497:                                        err("length (*) in implicit");
                    498:                                        length = 1;
                    499:                                        }
                    500:                                }
                    501:                        else if (type != TYLONG)
                    502:                                length = 0;
                    503:                        for(i = c1 ; i<=c2 ; ++i) {
                    504:                                impltype[i] = type;
                    505:                                implleng[i] = length;
                    506:                                }
                    507:                        }
                    508:                }
                    509:        }

unix.superglobalmegacorp.com

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