summaryrefslogtreecommitdiff
path: root/src/bin/edje/epp/cppmain.c
blob: 2e8059bf094227659b5bb5c4db3a2cf1ae821493 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* CPP main program, using CPP Library.
 * Copyright (C) 1995 Free Software Foundation, Inc.
 * Written by Per Bothner, 1994-95.
 * Copyright (C) 2003-2011 Kim Woelders
 * 
 * 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, see <http://www.gnu.org/licenses/>.
 * 
 * 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!  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "cpplib.h"

#define EPP_DEBUG 0

cpp_reader          parse_in;
cpp_options         options;

int
main(int argc, char **argv)
{
   char               *p;
   int                 i;
   int                 argi = 1;	/* Next argument to handle. */
   struct cpp_options *opts = &options;
   enum cpp_token      kind;
#if EPP_DEBUG
   int                 got_text = 0;
#endif

   p = argv[0] + strlen(argv[0]);
#ifndef __EMX__
   while (p != argv[0] && p[-1] != '/')
#else
   while (p != argv[0] && p[-1] != '/' && p[-1] != '\\')
#endif
      --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)
      cpp_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 (i = 0;; i++)
     {
	kind = cpp_get_token(&parse_in);
#if EPP_DEBUG
	fprintf(stderr, "%03d: kind=%d len=%d out=%d text=%d\n", i,
		kind, CPP_WRITTEN(&parse_in), !opts->no_output, got_text);
#endif
	switch (kind)
	  {
	  case CPP_EOF:
	     goto done;

	  case CPP_HSPACE:
	     continue;

	  case CPP_VSPACE:
	     break;

	  default:
	  case CPP_OTHER:
	  case CPP_NAME:
	  case CPP_NUMBER:
	  case CPP_CHAR:
	  case CPP_STRING:
	  case CPP_LPAREN:
	  case CPP_RPAREN:
	  case CPP_LBRACE:
	  case CPP_RBRACE:
	  case CPP_COMMA:
	  case CPP_SEMICOLON:
	  case CPP_3DOTS:
#if EPP_DEBUG
             got_text = 1;
#endif
	     continue;

	  case CPP_COMMENT:
	  case CPP_DIRECTIVE:
	  case CPP_POP:
	     continue;
	  }
#if EPP_DEBUG
	fprintf(stderr, "'");
	fwrite(parse_in.token_buffer, 1, CPP_WRITTEN(&parse_in), stderr);
	fprintf(stderr, "'\n");
#endif
	if (!opts->no_output)
	  {
	     size_t n;

	     n = CPP_WRITTEN(&parse_in);
	     if (fwrite(parse_in.token_buffer, 1, n, stdout) != n)
		exit(FATAL_EXIT_CODE);
	  }
	parse_in.limit = parse_in.token_buffer;
#if EPP_DEBUG
        got_text = 0;
#endif
     }

 done:
   cpp_finish(&parse_in);

   if (parse_in.errors)
      exit(FATAL_EXIT_CODE);
   exit(SUCCESS_EXIT_CODE);
}