Home | History | Annotate | Line # | Download | only in m4
      1 m4 - macro processor
      2 
      3 PD m4 is based on the macro tool distributed with the software 
      4 tools (VOS) package, and described in the "SOFTWARE TOOLS" and 
      5 "SOFTWARE TOOLS IN PASCAL" books. It has been expanded to include 
      6 most of the command set of SysV m4, the standard UN*X macro processor.
      7 
      8 Since both PD m4 and UN*X m4 are based on SOFTWARE TOOLS macro,
      9 there may be certain implementation similarities between
     10 the two. The PD m4 was produced without ANY references to m4
     11 sources.
     12 
     13 written by: Ozan S. Yigit
     14 
     15 References:
     16 
     17 	Software Tools distribution: macro
     18 
     19 	Kernighan, Brian W. and P. J. Plauger, SOFTWARE
     20 	TOOLS IN PASCAL, Addison-Wesley, Mass. 1981
     21 
     22 	Kernighan, Brian W. and P. J. Plauger, SOFTWARE
     23 	TOOLS, Addison-Wesley, Mass. 1976
     24 
     25 	Kernighan, Brian W. and Dennis M. Ritchie,
     26 	THE M4 MACRO PROCESSOR, Unix Programmer's Manual,
     27 	Seventh Edition, Vol. 2, Bell Telephone Labs, 1979
     28 
     29 	System V man page for M4
     30 
     31 
     32 Implementation Notes:
     33 
     34 [1]	PD m4 uses a different (and simpler) stack mechanism than the one 
     35 	described in Software Tools and Software Tools in Pascal books. 
     36 	The triple stack thing is replaced with a single stack containing 
     37 	the call frames and the arguments. Each frame is back-linked to a 
     38 	previous stack frame, which enables us to rewind the stack after 
     39 	each nested call is completed. Each argument is a character pointer 
     40 	to the beginning of the argument string within the string space.
     41 	The only exceptions to this are (*) arg 0 and arg 1, which are
     42 	the macro definition and macro name strings, stored dynamically
     43 	for the hash table.
     44 
     45 	    .					   .
     46 	|   .	|  <-- sp			|  .  |
     47 	+-------+				+-----+
     48 	| arg 3 ------------------------------->| str |
     49 	+-------+				|  .  |
     50 	| arg 2 --------------+ 		   .
     51 	+-------+	      |
     52 	    *		      |			|     |
     53 	+-------+	      | 		+-----+
     54 	| plev	|  <-- fp     +---------------->| str |
     55 	+-------+				|  .  |
     56 	| type	|				   .
     57 	+-------+
     58 	| prcf	-----------+		plev: paren level
     59 	+-------+  	   |		type: call type
     60 	|   .	| 	   |		prcf: prev. call frame
     61 	    .	   	   |
     62 	+-------+	   |
     63 	|	<----------+
     64 	+-------+
     65