This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH to c-pretty-print.[ch] (3)


This adds support for statement pretty-printing.

Bootstrapped and tested on an i686-pc-linux.

-- Gaby

  2002-07-30  Gabriel Dos Reis  <gdr@nerim.net>
  
 	* c-pretty-print.h (pp_c_statement): Declare.
  	* c-pretty-print.c (pp_c_postfix_expression): #if 0 support for SRCLOC.
 	(pp_c_statement): Define.
  
Index: c-pretty-print.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/c-pretty-print.c,v
retrieving revision 1.4
diff -p -r1.4 c-pretty-print.c
*** c-pretty-print.c	30 Jul 2002 06:34:57 -0000	1.4
--- c-pretty-print.c	30 Jul 2002 13:40:36 -0000
*************** pp_c_cv_qualifier (ppi, cv)
*** 71,79 ****
  }
  
  
- /* Statements.  */
- 
- 
  /* Expressions.  */
  
  /* Print out a c-char.  */
--- 71,76 ----
*************** pp_c_postfix_expression (ppi, e)
*** 501,506 ****
--- 498,527 ----
        pp_initializer (ppi, e);
        break;
        
+ #if 0
+     case SRCLOC:
+       pp_left_paren (ppi);
+       pp_identifier (ppi, "__location__");
+       pp_right_paren (ppi);
+       pp_whitespace (ppi);
+       pp_left_brace (ppi);
+       pp_dot (ppi);
+       pp_identifier (ppi, "file");
+       pp_whitespace (ppi);
+       pp_equal (ppi);
+       pp_c_whitespace (ppi);
+       pp_c_expression (ppi, SRCLOC_FILE (e));
+       pp_separate_with (ppi, ',');
+       pp_dot (ppi);
+       pp_identifier (ppi, "line");
+       pp_whitespace (ppi);
+       pp_equal (ppi);
+       pp_c_whitespace (ppi);
+       pp_c_expression (ppi, SRCLOC_LINE (e));
+       pp_right_brace (ppi);
+       break;
+ #endif
+ 
      case VA_ARG_EXPR:
        pp_c_identifier (ppi, "__builtin_va_arg");
        pp_c_left_paren (ppi);
*************** pp_c_postfix_expression (ppi, e)
*** 516,522 ****
      }
  }
  
! /* Print out an expession-list; E is expected to be a TREE_LIST  */
  void
  pp_c_expression_list (ppi, e)
       c_pretty_print_info *ppi;
--- 537,543 ----
      }
  }
  
! /* Print out an expression-list; E is expected to be a TREE_LIST  */
  void
  pp_c_expression_list (ppi, e)
       c_pretty_print_info *ppi;
*************** pp_c_expression (ppi, e)
*** 998,1002 ****
--- 1019,1249 ----
        pp_unsupported_tree (ppi, e);
        break;
      }
+ }
+ 
+ 
+ /* Statements.  */
+ void
+ pp_c_statement (ppi, stmt)
+      c_pretty_print_info *ppi;
+      tree stmt;
+ {
+   const enum tree_code code = TREE_CODE (stmt);
+   switch (code)
+     {
+     case LABEL_STMT:
+     case CASE_LABEL:
+       pp_newline (ppi);
+       if (code == LABEL_STMT)
+ 	pp_tree_identifier (ppi, DECL_NAME (LABEL_STMT_LABEL (stmt)));
+       else if (code == LABEL_STMT)
+ 	{
+ 	  if (CASE_LOW (stmt) == NULL_TREE)
+ 	    pp_identifier (ppi, "default");
+ 	  else
+ 	    {
+ 	      pp_c_identifier (ppi, "case");
+ 	      pp_c_whitespace (ppi);
+ 	      pp_conditional_expression (ppi, CASE_LOW (stmt));
+ 	      if (CASE_HIGH (stmt))
+ 		{
+ 		  pp_identifier (ppi, "...");
+ 		  pp_conditional_expression (ppi, CASE_HIGH (stmt));
+ 		}
+ 	    }
+ 	}
+       pp_colon (ppi);
+       pp_newline_and_indent (ppi, 3);
+       break;
+ 
+     case COMPOUND_STMT:
+       pp_left_brace (ppi);
+       pp_newline_and_indent (ppi, 3);
+       for (stmt = COMPOUND_BODY (stmt); stmt; stmt = TREE_CHAIN (stmt))
+ 	pp_c_statement (ppi, stmt);
+       pp_newline_and_indent (ppi, -3);
+       pp_right_brace (ppi);
+       pp_newline (ppi);
+       break;
+ 
+     case EXPR_STMT:
+     case CLEANUP_STMT:
+       pp_newline (ppi);
+       pp_c_expression (ppi, code == EXPR_STMT 
+ 		       ? EXPR_STMT_EXPR (stmt)
+ 		       : CLEANUP_EXPR (stmt));
+       pp_semicolon (ppi);
+       pp_newline (ppi);
+       break;
+ 
+     case IF_STMT:
+       pp_c_identifier (ppi, "if");
+       pp_whitespace (ppi);
+       pp_c_left_paren (ppi);
+       pp_c_expression (ppi, IF_COND (stmt));
+       pp_right_paren (ppi);
+       pp_newline_and_indent (ppi, 3);
+       pp_statement (ppi, THEN_CLAUSE (stmt));
+       pp_newline_and_indent (ppi, -3);
+       if (ELSE_CLAUSE (stmt))
+ 	{
+ 	  tree else_clause = ELSE_CLAUSE (stmt);
+ 	  pp_c_identifier (ppi, "else");
+ 	  if (TREE_CODE (else_clause) == IF_STMT)
+ 	    pp_c_whitespace (ppi);
+ 	  else
+ 	    pp_newline_and_indent (ppi, 3);
+ 	  pp_statement (ppi, else_clause);
+ 	  if (TREE_CODE (else_clause) != IF_STMT)
+ 	    pp_newline_and_indent (ppi, -3);
+ 	}
+       break;
+ 
+     case SWITCH_STMT:
+       pp_newline (ppi);
+       pp_c_identifier (ppi, "switch");
+       pp_whitespace (ppi);
+       pp_c_left_paren (ppi);
+       pp_c_expression (ppi, SWITCH_COND (stmt));
+       pp_right_paren (ppi);
+       pp_newline_and_indent (ppi, 3);
+       pp_statement (ppi, SWITCH_BODY (stmt));
+       pp_newline_and_indent (ppi, -3);
+       break;
+ 
+     case WHILE_STMT:
+       pp_c_identifier (ppi, "while");
+       pp_whitespace (ppi);
+       pp_c_left_paren (ppi);
+       pp_c_expression (ppi, WHILE_COND (stmt));
+       pp_right_paren (ppi);
+       pp_newline_and_indent (ppi, 3);
+       pp_statement (ppi, WHILE_BODY (stmt));
+       pp_newline_and_indent (ppi, -3);
+       break;
+ 
+     case DO_STMT:
+       pp_c_identifier (ppi, "do");
+       pp_newline_and_indent (ppi, 3);
+       pp_statement (ppi, DO_BODY (stmt));
+       pp_newline_and_indent (ppi, -3);
+       pp_c_identifier (ppi, "while");
+       pp_whitespace (ppi);
+       pp_c_left_paren (ppi);
+       pp_c_expression (ppi, DO_COND (stmt));
+       pp_c_right_paren (ppi);
+       pp_semicolon (ppi);
+       pp_newline (ppi);
+       break;
+ 
+     case FOR_STMT:
+       pp_c_identifier (ppi, "for");
+       pp_whitespace (ppi);
+       pp_c_left_paren (ppi);
+       pp_statement (ppi, FOR_INIT_STMT (stmt));
+       pp_c_whitespace (ppi);
+       if (FOR_COND (stmt))
+ 	pp_c_expression (ppi, FOR_COND (stmt));
+       pp_semicolon (ppi);
+       pp_c_whitespace (ppi);
+       if (FOR_EXPR (stmt))
+ 	pp_c_expression (ppi, FOR_EXPR (stmt));
+       pp_right_paren (ppi);
+       pp_newline_and_indent (ppi, 3);
+       pp_statement (ppi, FOR_BODY (stmt));
+       pp_newline_and_indent (ppi, -3);
+       break;
+       
+     case BREAK_STMT:
+     case CONTINUE_STMT:
+       pp_newline (ppi);
+       pp_identifier (ppi, code == BREAK_STMT ? "break" : "continue");
+       pp_semicolon (ppi);
+       pp_newline (ppi);
+       break;
+ 
+     case RETURN_STMT:
+     case GOTO_STMT:
+       {
+ 	tree e = code == RETURN_STMT 
+ 	  ? RETURN_EXPR (stmt)
+ 	  : GOTO_DESTINATION (stmt);
+ 
+ 	pp_newline (ppi);
+ 	pp_c_identifier (ppi, code == RETURN_STMT ? "return" : "goto");
+ 	if (e)
+ 	  pp_c_expression (ppi, e);
+ 	pp_semicolon (ppi);
+ 	pp_newline (ppi);
+       }
+       break;
+ 
+     case SCOPE_STMT:
+       if (!SCOPE_NULLIFIED_P (stmt) && SCOPE_NO_CLEANUPS_P (stmt))
+ 	{
+ 	  if (SCOPE_BEGIN_P (stmt))
+ 	    {
+ 	      pp_left_brace (ppi);
+ 	      pp_newline_and_indent (ppi, 3);
+ 	    }
+ 	  else if (SCOPE_END_P (stmt))
+ 	    {
+ 	      pp_right_brace (ppi);
+ 	      pp_newline_and_indent (ppi, -3);
+ 	    }
+ 	}
+       break;
+ 
+     case DECL_STMT:
+       pp_declaration (ppi, DECL_STMT_DECL (stmt));
+       pp_semicolon (ppi);
+       pp_newline (ppi);
+       break;
+ 
+     case ASM_STMT:
+       {
+ 	bool has_volatile_p = ASM_VOLATILE_P (stmt);
+ 	bool is_extended = has_volatile_p || ASM_INPUTS (stmt) 
+ 	  || ASM_OUTPUTS (stmt) || ASM_CLOBBERS (stmt);
+ 	pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
+ 	if (has_volatile_p)
+ 	  pp_c_identifier (ppi, "__volatile__");
+ 	pp_whitespace (ppi);
+ 	pp_c_left_paren (ppi);
+ 	pp_c_string_literal (ppi, ASM_STRING (stmt));
+ 	if (is_extended)
+ 	  {
+ 	    pp_whitespace (ppi);
+ 	    pp_separate_with (ppi, ':');
+ 	    if (ASM_OUTPUTS (stmt))
+ 	      pp_c_expression (ppi, ASM_OUTPUTS (stmt));
+ 	    pp_whitespace (ppi);
+ 	    pp_separate_with (ppi, ':');
+ 	    if (ASM_INPUTS (stmt))
+ 	      pp_c_expression (ppi, ASM_INPUTS (stmt));
+ 	    pp_whitespace (ppi);
+ 	    pp_separate_with (ppi, ':');
+ 	    if (ASM_CLOBBERS (stmt))
+ 	      pp_c_expression (ppi, ASM_CLOBBERS (stmt));
+ 	  }
+ 	pp_right_paren (ppi);
+ 	pp_newline (ppi);
+       }
+       break;
+ 
+     case FILE_STMT:
+       pp_c_identifier (ppi, "__FILE__");
+       pp_whitespace (ppi);
+       pp_equal (ppi);
+       pp_c_whitespace (ppi);
+       pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));
+       pp_semicolon (ppi);
+       pp_newline (ppi);
+       break;
+ 
+     default:
+       pp_unsupported_tree (ppi, stmt);
+     }
+ 
  }
  
Index: c-pretty-print.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/c-pretty-print.h,v
retrieving revision 1.2
diff -p -r1.2 c-pretty-print.h
*** c-pretty-print.h	29 Jul 2002 23:42:26 -0000	1.2
--- c-pretty-print.h	30 Jul 2002 13:40:36 -0000
*************** struct c_pretty_print_info
*** 119,126 ****
  #define pp_initializer(PPI, E)            (*(PPI)->initializer) (PPI, E)
  #define pp_multiplicative_expression(PPI, E)\
     (*(PPI)->multiplicative_expression) (PPI, E)
! #define pp_conditional_expession(PPI, E)  \
!    (*(PPI)->conditional_expression (PPI, E))
  #define pp_assignment_expression(PPI, E)  \
     (*(PPI)->assignment_expression) (PPI, E)
  
--- 119,126 ----
  #define pp_initializer(PPI, E)            (*(PPI)->initializer) (PPI, E)
  #define pp_multiplicative_expression(PPI, E)\
     (*(PPI)->multiplicative_expression) (PPI, E)
! #define pp_conditional_expression(PPI, E)  \
!    (*(PPI)->conditional_expression) (PPI, E)
  #define pp_assignment_expression(PPI, E)  \
     (*(PPI)->assignment_expression) (PPI, E)
  
*************** void pp_c_parameter_declaration_clause P
*** 131,137 ****
  void pp_c_declaration PARAMS ((c_pretty_print_info *, tree));
  void pp_c_statement PARAMS ((c_pretty_print_info *, tree));
  void pp_c_expression PARAMS ((c_pretty_print_info *, tree));
! 
  /* Expressions.  */
  void pp_c_expression PARAMS ((c_pretty_print_info *, tree));
  void pp_c_logical_or_expression PARAMS ((c_pretty_print_info *, tree));
--- 131,138 ----
  void pp_c_declaration PARAMS ((c_pretty_print_info *, tree));
  void pp_c_statement PARAMS ((c_pretty_print_info *, tree));
  void pp_c_expression PARAMS ((c_pretty_print_info *, tree));
! /* Statements.  */
! void pp_c_statement PARAMS ((c_pretty_print_info *, tree));
  /* Expressions.  */
  void pp_c_expression PARAMS ((c_pretty_print_info *, tree));
  void pp_c_logical_or_expression PARAMS ((c_pretty_print_info *, tree));


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]