OSDN Git Service

* builtins.def: Alphabetize.
[pf3gnuchains/gcc-fork.git] / gcc / c-pretty-print.c
index 3fd9f55..7bb4cb0 100644 (file)
@@ -27,6 +27,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "c-pretty-print.h"
 #include "c-tree.h"
 
+/* The pretty-printer code is primarily designed to closely follow
+   (GNU) C and C++ grammars.  That is to be contrasted with spaghetti
+   codes we used to have in the past.  Following a structured
+   approach (preferaably the official grammars) is believed to make it
+   much easier o add extensions and nifty pretty-printing effects that
+   takes expresssion or declaration contexts into account.  */
+
 /* literal  */
 static void pp_c_char (c_pretty_printer, int);
 static void pp_c_character_literal (c_pretty_printer, tree);
@@ -67,10 +74,18 @@ static void pp_c_type_id (c_pretty_printer, tree);
 static void pp_c_storage_class_specifier (c_pretty_printer, tree);
 static void pp_c_function_specifier (c_pretty_printer, tree);
 
+#define pp_buffer(PP) pp_base (PP)->buffer
+#define pp_newline(PP) (pp_newline) (pp_base (PP))
+
 \f
 /* Declarations.  */
 
-/* Print out CV-qualifiers.  Take care of possible extensions.  */
+/* Print out CV-qualifiers.  Take care of possible extensions.
+     cv-qualifier:
+        const
+        volatile
+        restrict
+        __restrict__   */
 void
 pp_c_cv_qualifier (c_pretty_printer ppi, int cv)
 {
@@ -82,6 +97,26 @@ pp_c_cv_qualifier (c_pretty_printer ppi, int cv)
     pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
 }
 
+/*
+  simple-type-specifier:
+     void
+     char
+     short
+     int
+     long
+     float
+     double
+     signed
+     unsigned
+     _Bool                          -- C99
+     _Complex                       -- C99
+     _Imaginary                     -- C99
+     typedef-name.
+
+  GNU extensions.
+  simple-type-specifier:
+      __complex__
+      __vector__   */
 static void
 pp_c_simple_type_specifier (c_pretty_printer ppi, tree t)
 {
@@ -149,6 +184,9 @@ pp_c_simple_type_specifier (c_pretty_printer ppi, tree t)
     }
 }
 
+/* specifier-qualifier-list:
+      type-specifier specifier-qualifier-list-opt
+      cv-qualifier specifier-qualifier-list-opt  */
 static inline void
 pp_c_specifier_qualifier_list (c_pretty_printer ppi, tree t)
 {
@@ -213,9 +251,9 @@ pp_c_init_declarator (c_pretty_printer pp, tree t)
   pp_declarator (pp, t);
   if (DECL_INITIAL (t))
     {
-      pp_whitespace (pp);
+      pp_space (pp);
       pp_equal (pp);
-      pp_whitespace (pp);
+      pp_space (pp);
       pp_c_initializer (pp, DECL_INITIAL (t));
     }
 }
@@ -301,9 +339,9 @@ pp_c_char (c_pretty_printer ppi, int c)
       break;
     default:
       if (ISPRINT (c))
-       pp_character (ppi, c);
+       pp_character (&ppi->base, c);
       else
-       pp_format_scalar (ppi, "\\%03o", (unsigned) c);
+       pp_scalar (ppi, "\\%03o", (unsigned) c);
       break;
     }
 }
@@ -688,6 +726,23 @@ pp_c_expression_list (c_pretty_printer ppi, tree e)
     }
 }
 
+/* unary-expression:
+      postfix-expression
+      ++ cast-expression
+      -- cast-expression
+      unary-operator cast-expression
+      sizeof unary-expression
+      sizeof ( type-id )
+
+  unary-operator: one of
+      * &  + - ! ~
+      
+   GNU extensions.
+   unary-expression:
+      __alignof__ unary-expression
+      __alignof__ ( type-id )
+      __real__ unary-expression
+      __imag__ unary-expression  */
 static void
 pp_c_unary_expression (c_pretty_printer ppi, tree e)
 {
@@ -702,7 +757,6 @@ pp_c_unary_expression (c_pretty_printer ppi, tree e)
 
     case ADDR_EXPR:
     case INDIRECT_REF:
-    case CONVERT_EXPR:
     case NEGATE_EXPR:
     case BIT_NOT_EXPR:
     case TRUTH_NOT_EXPR:
@@ -987,7 +1041,7 @@ pp_c_assignment_expression (c_pretty_printer ppi, tree e)
       pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
       pp_c_maybe_whitespace (ppi);
       pp_equal (ppi);
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
     }
   else
@@ -1183,7 +1237,7 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
 
     case IF_STMT:
       pp_c_identifier (ppi, "if");
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_c_left_paren (ppi);
       pp_c_expression (ppi, IF_COND (stmt));
       pp_right_paren (ppi);
@@ -1207,7 +1261,7 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
     case SWITCH_STMT:
       pp_newline (ppi);
       pp_c_identifier (ppi, "switch");
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_c_left_paren (ppi);
       pp_c_expression (ppi, SWITCH_COND (stmt));
       pp_right_paren (ppi);
@@ -1218,7 +1272,7 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
 
     case WHILE_STMT:
       pp_c_identifier (ppi, "while");
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_c_left_paren (ppi);
       pp_c_expression (ppi, WHILE_COND (stmt));
       pp_right_paren (ppi);
@@ -1233,7 +1287,7 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
       pp_statement (ppi, DO_BODY (stmt));
       pp_newline_and_indent (ppi, -3);
       pp_c_identifier (ppi, "while");
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_c_left_paren (ppi);
       pp_c_expression (ppi, DO_COND (stmt));
       pp_c_right_paren (ppi);
@@ -1243,7 +1297,7 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
 
     case FOR_STMT:
       pp_c_identifier (ppi, "for");
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_c_left_paren (ppi);
       pp_statement (ppi, FOR_INIT_STMT (stmt));
       pp_c_whitespace (ppi);
@@ -1313,20 +1367,20 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
        pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
        if (has_volatile_p)
          pp_c_identifier (ppi, "__volatile__");
-       pp_whitespace (ppi);
+       pp_space (ppi);
        pp_c_left_paren (ppi);
        pp_c_string_literal (ppi, ASM_STRING (stmt));
        if (is_extended)
          {
-           pp_whitespace (ppi);
+           pp_space (ppi);
            pp_separate_with (ppi, ':');
            if (ASM_OUTPUTS (stmt))
              pp_c_expression (ppi, ASM_OUTPUTS (stmt));
-           pp_whitespace (ppi);
+           pp_space (ppi);
            pp_separate_with (ppi, ':');
            if (ASM_INPUTS (stmt))
              pp_c_expression (ppi, ASM_INPUTS (stmt));
-           pp_whitespace (ppi);
+           pp_space (ppi);
            pp_separate_with (ppi, ':');
            if (ASM_CLOBBERS (stmt))
              pp_c_expression (ppi, ASM_CLOBBERS (stmt));
@@ -1338,7 +1392,7 @@ pp_c_statement (c_pretty_printer ppi, tree stmt)
 
     case FILE_STMT:
       pp_c_identifier (ppi, "__FILE__");
-      pp_whitespace (ppi);
+      pp_space (ppi);
       pp_equal (ppi);
       pp_c_whitespace (ppi);
       pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));