160 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #define P1_UNKNOWN 0
 | |
| #define P1_COMMENT 1		/* Fortan comment string */
 | |
| #define P1_EOF 2		/* End of file dummy token */
 | |
| #define P1_SET_LINE 3		/* Reset the line counter */
 | |
| #define P1_FILENAME 4		/* Name of current input file */
 | |
| #define P1_NAME_POINTER 5	/* Pointer to hash table entry */
 | |
| #define P1_CONST 6		/* Some constant value */
 | |
| #define P1_EXPR 7		/* Followed by opcode */
 | |
| 
 | |
| /* The next two tokens could be grouped together, since they always come
 | |
|    from an Addr structure */
 | |
| 
 | |
| #define P1_IDENT 8		/* Char string identifier in addrp->user
 | |
| 				   field */
 | |
| #define P1_EXTERN 9		/* Pointer to external symbol entry */
 | |
| 
 | |
| #define P1_HEAD 10		/* Function header info */
 | |
| #define P1_LIST 11		/* A list of data (e.g. arguments) will
 | |
| 				   follow the tag, type, and count */
 | |
| #define P1_LITERAL 12		/* Hold the index into the literal pool */
 | |
| #define P1_LABEL 13		/* label value */
 | |
| #define P1_ASGOTO 14		/* Store the hash table pointer of
 | |
| 				   variable used in assigned goto */
 | |
| #define P1_GOTO 15		/* Store the statement number */
 | |
| #define P1_IF 16		/* store the condition as an expression */
 | |
| #define P1_ELSE 17		/* No data */
 | |
| #define P1_ELIF 18		/* store the condition as an expression */
 | |
| #define P1_ENDIF 19		/* Marks the end of a block IF */
 | |
| #define P1_ENDELSE 20		/* Marks the end of a block ELSE */
 | |
| #define P1_ADDR 21		/* Addr data; used for arrays, common and
 | |
| 				   equiv addressing, NOT for names, idents
 | |
| 				   or externs */
 | |
| #define P1_SUBR_RET 22		/* Subroutine return; the return expression
 | |
| 				   follows */
 | |
| #define P1_COMP_GOTO 23		/* Computed goto; has expr, label list */
 | |
| #define P1_FOR 24		/* C FOR loop; three expressions follow */
 | |
| #define P1_ENDFOR 25		/* End of C FOR loop */
 | |
| #define P1_FORTRAN 26		/* original Fortran source */
 | |
| #define P1_CHARP 27		/* user.Charp field -- for long names */
 | |
| #define P1_WHILE1START 28	/* start of DO WHILE */
 | |
| #define P1_WHILE2START 29	/* rest of DO WHILE */
 | |
| #define P1_PROCODE 30		/* invoke procode() -- to adjust params */
 | |
| #define P1_ELSEIFSTART 31	/* handle extra code for abs, min, max
 | |
| 				   in else if() */
 | |
| 
 | |
| #define P1_FILENAME_MAX	256	/* max filename length to retain (for -g) */
 | |
| #define P1_STMTBUFSIZE 1400
 | |
| 
 | |
| 
 | |
| 
 | |
| #define COMMENT_BUFFER_SIZE 255	/* max number of chars in each comment */
 | |
| #define CONSTANT_STR_MAX 1000	/* max number of chars in string constant */
 | |
| 
 | |
| extern void p1put (/* int */);
 | |
| extern void p1_comment (/* char * */);
 | |
| extern void p1_label (/* int */);
 | |
| extern void p1_line_number (/* int */);
 | |
| extern void p1put_filename();
 | |
| extern void p1_expr (/* expptr */);
 | |
| extern void p1_head (/* int, char * */);
 | |
| extern void p1_if (/* expptr */);
 | |
| extern void p1_else ();
 | |
| extern void p1_elif (/* expptr */);
 | |
| extern void p1_endif ();
 | |
| extern void p1else_end ();
 | |
| extern void p1_subr_ret (/* expptr */);
 | |
| extern void p1_goto(/* long */);
 | |
| extern void p1comp_goto (/* expptr, int, struct Labelblock *[] */);
 | |
| extern void p1_for (/* expptr, expptr, expptr */);
 | |
| extern void p1for_end ();
 | |
| 
 | |
| 
 | |
| extern void p1puts (/* int, char * */);
 | |
| 
 | |
| /* The pass 1 intermediate file has the following format:
 | |
| 
 | |
| 	<ascii-integer-rep> [ : [ <sp> [ <data> ]]] \n
 | |
| 
 | |
|    e.g.   1: This is a comment
 | |
| 
 | |
|    This format is destined to change in the future, but for now a readable
 | |
|    form is more desirable than a compact form.
 | |
| 
 | |
|    NOTES ABOUT THE P1 FORMAT
 | |
|    ----------------------------------------------------------------------
 | |
| 
 | |
| 	P1_COMMENT:  The comment string (in   <data>)   may be at most
 | |
| 		COMMENT_BUFFER_SIZE bytes long.  It must contain no newlines
 | |
| 		or null characters.  A side effect of the way comments are
 | |
| 		read in   lex.c   is that no '\377' chars may be in a
 | |
| 		comment either.
 | |
| 
 | |
| 	P1_SET_LINE:  <data>  holds the line number in the current source file.
 | |
| 
 | |
| 	P1_INC_LINE:  Increment the source line number;   <data>   is empty.
 | |
| 
 | |
| 	P1_NAME_POINTER:  <data>   holds the integer representation of a
 | |
| 			  pointer into a hash table entry.
 | |
| 
 | |
| 	P1_CONST:  the first field in   <data>   is a type tag (one of the
 | |
| 		   TYxxxx   macros), the next field holds the constant
 | |
| 		   value
 | |
| 
 | |
| 	P1_EXPR:  <data>   holds the opcode number of the expression,
 | |
| 		  followed by the type of the expression (required for
 | |
| 		  OPCONV).  Next is the value of   vleng.
 | |
| 		  The type of operation represented by the
 | |
| 		  opcode determines how many of the following data items
 | |
| 		  are part of this expression.
 | |
| 
 | |
| 	P1_IDENT:  <data>   holds the type, then storage, then the
 | |
| 		   char string identifier in the   addrp->user   field.
 | |
| 
 | |
| 	P1_EXTERN:  <data>   holds an offset into the external symbol
 | |
| 		    table entry
 | |
| 
 | |
| 	P1_HEAD:  the first field in   <data>  is the procedure class, the
 | |
| 		  second is the name of the procedure
 | |
| 
 | |
| 	P1_LIST:  the first field in   <data>   is the tag, the second the
 | |
| 		  type of the list, the third the number of elements in
 | |
| 		  the list
 | |
| 
 | |
| 	P1_LITERAL:  <data>   holds the   litnum   of a value in the
 | |
| 		     literal pool.
 | |
| 
 | |
| 	P1_LABEL:  <data>   holds the statement number of the current
 | |
| 		   line
 | |
| 
 | |
| 	P1_ASGOTO:  <data>   holds the hash table pointer of the variable
 | |
| 
 | |
| 	P1_GOTO:  <data>   holds the statement number to jump to
 | |
| 
 | |
| 	P1_IF:  <data>   is empty, the following expression is the IF
 | |
| 	        condition.
 | |
| 
 | |
| 	P1_ELSE:  <data>   is empty.
 | |
| 
 | |
| 	P1_ELIF:  <data>   is empty, the following expression is the IF
 | |
| 		  condition.
 | |
| 
 | |
| 	P1_ENDIF:  <data>   is empty.
 | |
| 
 | |
| 	P1_ENDELSE:  <data>   is empty.
 | |
| 
 | |
| 	P1_ADDR:   <data>   holds a direct copy of the structure.  The
 | |
| 		  next expression is a copy of    vleng,   and the next a
 | |
| 		  copy of    memoffset.
 | |
| 
 | |
| 	P1_SUBR_RET:  The next token is an expression for the return value.
 | |
| 
 | |
| 	P1_COMP_GOTO:  The next token is an integer expression, the
 | |
| 		       following one a list of labels.
 | |
| 
 | |
| 	P1_FOR:  The next three expressions are the Init, Test, and
 | |
| 	         Increment expressions of a C FOR loop.
 | |
| 
 | |
| 	P1_ENDFOR:  Marks the end of the body of a FOR loop
 | |
| 
 | |
| */
 |