#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);
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)
{
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)
{
}
}
+/* 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)
{
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));
}
}
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;
}
}
}
}
+/* 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)
{
case ADDR_EXPR:
case INDIRECT_REF:
- case CONVERT_EXPR:
case NEGATE_EXPR:
case BIT_NOT_EXPR:
case TRUTH_NOT_EXPR:
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
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);
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);
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);
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);
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);
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));
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));