34498ad53d5bc2063f7ad60671fd2dd3768487d8
[gcc.git] / gcc / c-pretty-print.c
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "real.h"
25 #include "c-pretty-print.h"
26 #include "c-tree.h"
27
28 /* literal */
29 static void pp_c_char PARAMS ((c_pretty_printer, int));
30 static void pp_c_character_literal PARAMS ((c_pretty_printer, tree));
31 static void pp_c_bool_literal PARAMS ((c_pretty_printer, tree));
32 static bool pp_c_enumerator PARAMS ((c_pretty_printer, tree));
33 static void pp_c_integer_literal PARAMS ((c_pretty_printer, tree));
34 static void pp_c_real_literal PARAMS ((c_pretty_printer, tree));
35 static void pp_c_string_literal PARAMS ((c_pretty_printer, tree));
36
37 static void pp_c_primary_expression PARAMS ((c_pretty_printer, tree));
38
39 /* postfix-expression */
40 static void pp_c_initializer_list PARAMS ((c_pretty_printer, tree));
41
42 static void pp_c_unary_expression PARAMS ((c_pretty_printer, tree));
43 static void pp_c_multiplicative_expression PARAMS ((c_pretty_printer, tree));
44 static void pp_c_additive_expression PARAMS ((c_pretty_printer, tree));
45 static void pp_c_shift_expression PARAMS ((c_pretty_printer, tree));
46 static void pp_c_relational_expression PARAMS ((c_pretty_printer, tree));
47 static void pp_c_equality_expression PARAMS ((c_pretty_printer, tree));
48 static void pp_c_and_expression PARAMS ((c_pretty_printer, tree));
49 static void pp_c_exclusive_or_expression PARAMS ((c_pretty_printer,
50 tree));
51 static void pp_c_inclusive_or_expression PARAMS ((c_pretty_printer,
52 tree));
53 static void pp_c_logical_and_expression PARAMS ((c_pretty_printer, tree));
54 static void pp_c_conditional_expression PARAMS ((c_pretty_printer, tree));
55 static void pp_c_assignment_expression PARAMS ((c_pretty_printer, tree));
56
57 /* declarations. */
58 static void pp_c_declaration_specifiers PARAMS ((c_pretty_printer, tree));
59 static void pp_c_init_declarator PARAMS ((c_pretty_printer, tree));
60 static void pp_c_declarator PARAMS ((c_pretty_printer, tree));
61 static void pp_c_direct_declarator PARAMS ((c_pretty_printer, tree));
62 static void pp_c_abstract_declarator PARAMS ((c_pretty_printer, tree));
63 static void pp_c_specifier_qualifier_list PARAMS ((c_pretty_printer, tree));
64 static void pp_c_simple_type_specifier PARAMS ((c_pretty_printer, tree));
65 static void pp_c_parameter_declaration PARAMS ((c_pretty_printer, tree));
66 static void pp_c_type_id PARAMS ((c_pretty_printer, tree));
67 static void pp_c_storage_class_specifier PARAMS ((c_pretty_printer, tree));
68 static void pp_c_function_specifier PARAMS ((c_pretty_printer, tree));
69
70 \f
71 /* Declarations. */
72
73 /* Print out CV-qualifiers. Take care of possible extensions. */
74 void
75 pp_c_cv_qualifier (ppi, cv)
76 c_pretty_printer ppi;
77 int cv;
78 {
79 if (cv & TYPE_QUAL_CONST)
80 pp_c_identifier (ppi, "const");
81 if (cv & TYPE_QUAL_VOLATILE)
82 pp_c_identifier (ppi, "volatile");
83 if (cv & TYPE_QUAL_RESTRICT)
84 pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
85 }
86
87 static void
88 pp_c_simple_type_specifier (ppi, t)
89 c_pretty_printer ppi;
90 tree t;
91 {
92 const enum tree_code code = TREE_CODE (t);
93 switch (code)
94 {
95 case ERROR_MARK:
96 pp_c_identifier (ppi, "<type-error>");
97 break;
98
99 #if 0
100 case UNKNOWN_TYPE:
101 pp_c_identifier (ppi, "<unkown-type>");
102 break;
103 #endif
104
105 case IDENTIFIER_NODE:
106 pp_c_tree_identifier (ppi, t);
107 break;
108
109 case VOID_TYPE:
110 case BOOLEAN_TYPE:
111 case CHAR_TYPE:
112 case INTEGER_TYPE:
113 case REAL_TYPE:
114 pp_c_tree_identifier (ppi, DECL_NAME (t));
115 break;
116
117 case COMPLEX_TYPE:
118 case VECTOR_TYPE:
119 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
120 if (code == COMPLEX_TYPE)
121 pp_c_identifier (ppi, flag_isoc99 ? "_Complex" : "__complex__");
122 else if (code == VECTOR_TYPE)
123 pp_c_identifier (ppi, "__vector__");
124 break;
125
126 case TYPE_DECL:
127 if (DECL_NAME (t))
128 pp_c_tree_identifier (ppi, DECL_NAME (t));
129 else
130 pp_c_identifier (ppi, "<typedef-error>");
131 break;
132
133 case UNION_TYPE:
134 case RECORD_TYPE:
135 case ENUMERAL_TYPE:
136 if (code == UNION_TYPE)
137 pp_c_identifier (ppi, "union");
138 else if (code == RECORD_TYPE)
139 pp_c_identifier (ppi, "struct");
140 else if (code == ENUMERAL_TYPE)
141 pp_c_identifier (ppi, "enum");
142 else
143 pp_c_identifier (ppi, "<tag-error>");
144
145 if (TYPE_NAME (t))
146 pp_c_tree_identifier (ppi, TYPE_NAME (t));
147 else
148 pp_c_identifier (ppi, "<anonymous>");
149 break;
150
151 default:
152 pp_unsupported_tree (ppi, t);
153 }
154 }
155
156 static inline void
157 pp_c_specifier_qualifier_list (ppi, t)
158 c_pretty_printer ppi;
159 tree t;
160 {
161 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
162 pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
163 }
164
165 static void
166 pp_c_abstract_declarator (ppi, t)
167 c_pretty_printer ppi;
168 tree t;
169 {
170 pp_unsupported_tree (ppi, t);
171 }
172
173
174 static inline void
175 pp_c_type_id (ppi, t)
176 c_pretty_printer ppi;
177 tree t;
178 {
179 pp_c_specifier_qualifier_list (ppi, t);
180 pp_c_abstract_declarator (ppi, t);
181 }
182
183 static inline void
184 pp_c_storage_class_specifier (pp, t)
185 c_pretty_printer pp;
186 tree t;
187 {
188 if (TREE_CODE (t) == TYPE_DECL)
189 pp_c_identifier (pp, "typedef");
190 else if (DECL_REGISTER (t))
191 pp_c_identifier (pp, "register");
192 }
193
194 static inline void
195 pp_c_function_specifier (pp, t)
196 c_pretty_printer pp;
197 tree t;
198 {
199 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
200 pp_c_identifier (pp, "inline");
201 }
202
203 static inline void
204 pp_c_declaration_specifiers (pp, t)
205 c_pretty_printer pp;
206 tree t;
207 {
208 pp_c_storage_class_specifier (pp, t);
209 pp_c_function_specifier (pp, t);
210 pp_type_specifier (pp, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
211 pp_c_cv_qualifier (pp, TYPE_QUALS (TREE_TYPE (t)));
212 }
213
214 static inline void
215 pp_c_direct_declarator (pp, t)
216 c_pretty_printer pp;
217 tree t;
218 {
219 pp_unsupported_tree (pp, t);
220 }
221
222 static inline void
223 pp_c_declarator (pp, t)
224 c_pretty_printer pp;
225 tree t;
226 {
227 pp_unsupported_tree (pp, t);
228 }
229
230 static inline void
231 pp_c_init_declarator (pp, t)
232 c_pretty_printer pp;
233 tree t;
234 {
235 pp_declarator (pp, t);
236 if (DECL_INITIAL (t))
237 {
238 pp_whitespace (pp);
239 pp_equal (pp);
240 pp_whitespace (pp);
241 pp_c_initializer (pp, DECL_INITIAL (t));
242 }
243 }
244
245 void
246 pp_c_declaration (pp, t)
247 c_pretty_printer pp;
248 tree t;
249 {
250 pp_declaration_specifiers (pp, t);
251 pp_c_init_declarator (pp, t);
252 }
253
254 static void
255 pp_c_parameter_declaration (pp, t)
256 c_pretty_printer pp;
257 tree t;
258 {
259 pp_unsupported_tree (pp, t);
260 }
261
262 \f
263 /* Expressions. */
264
265 /* Print out a c-char. */
266 static void
267 pp_c_char (ppi, c)
268 c_pretty_printer ppi;
269 int c;
270 {
271 switch (c)
272 {
273 case TARGET_NEWLINE:
274 pp_identifier (ppi, "\\n");
275 break;
276 case TARGET_TAB:
277 pp_identifier (ppi, "\\t");
278 break;
279 case TARGET_VT:
280 pp_identifier (ppi, "\\v");
281 break;
282 case TARGET_BS:
283 pp_identifier (ppi, "\\b");
284 break;
285 case TARGET_CR:
286 pp_identifier (ppi, "\\r");
287 break;
288 case TARGET_FF:
289 pp_identifier (ppi, "\\f");
290 break;
291 case TARGET_BELL:
292 pp_identifier (ppi, "\\a");
293 break;
294 case '\\':
295 pp_identifier (ppi, "\\\\");
296 break;
297 case '\'':
298 pp_identifier (ppi, "\\'");
299 break;
300 case '\"':
301 pp_identifier (ppi, "\\\"");
302 break;
303 default:
304 if (ISPRINT (c))
305 pp_character (ppi, c);
306 else
307 pp_format_scalar (ppi, "\\%03o", (unsigned) c);
308 break;
309 }
310 }
311
312 /* Print out a STRING literal. */
313 static inline void
314 pp_c_string_literal (ppi, s)
315 c_pretty_printer ppi;
316 tree s;
317 {
318 const char *p = TREE_STRING_POINTER (s);
319 int n = TREE_STRING_LENGTH (s) - 1;
320 int i;
321 pp_doublequote (ppi);
322 for (i = 0; i < n; ++i)
323 pp_c_char (ppi, p[i]);
324 pp_doublequote (ppi);
325 }
326
327 /* Print out a CHARACTER literal. */
328 static inline void
329 pp_c_character_literal (ppi, c)
330 c_pretty_printer ppi;
331 tree c;
332 {
333 pp_quote (ppi);
334 pp_c_char (ppi, tree_low_cst (c, 0));
335 pp_quote (ppi);
336 }
337
338 /* Print out a BOOLEAN literal. */
339 static inline void
340 pp_c_bool_literal (ppi, b)
341 c_pretty_printer ppi;
342 tree b;
343 {
344 if (b == boolean_false_node || integer_zerop (b))
345 {
346 if (c_language == clk_cplusplus)
347 pp_c_identifier (ppi, "false");
348 else if (c_language == clk_c && flag_isoc99)
349 pp_c_identifier (ppi, "_False");
350 else
351 pp_unsupported_tree (ppi, b);
352 }
353 else if (b == boolean_true_node)
354 {
355 if (c_language == clk_cplusplus)
356 pp_c_identifier (ppi, "true");
357 else if (c_language == clk_c && flag_isoc99)
358 pp_c_identifier (ppi, "_True");
359 else
360 pp_unsupported_tree (ppi, b);
361 }
362 else
363 pp_unsupported_tree (ppi, b);
364 }
365
366 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
367 false; that means the value was obtained by a cast, in which case
368 print out the type-id part of the cast-expression -- the casted value
369 is then printed by pp_c_integer_literal. */
370 static bool
371 pp_c_enumerator (ppi, e)
372 c_pretty_printer ppi;
373 tree e;
374 {
375 tree type = TREE_TYPE (e);
376 tree value;
377
378 /* Find the name of this constant. */
379 for (value = TYPE_VALUES (type);
380 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
381 value = TREE_CHAIN (value))
382 ;
383
384 if (value != NULL_TREE)
385 pp_c_tree_identifier (ppi, TREE_PURPOSE (value));
386 else
387 {
388 /* Value must have been cast. */
389 pp_c_left_paren (ppi);
390 pp_type_id (ppi, type);
391 pp_c_right_paren (ppi);
392 return false;
393 }
394
395 return true;
396 }
397
398 /* Print out an INTEGER constant value. */
399 static void
400 pp_c_integer_literal (ppi, i)
401 c_pretty_printer ppi;
402 tree i;
403 {
404 tree type = TREE_TYPE (i);
405
406 if (type == boolean_type_node)
407 pp_c_bool_literal (ppi, i);
408 else if (type == char_type_node)
409 pp_c_character_literal (ppi, i);
410 else if (TREE_CODE (type) == ENUMERAL_TYPE
411 && pp_c_enumerator (ppi, i))
412 ;
413 else
414 {
415 if (host_integerp (i, 0))
416 pp_wide_integer (ppi, TREE_INT_CST_LOW (i));
417 else
418 {
419 if (tree_int_cst_sgn (i) < 0)
420 {
421 static char format[10]; /* "%x%09999x\0" */
422 if (!format[0])
423 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
424
425 pp_c_char (ppi, '-');
426 i = build_int_2 (-TREE_INT_CST_LOW (i),
427 ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
428 sprintf (pp_buffer (ppi)->digit_buffer, format,
429 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
430 pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
431
432 }
433 }
434 }
435 }
436
437 /* Print out a REAL value. */
438 static inline void
439 pp_c_real_literal (ppi, r)
440 c_pretty_printer ppi;
441 tree r;
442 {
443 REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
444 pp_buffer (ppi)->digit_buffer);
445 pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
446 }
447
448
449 void
450 pp_c_literal (ppi, e)
451 c_pretty_printer ppi;
452 tree e;
453 {
454 switch (TREE_CODE (e))
455 {
456 case INTEGER_CST:
457 pp_c_integer_literal (ppi, e);
458 break;
459
460 case REAL_CST:
461 pp_c_real_literal (ppi, e);
462 break;
463
464 case STRING_CST:
465 pp_c_string_literal (ppi, e);
466 break;
467
468 default:
469 pp_unsupported_tree (ppi, e);
470 break;
471 }
472 }
473
474 /* Pretty-print a C primary-expression. */
475 static void
476 pp_c_primary_expression (ppi, e)
477 c_pretty_printer ppi;
478 tree e;
479 {
480 switch (TREE_CODE (e))
481 {
482 case VAR_DECL:
483 case PARM_DECL:
484 case FIELD_DECL:
485 case CONST_DECL:
486 case FUNCTION_DECL:
487 case LABEL_DECL:
488 e = DECL_NAME (e);
489 /* Fall through. */
490 case IDENTIFIER_NODE:
491 pp_c_tree_identifier (ppi, e);
492 break;
493
494 case ERROR_MARK:
495 pp_c_identifier (ppi, "<erroneous-expression>");
496 break;
497
498 case RESULT_DECL:
499 pp_c_identifier (ppi, "<return-value>");
500 break;
501
502 case INTEGER_CST:
503 case REAL_CST:
504 case STRING_CST:
505 pp_c_literal (ppi, e);
506 break;
507
508 case TARGET_EXPR:
509 pp_c_left_paren (ppi);
510 pp_c_identifier (ppi, "__builtin_memcpy");
511 pp_c_left_paren (ppi);
512 pp_ampersand (ppi);
513 pp_c_primary_expression (ppi, TREE_OPERAND (e, 0));
514 pp_separate_with (ppi, ',');
515 pp_ampersand (ppi);
516 pp_initializer (ppi, TREE_OPERAND (e, 1));
517 if (TREE_OPERAND (e, 2))
518 {
519 pp_separate_with (ppi, ',');
520 pp_c_expression (ppi, TREE_OPERAND (e, 2));
521 }
522 pp_c_right_paren (ppi);
523
524 case STMT_EXPR:
525 pp_c_left_paren (ppi);
526 pp_statement (ppi, STMT_EXPR_STMT (e));
527 pp_c_right_paren (ppi);
528 break;
529
530 default:
531 /* Make sure this call won't cause any infinite loop. */
532 pp_c_left_paren (ppi);
533 pp_c_expression (ppi, e);
534 pp_c_right_paren (ppi);
535 break;
536 }
537 }
538
539 /* Print out a C initializer -- also support C compound-literals. */
540 void
541 pp_c_initializer (ppi, e)
542 c_pretty_printer ppi;
543 tree e;
544 {
545 if (TREE_CODE (e) == CONSTRUCTOR)
546 {
547 enum tree_code code = TREE_CODE (TREE_TYPE (e));
548 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
549 {
550 pp_left_brace (ppi);
551 pp_c_initializer_list (ppi, e);
552 pp_right_brace (ppi);
553 }
554 else
555 pp_unsupported_tree (ppi, TREE_OPERAND (e, 1));
556 }
557 else
558 pp_assignment_expression (ppi, e);
559 }
560
561 static void
562 pp_c_initializer_list (ppi, e)
563 c_pretty_printer ppi;
564 tree e;
565 {
566 tree type = TREE_TYPE (e);
567 const enum tree_code code = TREE_CODE (type);
568
569 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
570 {
571 tree init = TREE_OPERAND (e, 1);
572 for (; init != NULL_TREE; init = TREE_CHAIN (init))
573 {
574 if (code == RECORD_TYPE || code == UNION_TYPE)
575 {
576 pp_dot (ppi);
577 pp_c_primary_expression (ppi, TREE_PURPOSE (init));
578 }
579 else
580 {
581 pp_c_left_bracket (ppi);
582 if (TREE_PURPOSE (init))
583 pp_c_literal (ppi, TREE_PURPOSE (init));
584 pp_c_right_bracket (ppi);
585 }
586 pp_c_whitespace (ppi);
587 pp_equal (ppi);
588 pp_c_whitespace (ppi);
589 pp_initializer (ppi, TREE_VALUE (init));
590 if (TREE_CHAIN (init))
591 pp_separate_with (ppi, ',');
592 }
593 }
594 else
595 pp_unsupported_tree (ppi, type);
596 }
597
598 void
599 pp_c_postfix_expression (ppi, e)
600 c_pretty_printer ppi;
601 tree e;
602 {
603 enum tree_code code = TREE_CODE (e);
604 switch (code)
605 {
606 case POSTINCREMENT_EXPR:
607 case POSTDECREMENT_EXPR:
608 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
609 pp_identifier (ppi, code == POSTINCREMENT_EXPR ? "++" : "--");
610 break;
611
612 case ARROW_EXPR:
613 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
614 pp_arrow (ppi);
615 break;
616
617 case ARRAY_REF:
618 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
619 pp_c_left_bracket (ppi);
620 pp_c_expression (ppi, TREE_OPERAND (e, 1));
621 pp_c_right_bracket (ppi);
622 break;
623
624 case CALL_EXPR:
625 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
626 pp_c_left_paren (ppi);
627 pp_c_expression_list (ppi, TREE_OPERAND (e, 1));
628 pp_c_right_paren (ppi);
629 break;
630
631 case ABS_EXPR:
632 case FFS_EXPR:
633 pp_c_identifier (ppi,
634 code == ABS_EXPR ? "__builtin_abs" : "__builtin_ffs");
635 pp_c_left_paren (ppi);
636 pp_c_expression (ppi, TREE_OPERAND (e, 0));
637 pp_c_right_paren (ppi);
638 break;
639
640 case COMPONENT_REF:
641 {
642 tree object = TREE_OPERAND (e, 0);
643 if (TREE_CODE (object) == INDIRECT_REF)
644 {
645 pp_postfix_expression (ppi, TREE_OPERAND (object, 0));
646 pp_arrow (ppi);
647 }
648 else
649 {
650 pp_postfix_expression (ppi, object);
651 pp_dot (ppi);
652 }
653 pp_c_expression (ppi, TREE_OPERAND (e, 1));
654 }
655 break;
656
657 case COMPLEX_CST:
658 case VECTOR_CST:
659 case COMPLEX_EXPR:
660 pp_c_left_paren (ppi);
661 pp_type_id (ppi, TREE_TYPE (e));
662 pp_c_right_paren (ppi);
663 pp_left_brace (ppi);
664
665 if (code == COMPLEX_CST)
666 {
667 pp_c_expression (ppi, TREE_REALPART (e));
668 pp_separate_with (ppi, ',');
669 pp_c_expression (ppi, TREE_IMAGPART (e));
670 }
671 else if (code == VECTOR_CST)
672 pp_c_expression_list (ppi, TREE_VECTOR_CST_ELTS (e));
673 else if (code == COMPLEX_EXPR)
674 {
675 pp_c_expression (ppi, TREE_OPERAND (e, 0));
676 pp_separate_with (ppi, ',');
677 pp_c_expression (ppi, TREE_OPERAND (e, 1));
678 }
679
680 pp_right_brace (ppi);
681 break;
682
683 case COMPOUND_LITERAL_EXPR:
684 e = DECL_INITIAL (e);
685 /* Fall through. */
686 case CONSTRUCTOR:
687 pp_initializer (ppi, e);
688 break;
689
690 #if 0
691 case SRCLOC:
692 pp_left_paren (ppi);
693 pp_identifier (ppi, "__location__");
694 pp_right_paren (ppi);
695 pp_whitespace (ppi);
696 pp_left_brace (ppi);
697 pp_dot (ppi);
698 pp_identifier (ppi, "file");
699 pp_whitespace (ppi);
700 pp_equal (ppi);
701 pp_c_whitespace (ppi);
702 pp_c_expression (ppi, SRCLOC_FILE (e));
703 pp_separate_with (ppi, ',');
704 pp_dot (ppi);
705 pp_identifier (ppi, "line");
706 pp_whitespace (ppi);
707 pp_equal (ppi);
708 pp_c_whitespace (ppi);
709 pp_c_expression (ppi, SRCLOC_LINE (e));
710 pp_right_brace (ppi);
711 break;
712 #endif
713
714 case VA_ARG_EXPR:
715 pp_c_identifier (ppi, "__builtin_va_arg");
716 pp_c_left_paren (ppi);
717 pp_assignment_expression (ppi, TREE_OPERAND (e, 0));
718 pp_separate_with (ppi, ',');
719 pp_type_id (ppi, TREE_TYPE (e));
720 pp_c_right_paren (ppi);
721 break;
722
723 default:
724 pp_primary_expression (ppi, e);
725 break;
726 }
727 }
728
729 /* Print out an expression-list; E is expected to be a TREE_LIST */
730 void
731 pp_c_expression_list (ppi, e)
732 c_pretty_printer ppi;
733 tree e;
734 {
735 for (; e != NULL_TREE; e = TREE_CHAIN (e))
736 {
737 pp_c_assignment_expression (ppi, TREE_VALUE (e));
738 if (TREE_CHAIN (e))
739 pp_separate_with (ppi, ',');
740 }
741 }
742
743 static void
744 pp_c_unary_expression (ppi, e)
745 c_pretty_printer ppi;
746 tree e;
747 {
748 enum tree_code code = TREE_CODE (e);
749 switch (code)
750 {
751 case PREINCREMENT_EXPR:
752 case PREDECREMENT_EXPR:
753 pp_identifier (ppi, code == PREINCREMENT_EXPR ? "++" : "--");
754 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
755 break;
756
757 case ADDR_EXPR:
758 case INDIRECT_REF:
759 case CONVERT_EXPR:
760 case NEGATE_EXPR:
761 case BIT_NOT_EXPR:
762 case TRUTH_NOT_EXPR:
763 case CONJ_EXPR:
764 if (code == ADDR_EXPR)
765 pp_ampersand (ppi);
766 else if (code == INDIRECT_REF)
767 pp_star (ppi);
768 else if (code == NEGATE_EXPR)
769 pp_minus (ppi);
770 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
771 pp_complement (ppi);
772 else if (code == TRUTH_NOT_EXPR)
773 pp_exclamation (ppi);
774 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
775 break;
776
777 case SIZEOF_EXPR:
778 case ALIGNOF_EXPR:
779 pp_c_identifier (ppi, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
780 pp_c_whitespace (ppi);
781 if (TYPE_P (TREE_OPERAND (e, 0)))
782 {
783 pp_c_left_paren (ppi);
784 pp_type_id (ppi, TREE_OPERAND (e, 0));
785 pp_c_right_paren (ppi);
786 }
787 else
788 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
789 break;
790
791 case REALPART_EXPR:
792 case IMAGPART_EXPR:
793 pp_c_identifier (ppi, code == REALPART_EXPR ? "__real__" : "__imag__");
794 pp_c_whitespace (ppi);
795 pp_unary_expression (ppi, TREE_OPERAND (e, 0));
796 break;
797
798 default:
799 pp_postfix_expression (ppi, e);
800 break;
801 }
802 }
803
804 void
805 pp_c_cast_expression (ppi, e)
806 c_pretty_printer ppi;
807 tree e;
808 {
809 if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
810 {
811 pp_c_left_paren (ppi);
812 pp_type_id (ppi, TREE_TYPE (e));
813 pp_c_right_paren (ppi);
814 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
815 }
816 else
817 pp_unary_expression (ppi, e);
818 }
819
820 static void
821 pp_c_multiplicative_expression (ppi, e)
822 c_pretty_printer ppi;
823 tree e;
824 {
825 enum tree_code code = TREE_CODE (e);
826 switch (code)
827 {
828 case MULT_EXPR:
829 case TRUNC_DIV_EXPR:
830 case TRUNC_MOD_EXPR:
831 pp_c_multiplicative_expression (ppi, TREE_OPERAND (e, 0));
832 pp_c_whitespace (ppi);
833 if (code == MULT_EXPR)
834 pp_star (ppi);
835 else if (code == TRUNC_DIV_EXPR)
836 pp_slash (ppi);
837 else
838 pp_modulo (ppi);
839 pp_c_whitespace (ppi);
840 pp_c_cast_expression (ppi, TREE_OPERAND (e, 1));
841 break;
842
843 default:
844 pp_c_cast_expression (ppi, e);
845 break;
846 }
847 }
848
849 static inline void
850 pp_c_additive_expression (ppi, e)
851 c_pretty_printer ppi;
852 tree e;
853 {
854 enum tree_code code = TREE_CODE (e);
855 switch (code)
856 {
857 case PLUS_EXPR:
858 case MINUS_EXPR:
859 pp_c_additive_expression (ppi, TREE_OPERAND (e, 0));
860 pp_c_whitespace (ppi);
861 if (code == PLUS_EXPR)
862 pp_plus (ppi);
863 else
864 pp_minus (ppi);
865 pp_c_whitespace (ppi);
866 pp_multiplicative_expression (ppi, TREE_OPERAND (e, 1));
867 break;
868
869 default:
870 pp_multiplicative_expression (ppi, e);
871 break;
872 }
873 }
874
875 static inline void
876 pp_c_shift_expression (ppi, e)
877 c_pretty_printer ppi;
878 tree e;
879 {
880 enum tree_code code = TREE_CODE (e);
881 switch (code)
882 {
883 case LSHIFT_EXPR:
884 case RSHIFT_EXPR:
885 pp_c_shift_expression (ppi, TREE_OPERAND (e, 0));
886 pp_c_whitespace (ppi);
887 pp_identifier (ppi, code == LSHIFT_EXPR ? "<<" : ">>");
888 pp_c_whitespace (ppi);
889 pp_c_additive_expression (ppi, TREE_OPERAND (e, 1));
890 break;
891
892 default:
893 pp_c_additive_expression (ppi, e);
894 }
895 }
896
897 static void
898 pp_c_relational_expression (ppi, e)
899 c_pretty_printer ppi;
900 tree e;
901 {
902 enum tree_code code = TREE_CODE (e);
903 switch (code)
904 {
905 case LT_EXPR:
906 case GT_EXPR:
907 case LE_EXPR:
908 case GE_EXPR:
909 pp_c_relational_expression (ppi, TREE_OPERAND (e, 0));
910 pp_c_whitespace (ppi);
911 if (code == LT_EXPR)
912 pp_less (ppi);
913 else if (code == GT_EXPR)
914 pp_greater (ppi);
915 else if (code == LE_EXPR)
916 pp_identifier (ppi, "<=");
917 else if (code == GE_EXPR)
918 pp_identifier (ppi, ">=");
919 pp_c_whitespace (ppi);
920 pp_c_shift_expression (ppi, TREE_OPERAND (e, 1));
921 break;
922
923 default:
924 pp_c_shift_expression (ppi, e);
925 break;
926 }
927 }
928
929 static inline void
930 pp_c_equality_expression (ppi, e)
931 c_pretty_printer ppi;
932 tree e;
933 {
934 enum tree_code code = TREE_CODE (e);
935 switch (code)
936 {
937 case EQ_EXPR:
938 case NE_EXPR:
939 pp_c_equality_expression (ppi, TREE_OPERAND (e, 0));
940 pp_c_maybe_whitespace (ppi);
941 pp_identifier (ppi, code == EQ_EXPR ? "==" : "!=");
942 pp_c_whitespace (ppi);
943 pp_c_relational_expression (ppi, TREE_OPERAND (e, 1));
944 break;
945
946 default:
947 pp_c_relational_expression (ppi, e);
948 break;
949 }
950 }
951
952 static inline void
953 pp_c_and_expression (ppi, e)
954 c_pretty_printer ppi;
955 tree e;
956 {
957 if (TREE_CODE (e) == BIT_AND_EXPR)
958 {
959 pp_c_and_expression (ppi, TREE_OPERAND (e, 0));
960 pp_c_maybe_whitespace (ppi);
961 pp_ampersand (ppi);
962 pp_c_whitespace (ppi);
963 pp_c_equality_expression (ppi, TREE_OPERAND (e, 1));
964 }
965 else
966 pp_c_equality_expression (ppi, e);
967 }
968
969 static inline void
970 pp_c_exclusive_or_expression (ppi, e)
971 c_pretty_printer ppi;
972 tree e;
973 {
974 if (TREE_CODE (e) == BIT_XOR_EXPR)
975 {
976 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
977 pp_c_maybe_whitespace (ppi);
978 pp_carret (ppi);
979 pp_c_whitespace (ppi);
980 pp_c_and_expression (ppi, TREE_OPERAND (e, 1));
981 }
982 else
983 pp_c_and_expression (ppi, e);
984 }
985
986 static inline void
987 pp_c_inclusive_or_expression (ppi, e)
988 c_pretty_printer ppi;
989 tree e;
990 {
991 if (TREE_CODE (e) == BIT_IOR_EXPR)
992 {
993 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
994 pp_c_maybe_whitespace (ppi);
995 pp_bar (ppi);
996 pp_c_whitespace (ppi);
997 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 1));
998 }
999 else
1000 pp_c_exclusive_or_expression (ppi, e);
1001 }
1002
1003 static inline void
1004 pp_c_logical_and_expression (ppi, e)
1005 c_pretty_printer ppi;
1006 tree e;
1007 {
1008 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1009 {
1010 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 0));
1011 pp_c_maybe_whitespace (ppi);
1012 pp_identifier (ppi, "&&");
1013 pp_c_whitespace (ppi);
1014 pp_c_inclusive_or_expression (ppi, TREE_OPERAND (e, 1));
1015 }
1016 else
1017 pp_c_inclusive_or_expression (ppi, e);
1018 }
1019
1020 void
1021 pp_c_logical_or_expression (ppi, e)
1022 c_pretty_printer ppi;
1023 tree e;
1024 {
1025 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1026 {
1027 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1028 pp_c_maybe_whitespace (ppi);
1029 pp_identifier (ppi, "||");
1030 pp_c_whitespace (ppi);
1031 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 1));
1032 }
1033 else
1034 pp_c_logical_and_expression (ppi, e);
1035 }
1036
1037 static void
1038 pp_c_conditional_expression (ppi, e)
1039 c_pretty_printer ppi;
1040 tree e;
1041 {
1042 if (TREE_CODE (e) == COND_EXPR)
1043 {
1044 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1045 pp_c_maybe_whitespace (ppi);
1046 pp_question (ppi);
1047 pp_c_whitespace (ppi);
1048 pp_c_expression (ppi, TREE_OPERAND (e, 1));
1049 pp_c_maybe_whitespace (ppi);
1050 pp_colon (ppi);
1051 pp_c_whitespace (ppi);
1052 pp_c_conditional_expression (ppi, TREE_OPERAND (e, 2));
1053 }
1054 else
1055 pp_c_logical_or_expression (ppi, e);
1056 }
1057
1058
1059 /* Pretty-print a C assignment-expression. */
1060 static void
1061 pp_c_assignment_expression (ppi, e)
1062 c_pretty_printer ppi;
1063 tree e;
1064 {
1065 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1066 {
1067 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
1068 pp_c_maybe_whitespace (ppi);
1069 pp_equal (ppi);
1070 pp_whitespace (ppi);
1071 pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
1072 }
1073 else
1074 pp_c_conditional_expression (ppi, e);
1075 }
1076
1077 /* Pretty-print an expression. */
1078 void
1079 pp_c_expression (ppi, e)
1080 c_pretty_printer ppi;
1081 tree e;
1082 {
1083 switch (TREE_CODE (e))
1084 {
1085 case INTEGER_CST:
1086 pp_c_integer_literal (ppi, e);
1087 break;
1088
1089 case REAL_CST:
1090 pp_c_real_literal (ppi, e);
1091 break;
1092
1093 case STRING_CST:
1094 pp_c_string_literal (ppi, e);
1095 break;
1096
1097 case FUNCTION_DECL:
1098 case VAR_DECL:
1099 case CONST_DECL:
1100 case PARM_DECL:
1101 case RESULT_DECL:
1102 case FIELD_DECL:
1103 case LABEL_DECL:
1104 case ERROR_MARK:
1105 case TARGET_EXPR:
1106 case STMT_EXPR:
1107 pp_c_primary_expression (ppi, e);
1108 break;
1109
1110 case POSTINCREMENT_EXPR:
1111 case POSTDECREMENT_EXPR:
1112 case ARROW_EXPR:
1113 case ARRAY_REF:
1114 case CALL_EXPR:
1115 case COMPONENT_REF:
1116 case COMPLEX_CST:
1117 case VECTOR_CST:
1118 case ABS_EXPR:
1119 case FFS_EXPR:
1120 case CONSTRUCTOR:
1121 case COMPOUND_LITERAL_EXPR:
1122 case COMPLEX_EXPR:
1123 case VA_ARG_EXPR:
1124 pp_c_postfix_expression (ppi, e);
1125 break;
1126
1127 case CONJ_EXPR:
1128 case ADDR_EXPR:
1129 case INDIRECT_REF:
1130 case NEGATE_EXPR:
1131 case BIT_NOT_EXPR:
1132 case TRUTH_NOT_EXPR:
1133 case PREINCREMENT_EXPR:
1134 case PREDECREMENT_EXPR:
1135 case SIZEOF_EXPR:
1136 case ALIGNOF_EXPR:
1137 case REALPART_EXPR:
1138 case IMAGPART_EXPR:
1139 pp_c_unary_expression (ppi, e);
1140 break;
1141
1142 case CONVERT_EXPR:
1143 case FLOAT_EXPR:
1144 pp_c_cast_expression (ppi, e);
1145 break;
1146
1147 case MULT_EXPR:
1148 case TRUNC_MOD_EXPR:
1149 case TRUNC_DIV_EXPR:
1150 pp_c_multiplicative_expression (ppi, e);
1151 break;
1152
1153 case LSHIFT_EXPR:
1154 case RSHIFT_EXPR:
1155 pp_c_shift_expression (ppi, e);
1156 break;
1157
1158 case LT_EXPR:
1159 case GT_EXPR:
1160 case LE_EXPR:
1161 case GE_EXPR:
1162 pp_c_relational_expression (ppi, e);
1163 break;
1164
1165 case BIT_AND_EXPR:
1166 pp_c_and_expression (ppi, e);
1167 break;
1168
1169 case BIT_XOR_EXPR:
1170 pp_c_exclusive_or_expression (ppi, e);
1171 break;
1172
1173 case BIT_IOR_EXPR:
1174 pp_c_inclusive_or_expression (ppi, e);
1175 break;
1176
1177 case TRUTH_ANDIF_EXPR:
1178 pp_c_logical_and_expression (ppi, e);
1179 break;
1180
1181 case TRUTH_ORIF_EXPR:
1182 pp_c_logical_or_expression (ppi, e);
1183 break;
1184
1185 case COND_EXPR:
1186 pp_c_conditional_expression (ppi, e);
1187 break;
1188
1189 case MODIFY_EXPR:
1190 case INIT_EXPR:
1191 pp_c_assignment_expression (ppi, e);
1192 break;
1193
1194 case NOP_EXPR:
1195 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1196 break;
1197
1198 case COMPOUND_EXPR:
1199 pp_c_left_paren (ppi);
1200 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1201 pp_separate_with (ppi, ',');
1202 pp_assignment_expression (ppi, TREE_OPERAND (e, 1));
1203 pp_c_right_paren (ppi);
1204 break;
1205
1206
1207 default:
1208 pp_unsupported_tree (ppi, e);
1209 break;
1210 }
1211 }
1212
1213 \f
1214 /* Statements. */
1215 void
1216 pp_c_statement (ppi, stmt)
1217 c_pretty_printer ppi;
1218 tree stmt;
1219 {
1220 const enum tree_code code = TREE_CODE (stmt);
1221 switch (code)
1222 {
1223 case LABEL_STMT:
1224 case CASE_LABEL:
1225 pp_newline (ppi);
1226 if (code == LABEL_STMT)
1227 pp_tree_identifier (ppi, DECL_NAME (LABEL_STMT_LABEL (stmt)));
1228 else if (code == LABEL_STMT)
1229 {
1230 if (CASE_LOW (stmt) == NULL_TREE)
1231 pp_identifier (ppi, "default");
1232 else
1233 {
1234 pp_c_identifier (ppi, "case");
1235 pp_c_whitespace (ppi);
1236 pp_conditional_expression (ppi, CASE_LOW (stmt));
1237 if (CASE_HIGH (stmt))
1238 {
1239 pp_identifier (ppi, "...");
1240 pp_conditional_expression (ppi, CASE_HIGH (stmt));
1241 }
1242 }
1243 }
1244 pp_colon (ppi);
1245 pp_newline_and_indent (ppi, 3);
1246 break;
1247
1248 case COMPOUND_STMT:
1249 pp_left_brace (ppi);
1250 pp_newline_and_indent (ppi, 3);
1251 for (stmt = COMPOUND_BODY (stmt); stmt; stmt = TREE_CHAIN (stmt))
1252 pp_c_statement (ppi, stmt);
1253 pp_newline_and_indent (ppi, -3);
1254 pp_right_brace (ppi);
1255 pp_newline (ppi);
1256 break;
1257
1258 case EXPR_STMT:
1259 case CLEANUP_STMT:
1260 pp_newline (ppi);
1261 pp_c_expression (ppi, code == EXPR_STMT
1262 ? EXPR_STMT_EXPR (stmt)
1263 : CLEANUP_EXPR (stmt));
1264 pp_semicolon (ppi);
1265 pp_newline (ppi);
1266 break;
1267
1268 case IF_STMT:
1269 pp_c_identifier (ppi, "if");
1270 pp_whitespace (ppi);
1271 pp_c_left_paren (ppi);
1272 pp_c_expression (ppi, IF_COND (stmt));
1273 pp_right_paren (ppi);
1274 pp_newline_and_indent (ppi, 3);
1275 pp_statement (ppi, THEN_CLAUSE (stmt));
1276 pp_newline_and_indent (ppi, -3);
1277 if (ELSE_CLAUSE (stmt))
1278 {
1279 tree else_clause = ELSE_CLAUSE (stmt);
1280 pp_c_identifier (ppi, "else");
1281 if (TREE_CODE (else_clause) == IF_STMT)
1282 pp_c_whitespace (ppi);
1283 else
1284 pp_newline_and_indent (ppi, 3);
1285 pp_statement (ppi, else_clause);
1286 if (TREE_CODE (else_clause) != IF_STMT)
1287 pp_newline_and_indent (ppi, -3);
1288 }
1289 break;
1290
1291 case SWITCH_STMT:
1292 pp_newline (ppi);
1293 pp_c_identifier (ppi, "switch");
1294 pp_whitespace (ppi);
1295 pp_c_left_paren (ppi);
1296 pp_c_expression (ppi, SWITCH_COND (stmt));
1297 pp_right_paren (ppi);
1298 pp_newline_and_indent (ppi, 3);
1299 pp_statement (ppi, SWITCH_BODY (stmt));
1300 pp_newline_and_indent (ppi, -3);
1301 break;
1302
1303 case WHILE_STMT:
1304 pp_c_identifier (ppi, "while");
1305 pp_whitespace (ppi);
1306 pp_c_left_paren (ppi);
1307 pp_c_expression (ppi, WHILE_COND (stmt));
1308 pp_right_paren (ppi);
1309 pp_newline_and_indent (ppi, 3);
1310 pp_statement (ppi, WHILE_BODY (stmt));
1311 pp_newline_and_indent (ppi, -3);
1312 break;
1313
1314 case DO_STMT:
1315 pp_c_identifier (ppi, "do");
1316 pp_newline_and_indent (ppi, 3);
1317 pp_statement (ppi, DO_BODY (stmt));
1318 pp_newline_and_indent (ppi, -3);
1319 pp_c_identifier (ppi, "while");
1320 pp_whitespace (ppi);
1321 pp_c_left_paren (ppi);
1322 pp_c_expression (ppi, DO_COND (stmt));
1323 pp_c_right_paren (ppi);
1324 pp_semicolon (ppi);
1325 pp_newline (ppi);
1326 break;
1327
1328 case FOR_STMT:
1329 pp_c_identifier (ppi, "for");
1330 pp_whitespace (ppi);
1331 pp_c_left_paren (ppi);
1332 pp_statement (ppi, FOR_INIT_STMT (stmt));
1333 pp_c_whitespace (ppi);
1334 if (FOR_COND (stmt))
1335 pp_c_expression (ppi, FOR_COND (stmt));
1336 pp_semicolon (ppi);
1337 pp_c_whitespace (ppi);
1338 if (FOR_EXPR (stmt))
1339 pp_c_expression (ppi, FOR_EXPR (stmt));
1340 pp_right_paren (ppi);
1341 pp_newline_and_indent (ppi, 3);
1342 pp_statement (ppi, FOR_BODY (stmt));
1343 pp_newline_and_indent (ppi, -3);
1344 break;
1345
1346 case BREAK_STMT:
1347 case CONTINUE_STMT:
1348 pp_newline (ppi);
1349 pp_identifier (ppi, code == BREAK_STMT ? "break" : "continue");
1350 pp_semicolon (ppi);
1351 pp_newline (ppi);
1352 break;
1353
1354 case RETURN_STMT:
1355 case GOTO_STMT:
1356 {
1357 tree e = code == RETURN_STMT
1358 ? RETURN_EXPR (stmt)
1359 : GOTO_DESTINATION (stmt);
1360
1361 pp_newline (ppi);
1362 pp_c_identifier (ppi, code == RETURN_STMT ? "return" : "goto");
1363 if (e)
1364 pp_c_expression (ppi, e);
1365 pp_semicolon (ppi);
1366 pp_newline (ppi);
1367 }
1368 break;
1369
1370 case SCOPE_STMT:
1371 if (!SCOPE_NULLIFIED_P (stmt) && SCOPE_NO_CLEANUPS_P (stmt))
1372 {
1373 if (SCOPE_BEGIN_P (stmt))
1374 {
1375 pp_left_brace (ppi);
1376 pp_newline_and_indent (ppi, 3);
1377 }
1378 else if (SCOPE_END_P (stmt))
1379 {
1380 pp_right_brace (ppi);
1381 pp_newline_and_indent (ppi, -3);
1382 }
1383 }
1384 break;
1385
1386 case DECL_STMT:
1387 pp_declaration (ppi, DECL_STMT_DECL (stmt));
1388 pp_semicolon (ppi);
1389 pp_newline (ppi);
1390 break;
1391
1392 case ASM_STMT:
1393 {
1394 bool has_volatile_p = ASM_VOLATILE_P (stmt);
1395 bool is_extended = has_volatile_p || ASM_INPUTS (stmt)
1396 || ASM_OUTPUTS (stmt) || ASM_CLOBBERS (stmt);
1397 pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
1398 if (has_volatile_p)
1399 pp_c_identifier (ppi, "__volatile__");
1400 pp_whitespace (ppi);
1401 pp_c_left_paren (ppi);
1402 pp_c_string_literal (ppi, ASM_STRING (stmt));
1403 if (is_extended)
1404 {
1405 pp_whitespace (ppi);
1406 pp_separate_with (ppi, ':');
1407 if (ASM_OUTPUTS (stmt))
1408 pp_c_expression (ppi, ASM_OUTPUTS (stmt));
1409 pp_whitespace (ppi);
1410 pp_separate_with (ppi, ':');
1411 if (ASM_INPUTS (stmt))
1412 pp_c_expression (ppi, ASM_INPUTS (stmt));
1413 pp_whitespace (ppi);
1414 pp_separate_with (ppi, ':');
1415 if (ASM_CLOBBERS (stmt))
1416 pp_c_expression (ppi, ASM_CLOBBERS (stmt));
1417 }
1418 pp_right_paren (ppi);
1419 pp_newline (ppi);
1420 }
1421 break;
1422
1423 case FILE_STMT:
1424 pp_c_identifier (ppi, "__FILE__");
1425 pp_whitespace (ppi);
1426 pp_equal (ppi);
1427 pp_c_whitespace (ppi);
1428 pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));
1429 pp_semicolon (ppi);
1430 pp_newline (ppi);
1431 break;
1432
1433 default:
1434 pp_unsupported_tree (ppi, stmt);
1435 }
1436
1437 }
1438
1439 \f
1440 /* Initialize the PRETTY-PRINTER for handling C codes. */
1441 void
1442 pp_c_pretty_printer_init (pp)
1443 c_pretty_printer pp;
1444 {
1445 pp->offset_list = 0;
1446
1447 pp->declaration = pp_c_declaration;
1448 pp->declaration_specifiers = pp_c_declaration_specifiers;
1449 pp->type_specifier = pp_c_simple_type_specifier;
1450 pp->declarator = pp_c_declarator;
1451 pp->direct_declarator = pp_c_direct_declarator;
1452 pp->parameter_declaration = pp_c_parameter_declaration;
1453 pp->type_id = pp_c_type_id;
1454
1455 pp->statement = pp_c_statement;
1456
1457 pp->primary_expression = pp_c_primary_expression;
1458 pp->postfix_expression = pp_c_postfix_expression;
1459 pp->unary_expression = pp_c_unary_expression;
1460 pp->initializer = pp_c_initializer;
1461 pp->multiplicative_expression = pp_c_multiplicative_expression;
1462 pp->conditional_expression = pp_c_conditional_expression;
1463 pp->assignment_expression = pp_c_assignment_expression;
1464 }