Annotation of src/usr.bin/m4/NOTES, Revision 1.1
1.1 ! deraadt 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: +-------+