home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************
- Copyright 1990 by AT&T Bell Laboratories and Bellcore.
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, provided that the above copyright notice appear in all
- copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the names of AT&T Bell Laboratories or
- Bellcore or any of their entities not be used in advertising or
- publicity pertaining to distribution of the software without
- specific, written prior permission.
-
- AT&T and Bellcore disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall AT&T or Bellcore be liable for
- any special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
- ****************************************************************/
-
- extern char F2C_version[];
-
- #include "defs.h"
- #include "parse.h"
-
- int complex_seen, dcomplex_seen;
-
- LOCAL int Max_ftn_files;
-
- char **ftn_files;
- int current_ftn_file = 0;
-
- flag ftn66flag = NO;
- flag nowarnflag = NO;
- flag noextflag = NO;
- flag no66flag = NO; /* Must also set noextflag to this
- same value */
- flag zflag = YES; /* recognize double complex intrinsics */
- flag debugflag = NO;
- flag onetripflag = NO;
- flag shiftcase = YES;
- flag undeftype = NO;
- flag checksubs = NO;
- flag r8flag = NO;
- flag use_bs = YES;
- int tyreal = TYREAL;
- extern void r8fix(), read_Pfiles();
-
- int maxregvar = MAXREGVAR; /* if maxregvar > MAXREGVAR, error */
- int maxequiv = MAXEQUIV;
- int maxext = MAXEXT;
- int maxstno = MAXSTNO;
- int maxctl = MAXCTL;
- int maxhash = MAXHASH;
- int maxliterals = MAXLITERALS;
- int extcomm, ext1comm, useauto;
- int can_include = YES; /* so we can disable includes for netlib */
-
- static char *def_i2 = "";
-
- static int useshortints = NO; /* YES => tyint = TYSHORT */
- static int uselongints = NO; /* YES => tyint = TYLONG */
- int addftnsrc = NO; /* Include ftn source in output */
- int usedefsforcommon = NO; /* Use #defines for common reference */
- int forcedouble = YES; /* force real functions to double */
- int Ansi = NO;
- int def_equivs = YES;
- int tyioint = TYLONG;
- int szleng = SZLENG;
- int inqmask = M(TYLONG)|M(TYLOGICAL);
- int wordalign = NO;
- int forcereal = NO;
- static int skipC, skipversion;
- char *filename0, *parens;
- int Castargs = 1;
- static int typedefs = 0;
- int chars_per_wd, gflag, protostatus;
- int infertypes = 1;
- char used_rets[TYSUBR+1];
- extern char *tmpdir;
- static int h0align = 0;
- char *halign, *ohalign;
- int krparens = NO;
- int hsize; /* for padding under -h */
- int htype; /* for wr_equiv_init under -h */
-
- #define f2c_entry(swit,count,type,store,size) \
- p_entry ("-", swit, 0, count, type, store, size)
-
- static arg_info table[] = {
- f2c_entry ("w66", P_NO_ARGS, P_INT, &ftn66flag, YES),
- f2c_entry ("w", P_NO_ARGS, P_INT, &nowarnflag, YES),
- f2c_entry ("66", P_NO_ARGS, P_INT, &no66flag, YES),
- f2c_entry ("d", P_ONE_ARG, P_INT, &debugflag, YES),
- f2c_entry ("1", P_NO_ARGS, P_INT, &onetripflag, YES),
- f2c_entry ("onetrip", P_NO_ARGS, P_INT, &onetripflag, YES),
- f2c_entry ("I2", P_NO_ARGS, P_INT, &useshortints, YES),
- f2c_entry ("I4", P_NO_ARGS, P_INT, &uselongints, YES),
- f2c_entry ("U", P_NO_ARGS, P_INT, &shiftcase, NO),
- f2c_entry ("u", P_NO_ARGS, P_INT, &undeftype, YES),
- f2c_entry ("O", P_ONE_ARG, P_INT, &maxregvar, 0),
- f2c_entry ("C", P_NO_ARGS, P_INT, &checksubs, YES),
- f2c_entry ("Nq", P_ONE_ARG, P_INT, &maxequiv, 0),
- f2c_entry ("Nx", P_ONE_ARG, P_INT, &maxext, 0),
- f2c_entry ("Ns", P_ONE_ARG, P_INT, &maxstno, 0),
- f2c_entry ("Nc", P_ONE_ARG, P_INT, &maxctl, 0),
- f2c_entry ("Nn", P_ONE_ARG, P_INT, &maxhash, 0),
- f2c_entry ("NL", P_ONE_ARG, P_INT, &maxliterals, 0),
- f2c_entry ("c", P_NO_ARGS, P_INT, &addftnsrc, YES),
- f2c_entry ("p", P_NO_ARGS, P_INT, &usedefsforcommon, YES),
- f2c_entry ("R", P_NO_ARGS, P_INT, &forcedouble, NO),
- f2c_entry ("!R", P_NO_ARGS, P_INT, &forcedouble, YES),
- f2c_entry ("A", P_NO_ARGS, P_INT, &Ansi, YES),
- f2c_entry ("ext", P_NO_ARGS, P_INT, &noextflag, YES),
- f2c_entry ("z", P_NO_ARGS, P_INT, &zflag, NO),
- f2c_entry ("a", P_NO_ARGS, P_INT, &useauto, YES),
- f2c_entry ("r8", P_NO_ARGS, P_INT, &r8flag, YES),
- f2c_entry ("i2", P_NO_ARGS, P_INT, &tyioint, NO),
- f2c_entry ("w8", P_NO_ARGS, P_INT, &wordalign, YES),
- f2c_entry ("!I", P_NO_ARGS, P_INT, &can_include, NO),
- f2c_entry ("W", P_ONE_ARG, P_INT, &chars_per_wd, 0),
- f2c_entry ("g", P_NO_ARGS, P_INT, &gflag, YES),
- f2c_entry ("T", P_ONE_ARG, P_STRING, &tmpdir, 0),
- f2c_entry ("E", P_NO_ARGS, P_INT, &extcomm, 1),
- f2c_entry ("e1c", P_NO_ARGS, P_INT, &ext1comm, 1),
- f2c_entry ("ec", P_NO_ARGS, P_INT, &ext1comm, 2),
- f2c_entry ("C++", P_NO_ARGS, P_INT, &Ansi, 2),
- f2c_entry ("P", P_NO_ARGS, P_INT, &Castargs, 3),
- f2c_entry ("Ps", P_NO_ARGS, P_INT, &protostatus, 1),
- f2c_entry ("!P", P_NO_ARGS, P_INT, &Castargs, 0),
- f2c_entry ("!c", P_NO_ARGS, P_INT, &skipC, 1),
- f2c_entry ("!it", P_NO_ARGS, P_INT, &infertypes, 0),
- f2c_entry ("h", P_NO_ARGS, P_INT, &h0align, 1),
- f2c_entry ("hd", P_NO_ARGS, P_INT, &h0align, 2),
- f2c_entry ("kr", P_NO_ARGS, P_INT, &krparens, 1),
- f2c_entry ("krd", P_NO_ARGS, P_INT, &krparens, 2),
- f2c_entry ("!bs", P_NO_ARGS, P_INT, &use_bs, NO),
- f2c_entry ("r", P_NO_ARGS, P_INT, &forcereal, YES),
-
- /* options omitted from man pages */
-
- /* -ev ==> implement equivalence with initialized pointers */
- f2c_entry ("ev", P_NO_ARGS, P_INT, &def_equivs, NO),
-
- /* -!it used to be the default when -it was more agressive */
-
- f2c_entry ("it", P_NO_ARGS, P_INT, &infertypes, 1),
-
- /* -Pd is similar to -P, but omits :ref: lines */
- f2c_entry ("Pd", P_NO_ARGS, P_INT, &Castargs, 2),
-
- /* -t ==> emit typedefs (under -A or -C++) for procedure
- argument types used. This is meant for netlib's
- f2c service, so -A and -C++ will work with older
- versions of f2c.h
- */
- f2c_entry ("t", P_NO_ARGS, P_INT, &typedefs, 1),
-
- /* -!V ==> omit version msg (to facilitate using diff in
- regression testing)
- */
- f2c_entry ("!V", P_NO_ARGS, P_INT, &skipversion, 1)
-
- }; /* table */
-
- extern char *c_functions; /* "c_functions" */
- extern char *coutput; /* "c_output" */
- extern char *initfname; /* "raw_data" */
- extern char *blkdfname; /* "block_data" */
- extern char *p1_file; /* "p1_file" */
- extern char *p1_bakfile; /* "p1_file.BAK" */
- extern char *sortfname; /* "init_file" */
- static char *proto_fname; /* "proto_file" */
- FILE *protofile;
-
- extern void list_init_data(), set_tmp_names(), sigcatch(), Un_link_all();
- extern char *c_name();
-
-
- set_externs ()
- {
- static char *hset[3] = { 0, "integer", "doublereal" };
-
- /* Adjust the global flags according to the command line parameters */
-
- if (chars_per_wd > 0) {
- typesize[TYADDR] = typesize[TYLONG] = typesize[TYREAL] =
- typesize[TYLOGICAL] = chars_per_wd;
- typesize[TYDREAL] = typesize[TYCOMPLEX] = chars_per_wd << 1;
- typesize[TYDCOMPLEX] = chars_per_wd << 2;
- typesize[TYSHORT] = chars_per_wd >> 1;
- typesize[TYCILIST] = 5*chars_per_wd;
- typesize[TYICILIST] = 6*chars_per_wd;
- typesize[TYOLIST] = 9*chars_per_wd;
- typesize[TYCLLIST] = 3*chars_per_wd;
- typesize[TYALIST] = 2*chars_per_wd;
- typesize[TYINLIST] = 26*chars_per_wd;
- }
-
- if (wordalign)
- typealign[TYDREAL] = typealign[TYDCOMPLEX] = typealign[TYREAL];
- if (!tyioint) {
- tyioint = TYSHORT;
- szleng = typesize[TYSHORT];
- def_i2 = "#define f2c_i2 1\n";
- inqmask = M(TYSHORT)|M(TYLOGICAL);
- goto checklong;
- }
- else
- szleng = typesize[TYLONG];
- if (useshortints) {
- inqmask = M(TYLONG);
- checklong:
- protorettypes[TYLOGICAL] = typename[TYLOGICAL] = "shortlogical";
- typesize[TYLOGICAL] = typesize[TYSHORT];
- casttypes[TYLOGICAL] = "K_fp";
- if (uselongints)
- err ("Can't use both long and short ints");
- else
- tyint = tylogical = TYSHORT;
- }
- else if (uselongints)
- tyint = TYLONG;
-
- if (h0align) {
- if (tyint == TYLONG && wordalign)
- h0align = 1;
- ohalign = halign = hset[h0align];
- htype = h0align == 1 ? tyint : TYDREAL;
- hsize = typesize[htype];
- }
-
- if (no66flag)
- noextflag = no66flag;
- if (noextflag)
- zflag = 0;
-
- if (r8flag) {
- tyreal = TYDREAL;
- r8fix();
- }
- if (forcedouble) {
- protorettypes[TYREAL] = "E_f";
- casttypes[TYREAL] = "E_fp";
- }
-
- if (maxregvar > MAXREGVAR) {
- warni("-O%d: too many register variables", maxregvar);
- maxregvar = MAXREGVAR;
- } /* if maxregvar > MAXREGVAR */
-
- /* Check the list of input files */
-
- {
- int bad, i, cur_max = Max_ftn_files;
-
- for (i = bad = 0; i < cur_max && ftn_files[i]; i++)
- if (ftn_files[i][0] == '-') {
- errstr ("Invalid flag '%s'", ftn_files[i]);
- bad++;
- }
- if (bad)
- exit(1);
-
- } /* block */
- } /* set_externs */
-
-
- static int
- comm2dcl()
- {
- Extsym *ext;
- if (ext1comm)
- for(ext = extsymtab; ext < nextext; ext++)
- if (ext->extstg == STGCOMMON && !ext->extinit)
- return ext1comm;
- return 0;
- }
-
- static void
- write_typedefs(outfile)
- FILE *outfile;
- {
- register int i;
- register char *s, *p = 0;
- static char st[4] = { TYREAL, TYCOMPLEX, TYDCOMPLEX, TYCHAR };
- static char stl[4] = { 'E', 'C', 'Z', 'H' };
-
- for(i = 0; i <= TYSUBR; i++)
- if (s = usedcasts[i]) {
- if (!p) {
- p = Ansi == 1 ? "()" : "(...)";
- nice_printf(outfile,
- "/* Types for casting procedure arguments: */\
- \n\n#ifndef F2C_proc_par_types\n");
- if (i == 0) {
- nice_printf(outfile,
- "typedef int /* Unknown procedure type */ (*%s)%s;\n",
- s, p);
- continue;
- }
- }
- nice_printf(outfile, "typedef %s (*%s)%s;\n",
- c_type_decl(i,1), s, p);
- }
- for(i = !forcedouble; i < 4; i++)
- if (used_rets[st[i]])
- nice_printf(outfile,
- "typedef %s %c_f; /* %s function */\n",
- p = i ? "VOID" : "doublereal",
- stl[i], ftn_types[st[i]]);
- if (p)
- nice_printf(outfile, "#endif\n\n");
- }
-
- static void
- commonprotos(outfile)
- register FILE *outfile;
- {
- register Extsym *e, *ee;
- register Argtypes *at;
- Atype *a, *ae;
- int k;
- extern int proc_protochanges;
-
- if (!outfile)
- return;
- for (e = extsymtab, ee = nextext; e < ee; e++)
- if (e->extstg == STGCOMMON && e->allextp)
- nice_printf(outfile, "/* comlen %s %ld */\n",
- e->cextname, e->maxleng);
- if (Castargs < 3)
- return;
-
- /* -Pr: special comments conveying current knowledge
- of external references */
-
- k = proc_protochanges;
- for (e = extsymtab, ee = nextext; e < ee; e++)
- if (e->extstg == STGEXT
- && e->cextname != e->fextname) /* not a library function */
- if (at = e->arginfo) {
- if ((!e->extinit || at->changes & 1)
- /* not defined here or
- changed since definition */
- && at->nargs >= 0) {
- nice_printf(outfile, "/*:ref: %s %d %d",
- e->cextname, e->extype, at->nargs);
- a = at->atypes;
- for(ae = a + at->nargs; a < ae; a++)
- nice_printf(outfile, " %d", a->type);
- nice_printf(outfile, " */\n");
- if (at->changes & 1)
- k++;
- }
- }
- else if (e->extype)
- /* typed external, never invoked */
- nice_printf(outfile, "/*:ref: %s %d :*/\n",
- e->cextname, e->extype);
- if (k) {
- nice_printf(outfile,
- "/* Rerunning f2c -P may change prototypes or declarations. */\n");
- if (nerr)
- return;
- if (protostatus)
- done(4);
- if (protofile != stdout) {
- fprintf(diagfile,
- "Rerunning \"f2c -P ... %s %s\" may change prototypes or declarations.\n",
- filename0, proto_fname);
- fflush(diagfile);
- }
- }
- }
-
- int retcode = 0;
-
- main(argc, argv)
- int argc;
- char **argv;
- {
- int c2d, k;
- FILE *c_output;
- char *filename, *cdfilename;
- static char stderrbuf[BUFSIZ];
- extern void def_commons();
- extern char **dfltproc, *dflt1proc[];
- extern char link_msg[];
-
- diagfile = stderr;
- setbuf(stderr, stderrbuf); /* arrange for fast error msgs */
-
- Max_ftn_files = argc - 1;
- ftn_files = (char **)ckalloc((argc+1)*sizeof(char *));
-
- parse_args (argc, argv, table, sizeof(table)/sizeof(arg_info),
- ftn_files, Max_ftn_files);
- if (!can_include && ext1comm == 2)
- ext1comm = 1;
- if (ext1comm && !extcomm)
- extcomm = 2;
- if (protostatus)
- Castargs = 3;
- else if (Castargs == 1 && !Ansi)
- Castargs = 0;
- if (Castargs >= 2 && !Ansi)
- Ansi = 1;
-
- if (!Ansi)
- parens = "()";
- else if (!Castargs)
- parens = Ansi == 1 ? "()" : "(...)";
- else
- dfltproc = dflt1proc;
-
- set_externs();
- fileinit();
- read_Pfiles(ftn_files);
-
- for(k = 1; ftn_files[k]; k++)
- if (dofork())
- break;
- filename0 = filename = ftn_files[current_ftn_file = k - 1];
-
- set_tmp_names();
- sigcatch();
-
- c_file = opf(c_functions, textwrite);
- pass1_file=opf(p1_file, binwrite);
- initkey();
- if (filename && *filename) {
- if (debugflag != 1) {
- coutput = c_name(filename,'c');
- if (Castargs >= 2)
- proto_fname = c_name(filename,'P');
- }
- cdfilename = coutput;
- if (skipC)
- coutput = 0;
- else if (!(c_output = fopen(coutput, textwrite))) {
- filename = coutput;
- coutput = 0; /* don't delete read-only .c file */
- fatalstr("can't open %.86s", filename);
- }
-
- if (Castargs >= 2
- && !(protofile = fopen(proto_fname, textwrite)))
- fatalstr("Can't open %.84s\n", proto_fname);
- }
- else {
- filename = "";
- cdfilename = "f2c_out.c";
- c_output = stdout;
- coutput = 0;
- if (Castargs >= 2) {
- protofile = stdout;
- if (!skipC)
- printf("#ifdef P_R_O_T_O_T_Y_P_E_S\n");
- }
- }
-
- if(inilex( copys(filename) ))
- done(1);
- if (filename0) {
- fprintf(diagfile, "%s:\n", filename);
- fflush(diagfile);
- }
-
- procinit();
- if(k = yyparse())
- {
- fprintf(diagfile, "Bad parse, return code %d\n", k);
- done(1);
- }
-
- commonprotos(protofile);
- if (protofile == stdout && !skipC)
- printf("#endif\n\n");
-
- if (nerr || skipC)
- goto C_skipped;
-
-
- /* Write out the declarations which are global to this file */
-
- if ((c2d = comm2dcl()) == 1)
- nice_printf(c_output, "/*>>>'/dev/null'<<<*/\n\n\
- /* Split this into several files by piping it through\n\n\
- sed \"s/^\\/\\*>>>'\\(.*\\)'<<<\\*\\/\\$/cat >'\\1' <<'\\/*<<<\\1>>>*\\/'/\" | /bin/sh\n\
- */\n\
- /*<<</dev/null>>>*/\n\
- /*>>>'%s'<<<*/\n", cdfilename);
- if (!skipversion) {
- nice_printf (c_output, "/* %s -- translated by f2c ", filename);
- nice_printf (c_output, "(version of %s).\n", F2C_version);
- nice_printf (c_output,
- " You must link the resulting object file with the libraries:\n\
- %s (in that order)\n*/\n\n", link_msg);
- }
- if (Ansi == 2)
- nice_printf(c_output,
- "#ifdef __cplusplus\nextern \"C\" {\n#endif\n");
- nice_printf (c_output, "%s#include \"f2c.h\"\n\n", def_i2);
- if (Castargs && typedefs)
- write_typedefs(c_output);
- nice_printf (c_file, "\n");
- fclose (c_file);
- c_file = c_output; /* HACK to get the next indenting
- to work */
- wr_common_decls (c_output);
- if (blkdfile)
- list_init_data(&blkdfile, blkdfname, c_output);
- wr_globals (c_output);
- if ((c_file = fopen (c_functions, textread)) == (FILE *) NULL)
- Fatal("main - couldn't reopen c_functions");
- ffilecopy (c_file, c_output);
- if (*main_alias) {
- nice_printf (c_output, "/* Main program alias */ ");
- nice_printf (c_output, "int %s () { MAIN__ (); }\n",
- main_alias);
- }
- if (Ansi == 2)
- nice_printf(c_output,
- "#ifdef __cplusplus\n\t}\n#endif\n");
- if (c2d) {
- if (c2d == 1)
- fprintf(c_output, "/*<<<%s>>>*/\n", cdfilename);
- else
- fclose(c_output);
- def_commons(c_output);
- }
- if (c2d != 2)
- fclose (c_output);
-
- C_skipped:
- if(parstate != OUTSIDE)
- {
- warn("missing final end statement");
- endproc();
- }
- done(nerr ? 1 : 0);
- }
-
-
- FILEP opf(fn, mode)
- char *fn, *mode;
- {
- FILEP fp;
- if( fp = fopen(fn, mode) )
- return(fp);
-
- fatalstr("cannot open intermediate file %s", fn);
- /* NOT REACHED */ return 0;
- }
-
-
- clf(p, what, quit)
- FILEP *p;
- char *what;
- int quit;
- {
- if(p!=NULL && *p!=NULL && *p!=stdout)
- {
- if(ferror(*p)) {
- fprintf(stderr, "I/O error on %s\n", what);
- if (quit)
- done(3);
- retcode = 3;
- }
- fclose(*p);
- }
- *p = NULL;
- }
-
-
- done(k)
- int k;
- {
- clf(&initfile, "initfile", 0);
- clf(&c_file, "c_file", 0);
- clf(&pass1_file, "pass1_file", 0);
- Un_link_all(k);
- exit(k|retcode);
- }
-