1 /* CPP main program, using CPP Library.
2 Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Written by Per Bothner, 1994-95.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 In other words, you are welcome to use, share and improve this program.
21 You are forbidden to forbid anyone else to use, share and improve
22 what you give them. Help stamp out software-hoarding! */
29 /* Encapsulates state used to convert the stream of tokens coming from
30 cpp_get_token back into a text file. */
33 FILE *outf
; /* Stream to write to. */
34 const struct line_map
*map
; /* Logical to physical line mappings. */
35 unsigned int line
; /* Line currently being written. */
36 unsigned char printed
; /* Nonzero if something output at line. */
39 int main
PARAMS ((int, char **));
40 static void general_init
PARAMS ((const char *));
41 static void do_preprocessing
PARAMS ((int, char **));
42 static void setup_callbacks
PARAMS ((void));
44 /* General output routines. */
45 static void scan_translation_unit
PARAMS ((cpp_reader
*));
46 static void check_multiline_token
PARAMS ((cpp_string
*));
47 static int dump_macro
PARAMS ((cpp_reader
*, cpp_hashnode
*, void *));
49 static void print_line
PARAMS ((const struct line_map
*, unsigned int,
51 static void maybe_print_line
PARAMS ((const struct line_map
*, unsigned int));
53 /* Callback routines for the parser. Most of these are active only
55 static void cb_define
PARAMS ((cpp_reader
*, unsigned int, cpp_hashnode
*));
56 static void cb_undef
PARAMS ((cpp_reader
*, unsigned int, cpp_hashnode
*));
57 static void cb_include
PARAMS ((cpp_reader
*, unsigned int,
58 const unsigned char *, const cpp_token
*));
59 static void cb_ident
PARAMS ((cpp_reader
*, unsigned int,
61 static void cb_file_change
PARAMS ((cpp_reader
*, const struct line_map
*));
62 static void cb_def_pragma
PARAMS ((cpp_reader
*, unsigned int));
64 const char *progname
; /* Needs to be global. */
65 static cpp_reader
*pfile
; /* An opaque handle. */
66 static cpp_options
*options
; /* Options of pfile. */
67 static struct printer print
;
74 general_init (argv
[0]);
76 /* Contruct a reader with default language GNU C89. */
77 pfile
= cpp_create_reader (NULL
, CLK_GNUC89
);
78 options
= cpp_get_options (pfile
);
80 do_preprocessing (argc
, argv
);
82 if (cpp_destroy (pfile
))
83 return FATAL_EXIT_CODE
;
85 return SUCCESS_EXIT_CODE
;
88 /* Store the program name, and set the locale. */
93 progname
= argv0
+ strlen (argv0
);
95 while (progname
!= argv0
&& ! IS_DIR_SEPARATOR (progname
[-1]))
98 xmalloc_set_program_name (progname
);
100 /* LC_CTYPE determines the character set used by the terminal so it
101 has to be set to output messages correctly. */
103 #ifdef HAVE_LC_MESSAGES
104 setlocale (LC_CTYPE
, "");
105 setlocale (LC_MESSAGES
, "");
107 setlocale (LC_ALL
, "");
110 (void) bindtextdomain (PACKAGE
, localedir
);
111 (void) textdomain (PACKAGE
);
114 /* Handle switches, preprocess and output. */
116 do_preprocessing (argc
, argv
)
120 int argi
= 1; /* Next argument to handle. */
122 argi
+= cpp_handle_options (pfile
, argc
- argi
, argv
+ argi
);
123 if (CPP_FATAL_ERRORS (pfile
))
127 cpp_fatal (pfile
, "Invalid option %s", argv
[argi
]);
129 cpp_post_options (pfile
);
131 if (CPP_FATAL_ERRORS (pfile
))
134 /* If cpp_handle_options saw --help or --version on the command
135 line, it will have set pfile->help_only to indicate this. Exit
136 successfully. [The library does not exit itself, because
137 e.g. cc1 needs to print its own --help message at this point.] */
138 if (options
->help_only
)
141 /* Initialize the printer structure. Setting print.line to -1 here
142 is a trick to guarantee that the first token of the file will
143 cause a linemarker to be output by maybe_print_line. */
144 print
.line
= (unsigned int) -1;
148 /* Open the output now. We must do so even if no_output is on,
149 because there may be other output than from the actual
150 preprocessing (e.g. from -dM). */
151 if (options
->out_fname
[0] == '\0')
155 print
.outf
= fopen (options
->out_fname
, "w");
156 if (print
.outf
== NULL
)
158 cpp_notice_from_errno (pfile
, options
->out_fname
);
165 if (cpp_start_read (pfile
, options
->in_fname
))
167 /* A successful cpp_start_read guarantees that we can call
168 cpp_scan_nooutput or cpp_get_token next. */
169 if (options
->no_output
)
170 cpp_scan_nooutput (pfile
);
172 scan_translation_unit (pfile
);
174 /* -dM command line option. Should this be in cpp_finish? */
175 if (options
->dump_macros
== dump_only
)
176 cpp_forall_identifiers (pfile
, dump_macro
, NULL
);
181 /* Flush any pending output. */
183 putc ('\n', print
.outf
);
185 if (ferror (print
.outf
) || fclose (print
.outf
))
186 cpp_notice_from_errno (pfile
, options
->out_fname
);
189 /* Set up the callbacks as appropriate. */
193 cpp_callbacks
*cb
= cpp_get_callbacks (pfile
);
195 if (! options
->no_output
)
197 cb
->ident
= cb_ident
;
198 cb
->def_pragma
= cb_def_pragma
;
199 if (! options
->no_line_commands
)
200 cb
->file_change
= cb_file_change
;
203 if (options
->dump_includes
)
204 cb
->include
= cb_include
;
206 if (options
->dump_macros
== dump_names
207 || options
->dump_macros
== dump_definitions
)
209 cb
->define
= cb_define
;
210 cb
->undef
= cb_undef
;
214 /* Writes out the preprocessed file. Alternates between two tokens,
215 so that we can avoid accidental token pasting. */
217 scan_translation_unit (pfile
)
220 unsigned int index
, line
;
221 cpp_token tokens
[2], *token
;
223 for (index
= 0;; index
= 1 - index
)
225 token
= &tokens
[index
];
226 cpp_get_token (pfile
, token
);
228 if (token
->type
== CPP_EOF
)
231 line
= cpp_get_line (pfile
)->output_line
;
232 if (print
.line
!= line
)
234 unsigned int col
= cpp_get_line (pfile
)->col
;
236 /* Supply enough whitespace to put this token in its original
237 column. Don't bother trying to reconstruct tabs; we can't
238 get it right in general, and nothing ought to care. (Yes,
239 some things do care; the fault lies with them.) */
240 maybe_print_line (print
.map
, line
);
243 if (token
->flags
& PREV_WHITE
)
246 putc (' ', print
.outf
);
249 else if ((token
->flags
& (PREV_WHITE
| AVOID_LPASTE
))
251 && cpp_avoid_paste (pfile
, &tokens
[1 - index
], token
))
252 token
->flags
|= PREV_WHITE
;
253 /* Special case '# <directive name>': insert a space between
254 the # and the token. This will prevent it from being
255 treated as a directive when this code is re-preprocessed.
256 XXX Should do this only at the beginning of a line, but how? */
257 else if (token
->type
== CPP_NAME
&& token
->val
.node
->directive_index
258 && tokens
[1 - index
].type
== CPP_HASH
)
259 token
->flags
|= PREV_WHITE
;
261 cpp_output_token (token
, print
.outf
);
263 if (token
->type
== CPP_STRING
|| token
->type
== CPP_WSTRING
264 || token
->type
== CPP_COMMENT
)
265 check_multiline_token (&token
->val
.str
);
269 /* Adjust print.line for newlines embedded in tokens. */
271 check_multiline_token (str
)
276 for (i
= 0; i
< str
->len
; i
++)
277 if (str
->text
[i
] == '\n')
281 /* If the token read on logical line LINE needs to be output on a
282 different line to the current one, output the required newlines or
283 a line marker, and return 1. Otherwise return 0. */
286 maybe_print_line (map
, line
)
287 const struct line_map
*map
;
290 /* End the previous line of text. */
293 putc ('\n', print
.outf
);
298 if (line
>= print
.line
&& line
< print
.line
+ 8)
300 while (line
> print
.line
)
302 putc ('\n', print
.outf
);
307 print_line (map
, line
, "");
310 /* Output a line marker for logical line LINE. Special flags are "1"
311 or "2" indicating entering or leaving a file. */
313 print_line (map
, line
, special_flags
)
314 const struct line_map
*map
;
316 const char *special_flags
;
318 /* End any previous line of text. */
320 putc ('\n', print
.outf
);
324 if (! options
->no_line_commands
)
326 fprintf (print
.outf
, "# %u \"%s\"%s",
327 SOURCE_LINE (map
, print
.line
), map
->to_file
, special_flags
);
330 fputs (" 3 4", print
.outf
);
331 else if (map
->sysp
== 1)
332 fputs (" 3", print
.outf
);
334 putc ('\n', print
.outf
);
341 cb_ident (pfile
, line
, str
)
342 cpp_reader
*pfile ATTRIBUTE_UNUSED
;
344 const cpp_string
* str
;
346 maybe_print_line (print
.map
, line
);
347 fprintf (print
.outf
, "#ident \"%s\"\n", str
->text
);
352 cb_define (pfile
, line
, node
)
357 maybe_print_line (print
.map
, line
);
358 fputs ("#define ", print
.outf
);
360 /* -dD command line option. */
361 if (options
->dump_macros
== dump_definitions
)
362 fputs ((const char *) cpp_macro_definition (pfile
, node
), print
.outf
);
364 fputs ((const char *) NODE_NAME (node
), print
.outf
);
366 putc ('\n', print
.outf
);
371 cb_undef (pfile
, line
, node
)
372 cpp_reader
*pfile ATTRIBUTE_UNUSED
;
376 maybe_print_line (print
.map
, line
);
377 fprintf (print
.outf
, "#undef %s\n", NODE_NAME (node
));
382 cb_include (pfile
, line
, dir
, header
)
385 const unsigned char *dir
;
386 const cpp_token
*header
;
388 maybe_print_line (print
.map
, line
);
389 fprintf (print
.outf
, "#%s %s\n", dir
, cpp_token_as_text (pfile
, header
));
393 /* The file name, line number or system header flags have changed, as
394 described in MAP. From this point on, the old print.map might be
395 pointing to freed memory, and so must not be dereferenced. */
398 cb_file_change (pfile
, map
)
399 cpp_reader
*pfile ATTRIBUTE_UNUSED
;
400 const struct line_map
*map
;
402 /* Not first time? */
405 const char *flags
= "";
407 /* Bring current file to correct line when entering a new file. */
408 if (map
->reason
== LC_ENTER
)
409 maybe_print_line (map
- 1, map
->from_line
- 1);
411 if (map
->reason
== LC_ENTER
)
413 else if (map
->reason
== LC_LEAVE
)
416 print_line (map
, map
->from_line
, flags
);
422 /* Copy a #pragma directive to the preprocessed output. */
424 cb_def_pragma (pfile
, line
)
428 maybe_print_line (print
.map
, line
);
429 fputs ("#pragma ", print
.outf
);
430 cpp_output_line (pfile
, print
.outf
);
434 /* Dump out the hash table. */
436 dump_macro (pfile
, node
, v
)
439 void *v ATTRIBUTE_UNUSED
;
441 if (node
->type
== NT_MACRO
&& !(node
->flags
& NODE_BUILTIN
))
443 fputs ("#define ", print
.outf
);
444 fputs ((const char *) cpp_macro_definition (pfile
, node
), print
.outf
);
445 putc ('\n', print
.outf
);