65 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* nice_printf -- same arguments as fprintf.
 | |
| 
 | |
| 	All output which is to become C code must be directed through this
 | |
|    function.  For now, no buffering is done.  Later on, every line of
 | |
|    output will be filtered to accomodate the style definitions (e.g. one
 | |
|    statement per line, spaces between function names and argument lists,
 | |
|    etc.)
 | |
| */
 | |
| #include "niceprintf.h"
 | |
| 
 | |
| extern int nice_printf ();
 | |
| 
 | |
| 
 | |
| /* Definitions for the opcode table.  The table is indexed by the macros
 | |
|    which are #defined in   defines.h   */
 | |
| 
 | |
| #define UNARY_OP 01
 | |
| #define BINARY_OP 02
 | |
| 
 | |
| #define SPECIAL_FMT NULL
 | |
| 
 | |
| #define is_unary_op(x) (opcode_table[x].type == UNARY_OP)
 | |
| #define is_binary_op(x) (opcode_table[x].type == BINARY_OP)
 | |
| #define op_precedence(x) (opcode_table[x].prec)
 | |
| #define op_format(x) (opcode_table[x].format)
 | |
| 
 | |
| /* _assoc_table -- encodes left-associativity and right-associativity
 | |
|    information; indexed by precedence level.  Only 2, 3, 14 are
 | |
|    right-associative.  Source:  Kernighan & Ritchie, p. 49 */
 | |
| 
 | |
| extern char _assoc_table[];
 | |
| 
 | |
| #define is_right_assoc(x) (_assoc_table [x])
 | |
| #define is_left_assoc(x) (! _assoc_table [x])
 | |
| 
 | |
| 
 | |
| typedef struct {
 | |
|     int type;			/* UNARY_OP or BINARY_OP */
 | |
|     int prec;			/* Precedence level, useful for adjusting
 | |
| 				   number of parens to insert.  Zero is a
 | |
| 				   special level, and 2, 3, 14 are
 | |
| 				   right-associative */
 | |
|     char *format;
 | |
| } table_entry;
 | |
| 
 | |
| 
 | |
| extern char *fl_fmt_string;	/* Float constant format string */
 | |
| extern char *db_fmt_string;	/* Double constant format string */
 | |
| extern char *cm_fmt_string;	/* Complex constant format string */
 | |
| extern char *dcm_fmt_string;	/* Double Complex constant format string */
 | |
| 
 | |
| extern int indent;		/* Number of spaces to indent; this is a
 | |
| 				   temporary fix */
 | |
| extern int tab_size;		/* Number of spaces in each tab */
 | |
| extern int in_string;
 | |
| 
 | |
| extern table_entry opcode_table[];
 | |
| 
 | |
| 
 | |
| void expr_out (), out_init (), out_addr (), out_const ();
 | |
| void out_name (), extern_out (), out_asgoto ();
 | |
| void out_if (), out_else (), elif_out ();
 | |
| void endif_out (), end_else_out ();
 | |
| void compgoto_out (), out_for ();
 | |
| void out_end_for (), out_and_free_statement ();
 |