|
|
1.1 ! root 1: /**************************************************************** ! 2: Copyright 1990, 1991, 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: extern char F2C_version[]; ! 25: ! 26: #include "defs.h" ! 27: #include "parse.h" ! 28: ! 29: int complex_seen, dcomplex_seen; ! 30: ! 31: LOCAL int Max_ftn_files; ! 32: ! 33: char **ftn_files; ! 34: int current_ftn_file = 0; ! 35: ! 36: flag ftn66flag = NO; ! 37: flag nowarnflag = NO; ! 38: flag noextflag = NO; ! 39: flag no66flag = NO; /* Must also set noextflag to this ! 40: same value */ ! 41: flag zflag = YES; /* recognize double complex intrinsics */ ! 42: flag debugflag = NO; ! 43: flag onetripflag = NO; ! 44: flag shiftcase = YES; ! 45: flag undeftype = NO; ! 46: flag checksubs = NO; ! 47: flag r8flag = NO; ! 48: flag use_bs = YES; ! 49: flag keepsubs = NO; ! 50: #ifdef TYQUAD ! 51: flag use_tyquad = YES; ! 52: #endif ! 53: int tyreal = TYREAL; ! 54: int tycomplex = TYCOMPLEX; ! 55: extern void r8fix(), read_Pfiles(); ! 56: ! 57: int maxregvar = MAXREGVAR; /* if maxregvar > MAXREGVAR, error */ ! 58: int maxequiv = MAXEQUIV; ! 59: int maxext = MAXEXT; ! 60: int maxstno = MAXSTNO; ! 61: int maxctl = MAXCTL; ! 62: int maxhash = MAXHASH; ! 63: int maxliterals = MAXLITERALS; ! 64: int maxcontin = MAXCONTIN; ! 65: int maxlablist = MAXLABLIST; ! 66: int extcomm, ext1comm, useauto; ! 67: int can_include = YES; /* so we can disable includes for netlib */ ! 68: ! 69: static char *def_i2 = ""; ! 70: ! 71: static int useshortints = NO; /* YES => tyint = TYSHORT */ ! 72: static int uselongints = NO; /* YES => tyint = TYLONG */ ! 73: int addftnsrc = NO; /* Include ftn source in output */ ! 74: int usedefsforcommon = NO; /* Use #defines for common reference */ ! 75: int forcedouble = YES; /* force real functions to double */ ! 76: int Ansi = NO; ! 77: int def_equivs = YES; ! 78: int tyioint = TYLONG; ! 79: int szleng = SZLENG; ! 80: int inqmask = M(TYLONG)|M(TYLOGICAL); ! 81: int wordalign = NO; ! 82: int forcereal = NO; ! 83: int warn72 = NO; ! 84: static int skipC, skipversion; ! 85: char *file_name, *filename0, *parens; ! 86: int Castargs = 1; ! 87: static int Castargs1; ! 88: static int typedefs = 0; ! 89: int chars_per_wd, gflag, protostatus; ! 90: int infertypes = 1; ! 91: char used_rets[TYSUBR+1]; ! 92: extern char *tmpdir; ! 93: static int h0align = 0; ! 94: char *halign, *ohalign; ! 95: int krparens = NO; ! 96: int hsize; /* for padding under -h */ ! 97: int htype; /* for wr_equiv_init under -h */ ! 98: ! 99: #define f2c_entry(swit,count,type,store,size) \ ! 100: p_entry ("-", swit, 0, count, type, store, size) ! 101: ! 102: static arg_info table[] = { ! 103: f2c_entry ("w66", P_NO_ARGS, P_INT, &ftn66flag, YES), ! 104: f2c_entry ("w", P_NO_ARGS, P_INT, &nowarnflag, YES), ! 105: f2c_entry ("66", P_NO_ARGS, P_INT, &no66flag, YES), ! 106: f2c_entry ("d", P_ONE_ARG, P_INT, &debugflag, YES), ! 107: f2c_entry ("1", P_NO_ARGS, P_INT, &onetripflag, YES), ! 108: f2c_entry ("onetrip", P_NO_ARGS, P_INT, &onetripflag, YES), ! 109: f2c_entry ("I2", P_NO_ARGS, P_INT, &useshortints, YES), ! 110: f2c_entry ("I4", P_NO_ARGS, P_INT, &uselongints, YES), ! 111: f2c_entry ("U", P_NO_ARGS, P_INT, &shiftcase, NO), ! 112: f2c_entry ("u", P_NO_ARGS, P_INT, &undeftype, YES), ! 113: f2c_entry ("O", P_ONE_ARG, P_INT, &maxregvar, 0), ! 114: f2c_entry ("C", P_NO_ARGS, P_INT, &checksubs, YES), ! 115: f2c_entry ("Nq", P_ONE_ARG, P_INT, &maxequiv, 0), ! 116: f2c_entry ("Nx", P_ONE_ARG, P_INT, &maxext, 0), ! 117: f2c_entry ("Ns", P_ONE_ARG, P_INT, &maxstno, 0), ! 118: f2c_entry ("Nc", P_ONE_ARG, P_INT, &maxctl, 0), ! 119: f2c_entry ("Nn", P_ONE_ARG, P_INT, &maxhash, 0), ! 120: f2c_entry ("NL", P_ONE_ARG, P_INT, &maxliterals, 0), ! 121: f2c_entry ("NC", P_ONE_ARG, P_INT, &maxcontin, 0), ! 122: f2c_entry ("Nl", P_ONE_ARG, P_INT, &maxlablist, 0), ! 123: f2c_entry ("c", P_NO_ARGS, P_INT, &addftnsrc, YES), ! 124: f2c_entry ("p", P_NO_ARGS, P_INT, &usedefsforcommon, YES), ! 125: f2c_entry ("R", P_NO_ARGS, P_INT, &forcedouble, NO), ! 126: f2c_entry ("!R", P_NO_ARGS, P_INT, &forcedouble, YES), ! 127: f2c_entry ("A", P_NO_ARGS, P_INT, &Ansi, YES), ! 128: f2c_entry ("ext", P_NO_ARGS, P_INT, &noextflag, YES), ! 129: f2c_entry ("z", P_NO_ARGS, P_INT, &zflag, NO), ! 130: f2c_entry ("a", P_NO_ARGS, P_INT, &useauto, YES), ! 131: f2c_entry ("r8", P_NO_ARGS, P_INT, &r8flag, YES), ! 132: f2c_entry ("i2", P_NO_ARGS, P_INT, &tyioint, NO), ! 133: f2c_entry ("w8", P_NO_ARGS, P_INT, &wordalign, YES), ! 134: f2c_entry ("!I", P_NO_ARGS, P_INT, &can_include, NO), ! 135: f2c_entry ("W", P_ONE_ARG, P_INT, &chars_per_wd, 0), ! 136: f2c_entry ("g", P_NO_ARGS, P_INT, &gflag, YES), ! 137: f2c_entry ("T", P_ONE_ARG, P_STRING, &tmpdir, 0), ! 138: f2c_entry ("E", P_NO_ARGS, P_INT, &extcomm, 1), ! 139: f2c_entry ("e1c", P_NO_ARGS, P_INT, &ext1comm, 1), ! 140: f2c_entry ("ec", P_NO_ARGS, P_INT, &ext1comm, 2), ! 141: f2c_entry ("C++", P_NO_ARGS, P_INT, &Ansi, 2), ! 142: f2c_entry ("P", P_NO_ARGS, P_INT, &Castargs, 3), ! 143: f2c_entry ("Ps", P_NO_ARGS, P_INT, &protostatus, 1), ! 144: f2c_entry ("!P", P_NO_ARGS, P_INT, &Castargs, 0), ! 145: f2c_entry ("!c", P_NO_ARGS, P_INT, &skipC, 1), ! 146: f2c_entry ("!it", P_NO_ARGS, P_INT, &infertypes, 0), ! 147: f2c_entry ("h", P_NO_ARGS, P_INT, &h0align, 1), ! 148: f2c_entry ("hd", P_NO_ARGS, P_INT, &h0align, 2), ! 149: f2c_entry ("kr", P_NO_ARGS, P_INT, &krparens, 1), ! 150: f2c_entry ("krd", P_NO_ARGS, P_INT, &krparens, 2), ! 151: f2c_entry ("!bs", P_NO_ARGS, P_INT, &use_bs, NO), ! 152: f2c_entry ("r", P_NO_ARGS, P_INT, &forcereal, YES), ! 153: f2c_entry ("72", P_NO_ARGS, P_INT, &warn72, 1), ! 154: f2c_entry ("f", P_NO_ARGS, P_INT, &warn72, 2), ! 155: f2c_entry ("s", P_NO_ARGS, P_INT, &keepsubs, 1), ! 156: #ifdef TYQUAD ! 157: f2c_entry ("!i8", P_NO_ARGS, P_INT, &use_tyquad, NO), ! 158: #endif ! 159: ! 160: /* options omitted from man pages */ ! 161: ! 162: /* -ev ==> implement equivalence with initialized pointers */ ! 163: f2c_entry ("ev", P_NO_ARGS, P_INT, &def_equivs, NO), ! 164: ! 165: /* -!it used to be the default when -it was more agressive */ ! 166: ! 167: f2c_entry ("it", P_NO_ARGS, P_INT, &infertypes, 1), ! 168: ! 169: /* -Pd is similar to -P, but omits :ref: lines */ ! 170: f2c_entry ("Pd", P_NO_ARGS, P_INT, &Castargs, 2), ! 171: ! 172: /* -t ==> emit typedefs (under -A or -C++) for procedure ! 173: argument types used. This is meant for netlib's ! 174: f2c service, so -A and -C++ will work with older ! 175: versions of f2c.h ! 176: */ ! 177: f2c_entry ("t", P_NO_ARGS, P_INT, &typedefs, 1), ! 178: ! 179: /* -!V ==> omit version msg (to facilitate using diff in ! 180: regression testing) ! 181: */ ! 182: f2c_entry ("!V", P_NO_ARGS, P_INT, &skipversion, 1) ! 183: ! 184: }; /* table */ ! 185: ! 186: extern char *c_functions; /* "c_functions" */ ! 187: extern char *coutput; /* "c_output" */ ! 188: extern char *initfname; /* "raw_data" */ ! 189: extern char *blkdfname; /* "block_data" */ ! 190: extern char *p1_file; /* "p1_file" */ ! 191: extern char *p1_bakfile; /* "p1_file.BAK" */ ! 192: extern char *sortfname; /* "init_file" */ ! 193: extern char *proto_fname; /* "proto_file" */ ! 194: FILE *protofile; ! 195: ! 196: extern void list_init_data(), set_tmp_names(), sigcatch(), Un_link_all(); ! 197: extern char *c_name(); ! 198: ! 199: ! 200: set_externs () ! 201: { ! 202: static char *hset[3] = { 0, "integer", "doublereal" }; ! 203: ! 204: /* Adjust the global flags according to the command line parameters */ ! 205: ! 206: if (chars_per_wd > 0) { ! 207: typesize[TYADDR] = typesize[TYLONG] = typesize[TYREAL] = ! 208: typesize[TYLOGICAL] = chars_per_wd; ! 209: typesize[TYINT1] = typesize[TYLOGICAL1] = 1; ! 210: typesize[TYDREAL] = typesize[TYCOMPLEX] = chars_per_wd << 1; ! 211: typesize[TYDCOMPLEX] = chars_per_wd << 2; ! 212: typesize[TYSHORT] = typesize[TYLOGICAL2] = chars_per_wd >> 1; ! 213: typesize[TYCILIST] = 5*chars_per_wd; ! 214: typesize[TYICILIST] = 6*chars_per_wd; ! 215: typesize[TYOLIST] = 9*chars_per_wd; ! 216: typesize[TYCLLIST] = 3*chars_per_wd; ! 217: typesize[TYALIST] = 2*chars_per_wd; ! 218: typesize[TYINLIST] = 26*chars_per_wd; ! 219: } ! 220: ! 221: if (wordalign) ! 222: typealign[TYDREAL] = typealign[TYDCOMPLEX] = typealign[TYREAL]; ! 223: if (!tyioint) { ! 224: tyioint = TYSHORT; ! 225: szleng = typesize[TYSHORT]; ! 226: def_i2 = "#define f2c_i2 1\n"; ! 227: inqmask = M(TYSHORT)|M(TYLOGICAL); ! 228: goto checklong; ! 229: } ! 230: else ! 231: szleng = typesize[TYLONG]; ! 232: if (useshortints) { ! 233: inqmask = M(TYLONG); ! 234: checklong: ! 235: protorettypes[TYLOGICAL] = typename[TYLOGICAL] = "shortlogical"; ! 236: typesize[TYLOGICAL] = typesize[TYSHORT]; ! 237: casttypes[TYLOGICAL] = "K_fp"; ! 238: if (uselongints) ! 239: err ("Can't use both long and short ints"); ! 240: else { ! 241: tyint = tylogical = TYSHORT; ! 242: tylog = TYLOGICAL2; ! 243: } ! 244: } ! 245: else if (uselongints) ! 246: tyint = TYLONG; ! 247: ! 248: if (h0align) { ! 249: if (tyint == TYLONG && wordalign) ! 250: h0align = 1; ! 251: ohalign = halign = hset[h0align]; ! 252: htype = h0align == 1 ? tyint : TYDREAL; ! 253: hsize = typesize[htype]; ! 254: } ! 255: ! 256: if (no66flag) ! 257: noextflag = no66flag; ! 258: if (noextflag) ! 259: zflag = 0; ! 260: ! 261: if (r8flag) { ! 262: tyreal = TYDREAL; ! 263: tycomplex = TYDCOMPLEX; ! 264: r8fix(); ! 265: } ! 266: if (forcedouble) { ! 267: protorettypes[TYREAL] = "E_f"; ! 268: casttypes[TYREAL] = "E_fp"; ! 269: } ! 270: ! 271: if (maxregvar > MAXREGVAR) { ! 272: warni("-O%d: too many register variables", maxregvar); ! 273: maxregvar = MAXREGVAR; ! 274: } /* if maxregvar > MAXREGVAR */ ! 275: ! 276: /* Check the list of input files */ ! 277: ! 278: { ! 279: int bad, i, cur_max = Max_ftn_files; ! 280: ! 281: for (i = bad = 0; i < cur_max && ftn_files[i]; i++) ! 282: if (ftn_files[i][0] == '-') { ! 283: errstr ("Invalid flag '%s'", ftn_files[i]); ! 284: bad++; ! 285: } ! 286: if (bad) ! 287: exit(1); ! 288: ! 289: } /* block */ ! 290: } /* set_externs */ ! 291: ! 292: ! 293: static int ! 294: comm2dcl() ! 295: { ! 296: Extsym *ext; ! 297: if (ext1comm) ! 298: for(ext = extsymtab; ext < nextext; ext++) ! 299: if (ext->extstg == STGCOMMON && !ext->extinit) ! 300: return ext1comm; ! 301: return 0; ! 302: } ! 303: ! 304: static void ! 305: write_typedefs(outfile) ! 306: FILE *outfile; ! 307: { ! 308: register int i; ! 309: register char *s, *p = 0; ! 310: static char st[4] = { TYREAL, TYCOMPLEX, TYDCOMPLEX, TYCHAR }; ! 311: static char stl[4] = { 'E', 'C', 'Z', 'H' }; ! 312: ! 313: for(i = 0; i <= TYSUBR; i++) ! 314: if (s = usedcasts[i]) { ! 315: if (!p) { ! 316: p = Ansi == 1 ? "()" : "(...)"; ! 317: nice_printf(outfile, ! 318: "/* Types for casting procedure arguments: */\ ! 319: \n\n#ifndef F2C_proc_par_types\n"); ! 320: if (i == 0) { ! 321: nice_printf(outfile, ! 322: "typedef int /* Unknown procedure type */ (*%s)%s;\n", ! 323: s, p); ! 324: continue; ! 325: } ! 326: } ! 327: nice_printf(outfile, "typedef %s (*%s)%s;\n", ! 328: c_type_decl(i,1), s, p); ! 329: } ! 330: for(i = !forcedouble; i < 4; i++) ! 331: if (used_rets[st[i]]) ! 332: nice_printf(outfile, ! 333: "typedef %s %c_f; /* %s function */\n", ! 334: p = i ? "VOID" : "doublereal", ! 335: stl[i], ftn_types[st[i]]); ! 336: if (p) ! 337: nice_printf(outfile, "#endif\n\n"); ! 338: } ! 339: ! 340: static void ! 341: commonprotos(outfile) ! 342: register FILE *outfile; ! 343: { ! 344: register Extsym *e, *ee; ! 345: register Argtypes *at; ! 346: Atype *a, *ae; ! 347: int k; ! 348: extern int proc_protochanges; ! 349: ! 350: if (!outfile) ! 351: return; ! 352: for (e = extsymtab, ee = nextext; e < ee; e++) ! 353: if (e->extstg == STGCOMMON && e->allextp) ! 354: nice_printf(outfile, "/* comlen %s %ld */\n", ! 355: e->cextname, e->maxleng); ! 356: if (Castargs1 < 3) ! 357: return; ! 358: ! 359: /* -Pr: special comments conveying current knowledge ! 360: of external references */ ! 361: ! 362: k = proc_protochanges; ! 363: for (e = extsymtab, ee = nextext; e < ee; e++) ! 364: if (e->extstg == STGEXT ! 365: && e->cextname != e->fextname) /* not a library function */ ! 366: if (at = e->arginfo) { ! 367: if ((!e->extinit || at->changes & 1) ! 368: /* not defined here or ! 369: changed since definition */ ! 370: && at->nargs >= 0) { ! 371: nice_printf(outfile, "/*:ref: %s %d %d", ! 372: e->cextname, e->extype, at->nargs); ! 373: a = at->atypes; ! 374: for(ae = a + at->nargs; a < ae; a++) ! 375: nice_printf(outfile, " %d", a->type); ! 376: nice_printf(outfile, " */\n"); ! 377: if (at->changes & 1) ! 378: k++; ! 379: } ! 380: } ! 381: else if (e->extype) ! 382: /* typed external, never invoked */ ! 383: nice_printf(outfile, "/*:ref: %s %d :*/\n", ! 384: e->cextname, e->extype); ! 385: if (k) { ! 386: nice_printf(outfile, ! 387: "/* Rerunning f2c -P may change prototypes or declarations. */\n"); ! 388: if (nerr) ! 389: return; ! 390: if (protostatus) ! 391: done(4); ! 392: if (protofile != stdout) { ! 393: fprintf(diagfile, ! 394: "Rerunning \"f2c -P ... %s %s\" may change prototypes or declarations.\n", ! 395: filename0, proto_fname); ! 396: fflush(diagfile); ! 397: } ! 398: } ! 399: } ! 400: ! 401: int retcode = 0; ! 402: ! 403: main(argc, argv) ! 404: int argc; ! 405: char **argv; ! 406: { ! 407: int c2d, k; ! 408: FILE *c_output; ! 409: char *cdfilename; ! 410: static char stderrbuf[BUFSIZ]; ! 411: extern void def_commons(); ! 412: extern char **dfltproc, *dflt1proc[]; ! 413: extern char link_msg[]; ! 414: ! 415: diagfile = stderr; ! 416: setbuf(stderr, stderrbuf); /* arrange for fast error msgs */ ! 417: ! 418: Max_ftn_files = argc - 1; ! 419: ftn_files = (char **)ckalloc((argc+1)*sizeof(char *)); ! 420: ! 421: parse_args (argc, argv, table, sizeof(table)/sizeof(arg_info), ! 422: ftn_files, Max_ftn_files); ! 423: if (!can_include && ext1comm == 2) ! 424: ext1comm = 1; ! 425: if (ext1comm && !extcomm) ! 426: extcomm = 2; ! 427: if (protostatus) ! 428: Castargs = 3; ! 429: Castargs1 = Castargs; ! 430: if (!Ansi) { ! 431: Castargs = 0; ! 432: parens = "()"; ! 433: } ! 434: else if (!Castargs) ! 435: parens = Ansi == 1 ? "()" : "(...)"; ! 436: else ! 437: dfltproc = dflt1proc; ! 438: ! 439: set_externs(); ! 440: fileinit(); ! 441: read_Pfiles(ftn_files); ! 442: ! 443: for(k = 1; ftn_files[k]; k++) ! 444: if (dofork()) ! 445: break; ! 446: filename0 = file_name = ftn_files[current_ftn_file = k - 1]; ! 447: ! 448: set_tmp_names(); ! 449: sigcatch(); ! 450: ! 451: c_file = opf(c_functions, textwrite); ! 452: pass1_file=opf(p1_file, binwrite); ! 453: initkey(); ! 454: if (file_name && *file_name) { ! 455: if (debugflag != 1) { ! 456: coutput = c_name(file_name,'c'); ! 457: if (Castargs1 >= 2) ! 458: proto_fname = c_name(file_name,'P'); ! 459: } ! 460: cdfilename = coutput; ! 461: if (skipC) ! 462: coutput = 0; ! 463: else if (!(c_output = fopen(coutput, textwrite))) { ! 464: file_name = coutput; ! 465: coutput = 0; /* don't delete read-only .c file */ ! 466: fatalstr("can't open %.86s", file_name); ! 467: } ! 468: ! 469: if (Castargs1 >= 2 ! 470: && !(protofile = fopen(proto_fname, textwrite))) ! 471: fatalstr("Can't open %.84s\n", proto_fname); ! 472: } ! 473: else { ! 474: file_name = ""; ! 475: cdfilename = "f2c_out.c"; ! 476: c_output = stdout; ! 477: coutput = 0; ! 478: if (Castargs1 >= 2) { ! 479: protofile = stdout; ! 480: if (!skipC) ! 481: printf("#ifdef P_R_O_T_O_T_Y_P_E_S\n"); ! 482: } ! 483: } ! 484: ! 485: if(inilex( copys(file_name) )) ! 486: done(1); ! 487: if (filename0) { ! 488: fprintf(diagfile, "%s:\n", file_name); ! 489: fflush(diagfile); ! 490: } ! 491: ! 492: procinit(); ! 493: if(k = yyparse()) ! 494: { ! 495: fprintf(diagfile, "Bad parse, return code %d\n", k); ! 496: done(1); ! 497: } ! 498: ! 499: commonprotos(protofile); ! 500: if (protofile == stdout && !skipC) ! 501: printf("#endif\n\n"); ! 502: ! 503: if (nerr || skipC) ! 504: goto C_skipped; ! 505: ! 506: ! 507: /* Write out the declarations which are global to this file */ ! 508: ! 509: if ((c2d = comm2dcl()) == 1) ! 510: nice_printf(c_output, "/*>>>'/dev/null'<<<*/\n\n\ ! 511: /* Split this into several files by piping it through\n\n\ ! 512: sed \"s/^\\/\\*>>>'\\(.*\\)'<<<\\*\\/\\$/cat >'\\1' <<'\\/*<<<\\1>>>*\\/'/\" | /bin/sh\n\ ! 513: */\n\ ! 514: /*<<</dev/null>>>*/\n\ ! 515: /*>>>'%s'<<<*/\n", cdfilename); ! 516: if (gflag) ! 517: nice_printf (c_output, "#line 1 \"%s\"\n", file_name); ! 518: if (!skipversion) { ! 519: nice_printf (c_output, "/* %s -- translated by f2c ", file_name); ! 520: nice_printf (c_output, "(version of %s).\n", F2C_version); ! 521: nice_printf (c_output, ! 522: " You must link the resulting object file with the libraries:\n\ ! 523: %s (in that order)\n*/\n\n", link_msg); ! 524: } ! 525: if (Ansi == 2) ! 526: nice_printf(c_output, ! 527: "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); ! 528: nice_printf (c_output, "%s#include \"f2c.h\"\n\n", def_i2); ! 529: if (gflag) ! 530: nice_printf (c_output, "#line 1 \"%s\"\n", file_name); ! 531: if (Castargs && typedefs) ! 532: write_typedefs(c_output); ! 533: nice_printf (c_file, "\n"); ! 534: fclose (c_file); ! 535: c_file = c_output; /* HACK to get the next indenting ! 536: to work */ ! 537: wr_common_decls (c_output); ! 538: if (blkdfile) ! 539: list_init_data(&blkdfile, blkdfname, c_output); ! 540: wr_globals (c_output); ! 541: if ((c_file = fopen (c_functions, textread)) == (FILE *) NULL) ! 542: Fatal("main - couldn't reopen c_functions"); ! 543: ffilecopy (c_file, c_output); ! 544: if (*main_alias) { ! 545: nice_printf (c_output, "/* Main program alias */ "); ! 546: nice_printf (c_output, "int %s () { MAIN__ ();%s }\n", ! 547: main_alias, Ansi ? " return 0;" : ""); ! 548: } ! 549: if (Ansi == 2) ! 550: nice_printf(c_output, ! 551: "#ifdef __cplusplus\n\t}\n#endif\n"); ! 552: if (c2d) { ! 553: if (c2d == 1) ! 554: fprintf(c_output, "/*<<<%s>>>*/\n", cdfilename); ! 555: else ! 556: fclose(c_output); ! 557: def_commons(c_output); ! 558: } ! 559: if (c2d != 2) ! 560: fclose (c_output); ! 561: ! 562: C_skipped: ! 563: if(parstate != OUTSIDE) ! 564: { ! 565: warn("missing final end statement"); ! 566: endproc(); ! 567: } ! 568: done(nerr ? 1 : 0); ! 569: } ! 570: ! 571: ! 572: FILEP opf(fn, mode) ! 573: char *fn, *mode; ! 574: { ! 575: FILEP fp; ! 576: if( fp = fopen(fn, mode) ) ! 577: return(fp); ! 578: ! 579: fatalstr("cannot open intermediate file %s", fn); ! 580: /* NOT REACHED */ return 0; ! 581: } ! 582: ! 583: ! 584: clf(p, what, quit) ! 585: FILEP *p; ! 586: char *what; ! 587: int quit; ! 588: { ! 589: if(p!=NULL && *p!=NULL && *p!=stdout) ! 590: { ! 591: if(ferror(*p)) { ! 592: fprintf(stderr, "I/O error on %s\n", what); ! 593: if (quit) ! 594: done(3); ! 595: retcode = 3; ! 596: } ! 597: fclose(*p); ! 598: } ! 599: *p = NULL; ! 600: } ! 601: ! 602: ! 603: done(k) ! 604: int k; ! 605: { ! 606: clf(&initfile, "initfile", 0); ! 607: clf(&c_file, "c_file", 0); ! 608: clf(&pass1_file, "pass1_file", 0); ! 609: Un_link_all(k); ! 610: exit(k|retcode); ! 611: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.