Annotation of researchv10no/cmd/f2c/names.c, revision 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 "names.h"
        !            27: #include "iob.h"
        !            28: 
        !            29: 
        !            30: /* Names generated by the translator are guaranteed to be unique from the
        !            31:    Fortan names because Fortran does not allow underscores in identifiers,
        !            32:    and all of the system generated names do have underscores.  The various
        !            33:    naming conventions are outlined below:
        !            34: 
        !            35:        FORMAT          APPLICATION
        !            36:    ----------------------------------------------------------------------
        !            37:        io_#            temporaries generated by IO calls; these will
        !            38:                        contain the device number (e.g. 5, 6, 0)
        !            39:        ret_val         function return value, required for complex and
        !            40:                        character functions.
        !            41:        ret_val_len     length of the return value in character functions
        !            42: 
        !            43:        ssss_len        length of character argument "ssss"
        !            44: 
        !            45:        c_#             member of the literal pool, where # is an
        !            46:                        arbitrary label assigned by the system
        !            47:        cs_#            short integer constant in the literal pool
        !            48:        t_#             expression temporary, # is the depth of arguments
        !            49:                        on the stack.
        !            50:        L#              label "#", given by user in the Fortran program.
        !            51:                        This is unique because Fortran labels are numeric
        !            52:        pad_#           label on an init field required for alignment
        !            53:        xxx_init        label on a common block union, if a block data
        !            54:                        requires a separate declaration
        !            55: */
        !            56: 
        !            57: /* generate variable references */
        !            58: 
        !            59: char *c_type_decl (type, is_extern)
        !            60: int type, is_extern;
        !            61: {
        !            62:     static char buff[100];
        !            63: 
        !            64:     switch (type) {
        !            65:        case TYREAL:    if (!is_extern || !forcedouble)
        !            66:                                { strcpy (buff, "real");break; }
        !            67:        case TYDREAL:   strcpy (buff, "doublereal");    break;
        !            68:        case TYCOMPLEX: if (is_extern)
        !            69:                            strcpy (buff, "/* Complex */ VOID");
        !            70:                        else
        !            71:                            strcpy (buff, "complex");
        !            72:                        break;
        !            73:        case TYDCOMPLEX:if (is_extern)
        !            74:                            strcpy (buff, "/* Double Complex */ VOID");
        !            75:                        else
        !            76:                            strcpy (buff, "doublecomplex");
        !            77:                        break;
        !            78:        case TYADDR:
        !            79:        case TYINT1:
        !            80:        case TYSHORT:
        !            81:        case TYLONG:
        !            82: #ifdef TYQUAD
        !            83:        case TYQUAD:
        !            84: #endif
        !            85:        case TYLOGICAL1:
        !            86:        case TYLOGICAL2:
        !            87:        case TYLOGICAL: strcpy(buff, typename[type]);
        !            88:                        break;
        !            89:        case TYCHAR:    if (is_extern)
        !            90:                            strcpy (buff, "/* Character */ VOID");
        !            91:                        else
        !            92:                            strcpy (buff, "char");
        !            93:                        break;
        !            94: 
        !            95:         case TYUNKNOWN:        strcpy (buff, "UNKNOWN");
        !            96: 
        !            97: /* If a procedure's type is unknown, assume it's a subroutine */
        !            98: 
        !            99:                        if (!is_extern)
        !           100:                            break;
        !           101: 
        !           102: /* Subroutines must return an INT, because they might return a label
        !           103:    value.  Even if one doesn't, the caller will EXPECT it to. */
        !           104: 
        !           105:        case TYSUBR:    strcpy (buff, "/* Subroutine */ int");
        !           106:                                                        break;
        !           107:        case TYERROR:   strcpy (buff, "ERROR");         break;
        !           108:        case TYVOID:    strcpy (buff, "void");          break;
        !           109:        case TYCILIST:  strcpy (buff, "cilist");        break;
        !           110:        case TYICILIST: strcpy (buff, "icilist");       break;
        !           111:        case TYOLIST:   strcpy (buff, "olist");         break;
        !           112:        case TYCLLIST:  strcpy (buff, "cllist");        break;
        !           113:        case TYALIST:   strcpy (buff, "alist");         break;
        !           114:        case TYINLIST:  strcpy (buff, "inlist");        break;
        !           115:        case TYFTNLEN:  strcpy (buff, "ftnlen");        break;
        !           116:        default:        sprintf (buff, "BAD DECL '%d'", type);
        !           117:                                                        break;
        !           118:     } /* switch */
        !           119: 
        !           120:     return buff;
        !           121: } /* c_type_decl */
        !           122: 
        !           123: 
        !           124: char *new_func_length()
        !           125: { return "ret_val_len"; }
        !           126: 
        !           127: char *new_arg_length(arg)
        !           128:  Namep arg;
        !           129: {
        !           130:        static char buf[64];
        !           131:        sprintf (buf, "%s_len", arg->fvarname);
        !           132: 
        !           133:        return buf;
        !           134: } /* new_arg_length */
        !           135: 
        !           136: 
        !           137: /* declare_new_addr -- Add a new local variable to the function, given a
        !           138:    pointer to an Addrblock structure (which must have the uname_tag set)
        !           139:    This list of idents will be printed in reverse (i.e., chronological)
        !           140:    order */
        !           141: 
        !           142:  void
        !           143: declare_new_addr (addrp)
        !           144: struct Addrblock *addrp;
        !           145: {
        !           146:     extern chainp new_vars;
        !           147: 
        !           148:     new_vars = mkchain((char *)cpexpr((expptr)addrp), new_vars);
        !           149: } /* declare_new_addr */
        !           150: 
        !           151: 
        !           152: wr_nv_ident_help (outfile, addrp)
        !           153: FILE *outfile;
        !           154: struct Addrblock *addrp;
        !           155: {
        !           156:     int eltcount = 0;
        !           157: 
        !           158:     if (addrp == (struct Addrblock *) NULL)
        !           159:        return;
        !           160: 
        !           161:     if (addrp -> isarray) {
        !           162:        frexpr (addrp -> memoffset);
        !           163:        addrp -> memoffset = ICON(0);
        !           164:        eltcount = addrp -> ntempelt;
        !           165:        addrp -> ntempelt = 0;
        !           166:        addrp -> isarray = 0;
        !           167:     } /* if */
        !           168:     out_addr (outfile, addrp);
        !           169:     if (eltcount)
        !           170:        nice_printf (outfile, "[%d]", eltcount);
        !           171: } /* wr_nv_ident_help */
        !           172: 
        !           173: int nv_type_help (addrp)
        !           174: struct Addrblock *addrp;
        !           175: {
        !           176:     if (addrp == (struct Addrblock *) NULL)
        !           177:        return -1;
        !           178: 
        !           179:     return addrp -> vtype;
        !           180: } /* nv_type_help */
        !           181: 
        !           182: 
        !           183: /* lit_name -- returns a unique identifier for the given literal.  Make
        !           184:    the label useful, when possible.  For example:
        !           185: 
        !           186:        1 -> c_1                (constant 1)
        !           187:        2 -> c_2                (constant 2)
        !           188:        1000 -> c_1000          (constant 1000)
        !           189:        1000000 -> c_b<memno>   (big constant number)
        !           190:        1.2 -> c_1_2            (constant 1.2)
        !           191:        1.234345 -> c_b<memno>  (big constant number)
        !           192:        -1 -> c_n1              (constant -1)
        !           193:        -1.0 -> c_n1_0          (constant -1.0)
        !           194:        .true. -> c_true        (constant true)
        !           195:        .false. -> c_false      (constant false)
        !           196:        default -> c_b<memno>   (default label)
        !           197: */
        !           198: 
        !           199: char *lit_name (litp)
        !           200: struct Literal *litp;
        !           201: {
        !           202:        static char buf[CONST_IDENT_MAX];
        !           203:        ftnint val;
        !           204: 
        !           205:        if (litp == (struct Literal *) NULL)
        !           206:                return NULL;
        !           207: 
        !           208:        switch (litp -> littype) {
        !           209:        case TYINT1:
        !           210:                val = litp -> litval.litival;
        !           211:                if (val >= 256 || val < -255)
        !           212:                        sprintf (buf, "c_b%d", litp -> litnum);
        !           213:                else if (val < 0)
        !           214:                        sprintf (buf, "ci1_n%ld", -val);
        !           215:                else
        !           216:                        sprintf(buf, "ci1__%ld", val);
        !           217:         case TYSHORT:
        !           218:                val = litp -> litval.litival;
        !           219:                if (val >= 32768 || val <= -32769)
        !           220:                        sprintf (buf, "c_b%d", litp -> litnum);
        !           221:                else if (val < 0)
        !           222:                        sprintf (buf, "cs_n%ld", -val);
        !           223:                else
        !           224:                        sprintf (buf, "cs__%ld", val);
        !           225:                break;
        !           226:        case TYLONG:
        !           227: #ifdef TYQUAD
        !           228:        case TYQUAD:
        !           229: #endif
        !           230:                val = litp -> litval.litival;
        !           231:                if (val >= 100000 || val <= -10000)
        !           232:                        sprintf (buf, "c_b%d", litp -> litnum);
        !           233:                else if (val < 0)
        !           234:                        sprintf (buf, "c_n%ld", -val);
        !           235:                else
        !           236:                        sprintf (buf, "c__%ld", val);
        !           237:                break;
        !           238:        case TYLOGICAL1:
        !           239:        case TYLOGICAL2:
        !           240:        case TYLOGICAL:
        !           241:                sprintf (buf, "c_%s", (litp -> litval.litival
        !           242:                                        ? "true" : "false"));
        !           243:                break;
        !           244:        case TYREAL:
        !           245:        case TYDREAL:
        !           246:                /* Given a limit of 6 or 8 character on external names, */
        !           247:                /* few f.p. values can be meaningfully encoded in the   */
        !           248:                /* constant name.  Just going with the default cb_#     */
        !           249:                /* seems to be the best course for floating-point       */
        !           250:                /* constants.   */
        !           251:        case TYCHAR:
        !           252:                /* Shouldn't be any of these */
        !           253:        case TYADDR:
        !           254:        case TYCOMPLEX:
        !           255:        case TYDCOMPLEX:
        !           256:        case TYSUBR:
        !           257:        default:
        !           258:                sprintf (buf, "c_b%d", litp -> litnum);
        !           259:     } /* switch */
        !           260:     return buf;
        !           261: } /* lit_name */
        !           262: 
        !           263: 
        !           264: 
        !           265:  char *
        !           266: comm_union_name(count)
        !           267:  int count;
        !           268: {
        !           269:        static char buf[12];
        !           270: 
        !           271:        sprintf(buf, "%d", count);
        !           272:        return buf;
        !           273:        }
        !           274: 
        !           275: 
        !           276: 
        !           277: 
        !           278: /* wr_globals -- after every function has been translated, we need to
        !           279:    output the global declarations, such as the static table of constant
        !           280:    values */
        !           281: 
        !           282: wr_globals (outfile)
        !           283: FILE *outfile;
        !           284: {
        !           285:     struct Literal *litp, *lastlit;
        !           286:     extern int hsize;
        !           287:     extern char *lit_name();
        !           288:     char *litname;
        !           289:     int did_one, t;
        !           290:     struct Constblock cb;
        !           291:     ftnint x, y;
        !           292: 
        !           293:     if (nliterals == 0)
        !           294:        return;
        !           295: 
        !           296:     lastlit = litpool + nliterals;
        !           297:     did_one = 0;
        !           298:     for (litp = litpool; litp < lastlit; litp++) {
        !           299:        if (!litp->lituse)
        !           300:                continue;
        !           301:        litname = lit_name(litp);
        !           302:        if (!did_one) {
        !           303:                margin_printf(outfile, "/* Table of constant values */\n\n");
        !           304:                did_one = 1;
        !           305:                }
        !           306:        cb.vtype = litp->littype;
        !           307:        if (litp->littype == TYCHAR) {
        !           308:                x = litp->litval.litival2[0] + litp->litval.litival2[1];
        !           309:                if (y = x % hsize)
        !           310:                        x += y = hsize - y;
        !           311:                nice_printf(outfile,
        !           312:                        "static struct { %s fill; char val[%ld+1];", halign, x);
        !           313:                nice_printf(outfile, " char fill2[%ld];", hsize - 1);
        !           314:                nice_printf(outfile, " } %s_st = { 0,", litname);
        !           315:                cb.vleng = ICON(litp->litval.litival2[0]);
        !           316:                cb.Const.ccp = litp->cds[0];
        !           317:                cb.Const.ccp1.blanks = litp->litval.litival2[1] + y;
        !           318:                cb.vtype = TYCHAR;
        !           319:                out_const(outfile, &cb);
        !           320:                frexpr(cb.vleng);
        !           321:                nice_printf(outfile, " };\n");
        !           322:                nice_printf(outfile, "#define %s %s_st.val\n", litname, litname);
        !           323:                continue;
        !           324:                }
        !           325:        nice_printf(outfile, "static %s %s = ",
        !           326:                c_type_decl(litp->littype,0), litname);
        !           327: 
        !           328:        t = litp->littype;
        !           329:        if (ONEOF(t, MSKREAL|MSKCOMPLEX)) {
        !           330:                cb.vstg = 1;
        !           331:                cb.Const.cds[0] = litp->cds[0];
        !           332:                cb.Const.cds[1] = litp->cds[1];
        !           333:                }
        !           334:        else {
        !           335:                memcpy((char *)&cb.Const, (char *)&litp->litval,
        !           336:                        sizeof(cb.Const));
        !           337:                cb.vstg = 0;
        !           338:                }
        !           339:        out_const(outfile, &cb);
        !           340: 
        !           341:        nice_printf (outfile, ";\n");
        !           342:     } /* for */
        !           343:     if (did_one)
        !           344:        nice_printf (outfile, "\n");
        !           345: } /* wr_globals */
        !           346: 
        !           347:  ftnint
        !           348: commlen(vl)
        !           349:  register chainp vl;
        !           350: {
        !           351:        ftnint size;
        !           352:        int type;
        !           353:        struct Dimblock *t;
        !           354:        Namep v;
        !           355: 
        !           356:        while(vl->nextp)
        !           357:                vl = vl->nextp;
        !           358:        v = (Namep)vl->datap;
        !           359:        type = v->vtype;
        !           360:        if (type == TYCHAR)
        !           361:                size = v->vleng->constblock.Const.ci;
        !           362:        else
        !           363:                size = typesize[type];
        !           364:        if ((t = v->vdim) && ISCONST(t->nelt))
        !           365:                size *= t->nelt->constblock.Const.ci;
        !           366:        return size + v->voffset;
        !           367:        }
        !           368: 
        !           369:  static void   /* Pad common block if an EQUIVALENCE extended it. */
        !           370: pad_common(c)
        !           371:  Extsym *c;
        !           372: {
        !           373:        register chainp cvl;
        !           374:        register Namep v;
        !           375:        long L = c->maxleng;
        !           376:        int type;
        !           377:        struct Dimblock *t;
        !           378:        int szshort = typesize[TYSHORT];
        !           379: 
        !           380:        for(cvl = c->allextp; cvl; cvl = cvl->nextp)
        !           381:                if (commlen((chainp)cvl->datap) >= L)
        !           382:                        return;
        !           383:        v = ALLOC(Nameblock);
        !           384:        v->vtype = type = L % szshort ? TYCHAR
        !           385:                                      : type_choice[L/szshort % 4];
        !           386:        v->vstg = STGCOMMON;
        !           387:        v->vclass = CLVAR;
        !           388:        v->tag = TNAME;
        !           389:        v->vdim = t = ALLOC(Dimblock);
        !           390:        t->ndim = 1;
        !           391:        t->dims[0].dimsize = ICON(L / typesize[type]);
        !           392:        v->fvarname = v->cvarname = "eqv_pad";
        !           393:        if (type == TYCHAR)
        !           394:                v->vleng = ICON(1);
        !           395:        c->allextp = mkchain((char *)mkchain((char *)v, CHNULL), c->allextp);
        !           396:        }
        !           397: 
        !           398: 
        !           399: /* wr_common_decls -- outputs the common declarations in one of three
        !           400:    formats.  If all references to a common block look the same (field
        !           401:    names and types agree), only one actual declaration will appear.
        !           402:    Otherwise, the same block will require many structs.  If there is no
        !           403:    block data, these structs will be union'ed together (so the linker
        !           404:    knows the size of the largest one).  If there IS a block data, only
        !           405:    that version will be associated with the variable, others will only be
        !           406:    defined as types, so the pointer can be cast to it.  e.g.
        !           407: 
        !           408:        FORTRAN                         C
        !           409: ----------------------------------------------------------------------
        !           410:        common /com1/ a, b, c           struct { real a, b, c; } com1_;
        !           411: 
        !           412:        common /com1/ a, b, c           union {
        !           413:        common /com1/ i, j, k               struct { real a, b, c; } _1;
        !           414:                                            struct { integer i, j, k; } _2;
        !           415:                                        } com1_;
        !           416: 
        !           417:        common /com1/ a, b, c           struct com1_1_ { real a, b, c; };
        !           418:        block data                      struct { integer i, j, k; } com1_ =
        !           419:        common /com1/ i, j, k             { 1, 2, 3 };
        !           420:        data i/1/, j/2/, k/3/
        !           421: 
        !           422: 
        !           423:    All of these versions will be followed by #defines, since the code in
        !           424:    the function bodies can't know ahead of time which of these options
        !           425:    will be taken */
        !           426: 
        !           427: /* Macros for deciding the output type */
        !           428: 
        !           429: #define ONE_STRUCT 1
        !           430: #define UNION_STRUCT 2
        !           431: #define INIT_STRUCT 3
        !           432: 
        !           433: wr_common_decls(outfile)
        !           434:  FILE *outfile;
        !           435: {
        !           436:     Extsym *ext;
        !           437:     extern int extcomm;
        !           438:     static char *Extern[4] = {"", "Extern ", "extern "};
        !           439:     char *E, *E0 = Extern[extcomm];
        !           440:     int did_one = 0;
        !           441: 
        !           442:     for (ext = extsymtab; ext < nextext; ext++) {
        !           443:        if (ext -> extstg == STGCOMMON && ext->allextp) {
        !           444:            chainp comm;
        !           445:            int count = 1;
        !           446:            int which;                  /* which display to use;
        !           447:                                           ONE_STRUCT, UNION or INIT */
        !           448: 
        !           449:            if (!did_one)
        !           450:                nice_printf (outfile, "/* Common Block Declarations */\n\n");
        !           451: 
        !           452:            pad_common(ext);
        !           453: 
        !           454: /* Construct the proper, condensed list of structs; eliminate duplicates
        !           455:    from the initial list   ext -> allextp   */
        !           456: 
        !           457:            comm = ext->allextp = revchain(ext->allextp);
        !           458: 
        !           459:            if (ext -> extinit)
        !           460:                which = INIT_STRUCT;
        !           461:            else if (comm->nextp) {
        !           462:                which = UNION_STRUCT;
        !           463:                nice_printf (outfile, "%sunion {\n", E0);
        !           464:                next_tab (outfile);
        !           465:                E = "";
        !           466:                }
        !           467:            else {
        !           468:                which = ONE_STRUCT;
        !           469:                E = E0;
        !           470:                }
        !           471: 
        !           472:            for (; comm; comm = comm -> nextp, count++) {
        !           473: 
        !           474:                if (which == INIT_STRUCT)
        !           475:                    nice_printf (outfile, "struct %s%d_ {\n",
        !           476:                            ext->cextname, count);
        !           477:                else
        !           478:                    nice_printf (outfile, "%sstruct {\n", E);
        !           479: 
        !           480:                next_tab (c_file);
        !           481: 
        !           482:                wr_struct (outfile, (chainp) comm -> datap);
        !           483: 
        !           484:                prev_tab (c_file);
        !           485:                if (which == UNION_STRUCT)
        !           486:                    nice_printf (outfile, "} _%d;\n", count);
        !           487:                else if (which == ONE_STRUCT)
        !           488:                    nice_printf (outfile, "} %s;\n", ext->cextname);
        !           489:                else
        !           490:                    nice_printf (outfile, "};\n");
        !           491:            } /* for */
        !           492: 
        !           493:            if (which == UNION_STRUCT) {
        !           494:                prev_tab (c_file);
        !           495:                nice_printf (outfile, "} %s;\n", ext->cextname);
        !           496:            } /* if */
        !           497:            did_one = 1;
        !           498:            nice_printf (outfile, "\n");
        !           499: 
        !           500:            for (count = 1, comm = ext -> allextp; comm;
        !           501:                    comm = comm -> nextp, count++) {
        !           502:                def_start(outfile, ext->cextname,
        !           503:                        comm_union_name(count), "");
        !           504:                switch (which) {
        !           505:                    case ONE_STRUCT:
        !           506:                        extern_out (outfile, ext);
        !           507:                        break;
        !           508:                    case UNION_STRUCT:
        !           509:                        nice_printf (outfile, "(");
        !           510:                        extern_out (outfile, ext);
        !           511:                        nice_printf(outfile, "._%d)", count);
        !           512:                        break;
        !           513:                    case INIT_STRUCT:
        !           514:                        nice_printf (outfile, "(*(struct ");
        !           515:                        extern_out (outfile, ext);
        !           516:                        nice_printf (outfile, "%d_ *) &", count);
        !           517:                        extern_out (outfile, ext);
        !           518:                        nice_printf (outfile, ")");
        !           519:                        break;
        !           520:                } /* switch */
        !           521:                nice_printf (outfile, "\n");
        !           522:            } /* for count = 1, comm = ext -> allextp */
        !           523:            nice_printf (outfile, "\n");
        !           524:        } /* if ext -> extstg == STGCOMMON */
        !           525:     } /* for ext = extsymtab */
        !           526: } /* wr_common_decls */
        !           527: 
        !           528: 
        !           529: wr_struct (outfile, var_list)
        !           530: FILE *outfile;
        !           531: chainp var_list;
        !           532: {
        !           533:     int last_type = -1;
        !           534:     int did_one = 0;
        !           535:     chainp this_var;
        !           536: 
        !           537:     for (this_var = var_list; this_var; this_var = this_var -> nextp) {
        !           538:        Namep var = (Namep) this_var -> datap;
        !           539:        int type;
        !           540:        char *comment = NULL, *wr_ardecls ();
        !           541: 
        !           542:        if (var == (Namep) NULL)
        !           543:            err ("wr_struct:  null variable");
        !           544:        else if (var -> tag != TNAME)
        !           545:            erri ("wr_struct:  bad tag on variable '%d'",
        !           546:                    var -> tag);
        !           547: 
        !           548:        type = var -> vtype;
        !           549: 
        !           550:        if (last_type == type && did_one)
        !           551:            nice_printf (outfile, ", ");
        !           552:        else {
        !           553:            if (did_one)
        !           554:                nice_printf (outfile, ";\n");
        !           555:            nice_printf (outfile, "%s ",
        !           556:                    c_type_decl (type, var -> vclass == CLPROC));
        !           557:        } /* else */
        !           558: 
        !           559: /* Character type is really a string type.  Put out a '*' for parameters
        !           560:    with unknown length and functions returning character */
        !           561: 
        !           562:        if (var -> vtype == TYCHAR && (!ISICON ((var -> vleng))
        !           563:                || var -> vclass == CLPROC))
        !           564:            nice_printf (outfile, "*");
        !           565: 
        !           566:        var -> vstg = STGAUTO;
        !           567:        out_name (outfile, var);
        !           568:        if (var -> vclass == CLPROC)
        !           569:            nice_printf (outfile, "()");
        !           570:        else if (var -> vdim)
        !           571:            comment = wr_ardecls(outfile, var->vdim,
        !           572:                                var->vtype == TYCHAR && ISICON(var->vleng)
        !           573:                                ? var->vleng->constblock.Const.ci : 1L);
        !           574:        else if (var -> vtype == TYCHAR && var -> vclass != CLPROC &&
        !           575:            ISICON ((var -> vleng)))
        !           576:            nice_printf (outfile, "[%ld]",
        !           577:                    var -> vleng -> constblock.Const.ci);
        !           578: 
        !           579:        if (comment)
        !           580:            nice_printf (outfile, "%s", comment);
        !           581:        did_one = 1;
        !           582:        last_type = type;
        !           583:     } /* for this_var */
        !           584: 
        !           585:     if (did_one)
        !           586:        nice_printf (outfile, ";\n");
        !           587: } /* wr_struct */
        !           588: 
        !           589: 
        !           590: char *user_label(stateno)
        !           591: ftnint stateno;
        !           592: {
        !           593:        static char buf[USER_LABEL_MAX + 1];
        !           594:        static char *Lfmt[2] = { "L_%ld", "L%ld" };
        !           595: 
        !           596:        if (stateno >= 0)
        !           597:                sprintf(buf, Lfmt[shiftcase], stateno);
        !           598:        else
        !           599:                sprintf(buf, "L_%s", extsymtab[-1-stateno].fextname);
        !           600:        return buf;
        !           601: } /* user_label */
        !           602: 
        !           603: 
        !           604: char *temp_name (starter, num, storage)
        !           605: char *starter;
        !           606: int num;
        !           607: char *storage;
        !           608: {
        !           609:     static char buf[IDENT_LEN];
        !           610:     char *pointer = buf;
        !           611:     char *prefix = "t";
        !           612: 
        !           613:     if (storage)
        !           614:        pointer = storage;
        !           615: 
        !           616:     if (starter && *starter)
        !           617:        prefix = starter;
        !           618: 
        !           619:     sprintf (pointer, "%s__%d", prefix, num);
        !           620:     return pointer;
        !           621: } /* temp_name */
        !           622: 
        !           623: 
        !           624: char *equiv_name (memno, store)
        !           625: int memno;
        !           626: char *store;
        !           627: {
        !           628:     static char buf[IDENT_LEN];
        !           629:     char *pointer = buf;
        !           630: 
        !           631:     if (store)
        !           632:        pointer = store;
        !           633: 
        !           634:     sprintf (pointer, "%s_%d", EQUIV_INIT_NAME, memno);
        !           635:     return pointer;
        !           636: } /* equiv_name */
        !           637: 
        !           638:  void
        !           639: def_commons(of)
        !           640:  FILE *of;
        !           641: {
        !           642:        Extsym *ext;
        !           643:        int c, onefile, Union;
        !           644:        char buf[64];
        !           645:        chainp comm;
        !           646:        extern int ext1comm;
        !           647:        FILE *c_filesave = c_file;
        !           648: 
        !           649:        if (ext1comm == 1) {
        !           650:                onefile = 1;
        !           651:                c_file = of;
        !           652:                fprintf(of, "/*>>>'/dev/null'<<<*/\n\
        !           653: #ifdef Define_COMMONs\n\
        !           654: /*<<</dev/null>>>*/\n");
        !           655:                }
        !           656:        else
        !           657:                onefile = 0;
        !           658:        for(ext = extsymtab; ext < nextext; ext++)
        !           659:                if (ext->extstg == STGCOMMON
        !           660:                && !ext->extinit && (comm = ext->allextp)) {
        !           661:                        sprintf(buf, "%scom.c", ext->cextname);
        !           662:                        if (onefile)
        !           663:                                fprintf(of, "/*>>>'%s'<<<*/\n",
        !           664:                                        buf);
        !           665:                        else {
        !           666:                                c_file = of = fopen(buf,textwrite);
        !           667:                                if (!of)
        !           668:                                        fatalstr("can't open %s", buf);
        !           669:                                }
        !           670:                        fprintf(of, "#include \"f2c.h\"\n");
        !           671:                        if (comm->nextp) {
        !           672:                                Union = 1;
        !           673:                                nice_printf(of, "union {\n");
        !           674:                                next_tab(of);
        !           675:                                }
        !           676:                        else
        !           677:                                Union = 0;
        !           678:                        for(c = 1; comm; comm = comm->nextp) {
        !           679:                                nice_printf(of, "struct {\n");
        !           680:                                next_tab(of);
        !           681:                                wr_struct(of, (chainp)comm->datap);
        !           682:                                prev_tab(of);
        !           683:                                if (Union)
        !           684:                                        nice_printf(of, "} _%d;\n", c++);
        !           685:                                }
        !           686:                        if (Union)
        !           687:                                prev_tab(of);
        !           688:                        nice_printf(of, "} %s;\n", ext->cextname);
        !           689:                        if (onefile)
        !           690:                                fprintf(of, "/*<<<%s>>>*/\n", buf);
        !           691:                        else
        !           692:                                fclose(of);
        !           693:                        }
        !           694:        if (onefile)
        !           695:                fprintf(of, "/*>>>'/dev/null'<<<*/\n#endif\n\
        !           696: /*<<</dev/null>>>*/\n");
        !           697:        c_file = c_filesave;
        !           698:        }
        !           699: 
        !           700: /* C Language keywords.  Needed to filter unwanted fortran identifiers like
        !           701:  * "int", etc.  Source:  Kernighan & Ritchie, eds. 1 and 2; Stroustrup.
        !           702:  * Also includes C++ keywords and types used for I/O in f2c.h .
        !           703:  * These keywords must be in alphabetical order (as defined by strcmp()).
        !           704:  */
        !           705: 
        !           706: char *c_keywords[] = {
        !           707:        "Long", "Multitype", "Namelist", "Vardesc",
        !           708:        "abs", "acos", "address", "alist", "asin", "asm",
        !           709:        "atan", "atan2", "auto", "break",
        !           710:        "case", "catch", "char", "cilist", "class", "cllist",
        !           711:        "complex", "const", "continue", "cos", "cosh",
        !           712:        "dabs", "default", "defined", "delete",
        !           713:        "dmax", "dmin", "do", "double", "doublecomplex", "doublereal",
        !           714:        "else", "entry", "enum", "exp", "extern",
        !           715:        "flag", "float", "for", "friend", "ftnint", "ftnlen", "goto",
        !           716:        "icilist", "if", "include", "inline", "inlist", "int", "integer",
        !           717:        "integer1", "log", "logical", "logical1", "long", "longint",
        !           718:        "max", "min", "new",
        !           719:        "olist", "operator", "overload", "private", "protected", "public",
        !           720:        "real", "register", "return",
        !           721:        "short", "shortint", "shortlogical", "signed", "sin", "sinh",
        !           722:        "sizeof", "sqrt", "static", "struct", "switch",
        !           723:        "tan", "tanh", "template", "this", "try", "typedef",
        !           724:        "union", "unsigned", "virtual", "void", "volatile", "while"
        !           725: }; /* c_keywords */
        !           726: 
        !           727: int n_keywords = sizeof(c_keywords)/sizeof(char *);
        !           728: 
        !           729: char *st_fields[] = {
        !           730:        "addr", "aerr", "aunit", "c", "cerr", "ciend", "cierr",
        !           731:        "cifmt", "cirec", "ciunit", "csta", "cunit", "d", "dims",
        !           732:        "h", "i", "iciend", "icierr", "icifmt", "icirlen",
        !           733:        "icirnum", "iciunit", "inacc", "inacclen", "inblank",
        !           734:        "inblanklen", "indir", "indirlen", "inerr", "inex",
        !           735:        "infile", "infilen", "infmt", "infmtlen", "inform",
        !           736:        "informlen", "inname", "innamed", "innamlen", "innrec",
        !           737:        "innum", "inopen", "inrecl", "inseq", "inseqlen", "inunf",
        !           738:        "inunflen", "inunit", "name", "nvars", "oacc", "oblnk",
        !           739:        "oerr", "ofm", "ofnm", "ofnmlen", "orl", "osta", "ounit",
        !           740:        "r", "type", "vars", "z"
        !           741:        };
        !           742: int n_st_fields = sizeof(st_fields)/sizeof(char *);

unix.superglobalmegacorp.com

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