/*
 * Copyright (c) 1995, 1996, 1999 The University of Utah and
 * the Computer Systems Laboratory at the University of Utah (CSL).
 *
 * This file is part of Flick, the Flexible IDL Compiler Kit.
 *
 * Flick is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Flick is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Flick; see the file COPYING.  If not, write to
 * the Free Software Foundation, 59 Temple Place #330, Boston, MA 02111, USA.
 */

#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <mom/compiler.h>
#include <mom/libaoi.h>
#include <mom/libmeta.h>
#include <assert.h>

#include "rpc_parse.h"
#include "rpc_util.h"

extern int crash();
extern void translate();

char *progname;

definition *defs;
extern aoi outaoi;
io_file_index root_file = -1;
io_file_index current_i_file = -1;
const char *root_filename = 0;

static void read_defs(void)
{
	definition *def, **last_def;

	last_def = &defs;
	while ((def = get_definition()))
	{
		*last_def = def;
		last_def = &def->next;
	}
	*last_def = 0;
}

int main(int argc, char **argv)
{
	/* We're just a simple filter.  */
	XDR xdrs;
	FILE *out;
	fe_flags res = front_end_args(argc, argv, "Note that the XDR '%' option for inlining code is NOT supported");

	if (!res.nocpp) {
		fin = call_c_preprocessor(res.input, res.cpp_flags);
		root_filename = res.input;
	} else if (res.input) {
		fin = fopen(res.input, "r");
		root_filename = res.input;
	} else {
		fin = stdin;
		root_filename = "<stdin>";
	}
	assert(root_filename);
	
	if (!fin)
		panic("Can't open file '%s' for reading.", res.input ? res.input : "<stdin>");
	
	init_meta(&outaoi.meta_data);
	meta_add_channel(&outaoi.meta_data,
			 meta_add_file(&outaoi.meta_data, "(generated)",
				       IO_FILE_INPUT),
			 "");
	meta_add_file(&outaoi.meta_data, "(builtin)", IO_FILE_BUILTIN);
	/*
	 * We strip off any leading path on `res.input'.  We don't want AOI
	 * files to differ based on the path to the input file.
	 */
	root_file = meta_add_file(&outaoi.meta_data,
				  file_part(root_filename),
				  IO_FILE_INPUT|IO_FILE_ROOT);
	current_i_file = root_file;
	read_defs();
	translate();
	/* print_all(outaoi); */
	
	out = (res.output ? fopen(res.output, "wb") : stdout);
	
	xdrstdio_create(&xdrs, out, XDR_ENCODE);
	if (!xdr_aoi(&xdrs, &outaoi)) {
		panic("error writing AOI file\n");
	}
	xdr_destroy(&xdrs);
	return 0;
}



syntax highlighted by Code2HTML, v. 0.9.1