OSDN Git Service

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