590 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			590 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************
 | 
						|
Copyright 1990, 1991 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;
 | 
						|
int tycomplex = TYCOMPLEX;
 | 
						|
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;
 | 
						|
	tycomplex = TYDCOMPLEX;
 | 
						|
	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);
 | 
						|
}
 |