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