e16/epp/cppmain.c

99 lines
2.7 KiB
C

/* CPP main program, using CPP Library.
* Copyright (C) 1995 Free Software Foundation, Inc.
* Written by Per Bothner, 1994-95.
*
* This program 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, or (at your option) any
* later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
* In other words, you are welcome to use, share and improve this program.
* You are forbidden to forbid anyone else to use, share and improve
* what you give them. Help stamp out software-hoarding! */
#include "header.h"
#include <stdio.h>
#include <string.h>
#include "config.h"
extern char *getenv();
cpp_reader parse_in;
cpp_options options;
/* More 'friendly' abort that prints the line and file.
* config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort()
{
fatal("Internal gcc abort.");
}
int
main(argc, argv)
int argc;
char **argv;
{
char *p;
int i;
int argi = 1; /* Next argument to handle. */
struct cpp_options *opts = &options;
p = argv[0] + strlen(argv[0]);
while (p != argv[0] && p[-1] != '/')
--p;
progname = p;
init_parse_file(&parse_in);
parse_in.data = opts;
init_parse_options(opts);
argi += cpp_handle_options(&parse_in, argc - argi, argv + argi);
if (argi < argc)
fatal("Invalid option `%s'", argv[argi]);
parse_in.show_column = 1;
i = push_parse_file(&parse_in, opts->in_fname);
if (i != SUCCESS_EXIT_CODE)
return i;
/* Now that we know the input file is valid, open the output. */
if (!opts->out_fname || !strcmp(opts->out_fname, ""))
opts->out_fname = "stdout";
else if (!freopen(opts->out_fname, "w", stdout))
cpp_pfatal_with_name(&parse_in, opts->out_fname);
for (;;)
{
enum cpp_token kind;
if (!opts->no_output)
{
fwrite(parse_in.token_buffer, 1, CPP_WRITTEN(&parse_in), stdout);
}
parse_in.limit = parse_in.token_buffer;
kind = cpp_get_token(&parse_in);
if (kind == CPP_EOF)
break;
}
cpp_finish(&parse_in);
if (parse_in.errors)
exit(FATAL_EXIT_CODE);
exit(SUCCESS_EXIT_CODE);
}