1 /* CPP main program, using CPP Library.
2 Copyright (C) 1995, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
3 Written by Per Bothner, 1994-95.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 In other words, you are welcome to use, share and improve this program.
20 You are forbidden to forbid anyone else to use, share and improve
21 what you give them. Help stamp out software-hoarding! */
28 /* Encapsulates state used to convert the stream of tokens coming from
29 cpp_get_token back into a text file. */
32 FILE *outf; /* stream to write to. */
33 const char *last_fname; /* previous file name. */
34 const char *syshdr_flags; /* system header flags, if any. */
35 unsigned int lineno; /* line currently being written. */
36 unsigned char printed; /* nonzero if something output at lineno. */
37 unsigned char no_line_dirs; /* nonzero to output no line directives. */
40 int main PARAMS ((int, char **));
41 static void general_init PARAMS ((const char *));
42 static void setup_callbacks PARAMS ((void));
44 /* General output routines. */
45 static void scan_buffer PARAMS ((cpp_reader *));
46 static void check_multiline_token PARAMS ((cpp_string *));
47 static int printer_init PARAMS ((cpp_reader *));
48 static int dump_macro PARAMS ((cpp_reader *, cpp_hashnode *, void *));
50 static void print_line PARAMS ((const char *));
51 static void maybe_print_line PARAMS ((unsigned int));
53 /* Callback routines for the parser. Most of these are active only
55 static void cb_define PARAMS ((cpp_reader *, cpp_hashnode *));
56 static void cb_undef PARAMS ((cpp_reader *, cpp_hashnode *));
57 static void cb_include PARAMS ((cpp_reader *, const unsigned char *,
59 static void cb_ident PARAMS ((cpp_reader *, const cpp_string *));
60 static void cb_file_change PARAMS ((cpp_reader *, const cpp_file_change *));
61 static void cb_def_pragma PARAMS ((cpp_reader *));
62 static void do_pragma_implementation PARAMS ((cpp_reader *));
64 const char *progname; /* Needs to be global. */
65 static cpp_reader *pfile;
66 static struct printer print;
73 int argi = 1; /* Next argument to handle. */
75 general_init (argv[0]);
76 /* Default language is GNU C89. */
77 pfile = cpp_create_reader (CLK_GNUC89);
79 argi += cpp_handle_options (pfile, argc - argi , argv + argi);
80 if (argi < argc && ! CPP_FATAL_ERRORS (pfile))
81 cpp_fatal (pfile, "Invalid option %s", argv[argi]);
82 cpp_post_options (pfile);
83 if (CPP_FATAL_ERRORS (pfile))
84 return (FATAL_EXIT_CODE);
86 /* If cpp_handle_options saw --help or --version on the command
87 line, it will have set pfile->help_only to indicate this. Exit
88 successfully. [The library does not exit itself, because
89 e.g. cc1 needs to print its own --help message at this point.] */
91 return (SUCCESS_EXIT_CODE);
93 /* Open the output now. We must do so even if no_output is on,
94 because there may be other output than from the actual
95 preprocessing (e.g. from -dM). */
96 if (printer_init (pfile))
97 return (FATAL_EXIT_CODE);
101 if (! cpp_start_read (pfile, CPP_OPTION (pfile, in_fname)))
102 return (FATAL_EXIT_CODE);
104 if (CPP_BUFFER (pfile))
106 if (CPP_OPTION (pfile, no_output))
107 cpp_scan_buffer_nooutput (pfile, 1);
112 /* -dM command line option. */
113 if (CPP_OPTION (pfile, dump_macros) == dump_only)
114 cpp_forall_identifiers (pfile, dump_macro, NULL);
119 /* Flush any pending output. */
121 putc ('\n', print.outf);
122 if (ferror (print.outf) || fclose (print.outf))
123 cpp_notice_from_errno (pfile, CPP_OPTION (pfile, out_fname));
126 return (FATAL_EXIT_CODE);
127 return (SUCCESS_EXIT_CODE);
130 /* Store the program name, and set the locale. */
132 general_init (const char *argv0)
134 progname = argv0 + strlen (argv0);
136 while (progname != argv0 && ! IS_DIR_SEPARATOR (progname[-1]))
139 xmalloc_set_program_name (progname);
141 /* LC_CTYPE determines the character set used by the terminal so it has be set
142 to output messages correctly. */
144 #ifdef HAVE_LC_MESSAGES
145 setlocale (LC_CTYPE, "");
146 setlocale (LC_MESSAGES, "");
148 setlocale (LC_ALL, "");
151 (void) bindtextdomain (PACKAGE, localedir);
152 (void) textdomain (PACKAGE);
155 /* Set up the callbacks and register the pragmas we handle. */
160 if (! CPP_OPTION (pfile, no_output))
162 pfile->cb.ident = cb_ident;
163 pfile->cb.def_pragma = cb_def_pragma;
164 if (! CPP_OPTION (pfile, no_line_commands))
165 pfile->cb.file_change = cb_file_change;
168 if (CPP_OPTION (pfile, dump_includes))
169 pfile->cb.include = cb_include;
171 if (CPP_OPTION (pfile, dump_macros) == dump_names
172 || CPP_OPTION (pfile, dump_macros) == dump_definitions)
174 pfile->cb.define = cb_define;
175 pfile->cb.undef = cb_undef;
176 pfile->cb.poison = cb_def_pragma;
179 /* Register one #pragma which needs special handling. */
180 cpp_register_pragma(pfile, 0, "implementation", do_pragma_implementation);
181 cpp_register_pragma(pfile, "GCC", "implementation", do_pragma_implementation);
184 /* Writes out the preprocessed file. Alternates between two tokens,
185 so that we can avoid accidental token pasting. */
190 unsigned int index, line;
191 cpp_token tokens[2], *token;
195 for (index = 0;; index = 1 - index)
197 token = &tokens[index];
198 cpp_get_token (pfile, token);
200 if (token->type == CPP_EOF)
203 line = cpp_get_line (pfile)->output_line;
204 if (print.lineno != line)
206 unsigned int col = cpp_get_line (pfile)->col;
208 /* Supply enough whitespace to put this token in its original
209 column. Don't bother trying to reconstruct tabs; we can't
210 get it right in general, and nothing ought to care. (Yes,
211 some things do care; the fault lies with them.) */
212 maybe_print_line (line);
215 if (token->flags & PREV_WHITE)
218 putc (' ', print.outf);
221 else if (print.printed
222 && ! (token->flags & PREV_WHITE)
223 && CPP_OPTION (pfile, lang) != CLK_ASM
224 && cpp_avoid_paste (pfile, &tokens[1 - index], token))
225 token->flags |= PREV_WHITE;
227 cpp_output_token (token, print.outf);
229 if (token->type == CPP_STRING || token->type == CPP_WSTRING
230 || token->type == CPP_COMMENT)
231 check_multiline_token (&token->val.str);
234 while (cpp_pop_buffer (pfile) != 0);
237 /* Adjust print.lineno for newlines embedded in tokens. */
239 check_multiline_token (str)
244 for (i = 0; i < str->len; i++)
245 if (str->text[i] == '\n')
249 /* Initialize a cpp_printer structure. As a side effect, open the
255 print.last_fname = 0;
258 print.no_line_dirs = CPP_OPTION (pfile, no_line_commands);
260 if (CPP_OPTION (pfile, out_fname) == NULL)
261 CPP_OPTION (pfile, out_fname) = "";
263 if (CPP_OPTION (pfile, out_fname)[0] == '\0')
267 print.outf = fopen (CPP_OPTION (pfile, out_fname), "w");
270 cpp_notice_from_errno (pfile, CPP_OPTION (pfile, out_fname));
277 /* Newline-terminate any output line currently in progress. If
278 appropriate, write the current line number to the output, or pad
279 with newlines so the output line matches the current line. */
281 maybe_print_line (line)
284 /* End the previous line of text (probably only needed until we get
285 multi-line tokens fixed). */
288 putc ('\n', print.outf);
293 if (print.no_line_dirs)
299 /* print.lineno is zero if this is the first token of the file. We
300 handle this specially, so that a first line of "# 1 "foo.c" in
301 file foo.i outputs just the foo.c line, and not a foo.i line. */
302 if (line >= print.lineno && line < print.lineno + 8 && print.lineno)
304 while (line > print.lineno)
306 putc ('\n', print.outf);
318 print_line (special_flags)
319 const char *special_flags;
321 /* End any previous line of text. */
323 putc ('\n', print.outf);
326 fprintf (print.outf, "# %u \"%s\"%s%s\n",
327 print.lineno, print.last_fname, special_flags, print.syshdr_flags);
333 cb_ident (pfile, str)
334 cpp_reader *pfile ATTRIBUTE_UNUSED;
335 const cpp_string * str;
337 maybe_print_line (cpp_get_line (pfile)->output_line);
338 fprintf (print.outf, "#ident \"%.*s\"\n", (int) str->len, str->text);
343 cb_define (pfile, node)
347 if (pfile->done_initializing)
349 maybe_print_line (cpp_get_line (pfile)->output_line);
350 fprintf (print.outf, "#define %s", node->name);
352 /* -dD command line option. */
353 if (CPP_OPTION (pfile, dump_macros) == dump_definitions)
354 fputs ((const char *) cpp_macro_definition (pfile, node), print.outf);
356 putc ('\n', print.outf);
362 cb_undef (pfile, node)
366 if (pfile->done_initializing)
368 maybe_print_line (cpp_get_line (pfile)->output_line);
369 fprintf (print.outf, "#undef %s\n", node->name);
375 cb_include (pfile, dir, header)
376 cpp_reader *pfile ATTRIBUTE_UNUSED;
377 const unsigned char *dir;
378 const cpp_token *header;
380 maybe_print_line (cpp_get_line (pfile)->output_line);
381 fprintf (print.outf, "#%s %s\n", dir, cpp_token_as_text (pfile, header));
386 cb_file_change (pfile, fc)
387 cpp_reader *pfile ATTRIBUTE_UNUSED;
388 const cpp_file_change *fc;
390 /* Bring current file to correct line (except first file). */
391 if (fc->reason == FC_ENTER && fc->from.filename)
392 maybe_print_line (fc->from.lineno);
394 print.last_fname = fc->to.filename;
396 print.syshdr_flags = " 3 4";
398 print.syshdr_flags = " 3";
400 print.syshdr_flags = "";
404 const char *flags = "";
406 print.lineno = fc->to.lineno;
407 if (fc->reason == FC_ENTER)
409 else if (fc->reason == FC_LEAVE)
416 cb_def_pragma (pfile)
419 maybe_print_line (cpp_get_line (pfile)->output_line);
420 fputs ("#pragma ", print.outf);
421 cpp_output_line (pfile, print.outf);
426 do_pragma_implementation (pfile)
429 /* Be quiet about `#pragma implementation' for a file only if it hasn't
430 been included yet. */
433 cpp_start_lookahead (pfile);
434 cpp_get_token (pfile, &token);
435 cpp_stop_lookahead (pfile, 0);
437 /* If it's not a string, pass it through and let the front end complain. */
438 if (token.type == CPP_STRING)
440 /* Make a NUL-terminated copy of the string. */
441 char *filename = alloca (token.val.str.len + 1);
442 memcpy (filename, token.val.str.text, token.val.str.len);
443 filename[token.val.str.len] = '\0';
444 if (cpp_included (pfile, filename))
446 "#pragma GCC implementation for \"%s\" appears after file is included",
449 else if (token.type != CPP_EOF)
451 cpp_error (pfile, "malformed #pragma GCC implementation");
455 /* Output? This is nasty, but we don't have [GCC] implementation in
457 if (pfile->cb.def_pragma)
459 maybe_print_line (cpp_get_line (pfile)->output_line);
460 fputs ("#pragma GCC implementation ", print.outf);
461 cpp_output_line (pfile, print.outf);
466 /* Dump out the hash table. */
468 dump_macro (pfile, node, v)
471 void *v ATTRIBUTE_UNUSED;
473 if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
475 fprintf (print.outf, "#define %s", node->name);
476 fputs ((const char *) cpp_macro_definition (pfile, node), print.outf);
477 putc ('\n', print.outf);