m4: Sync with FreeBSD.
[dragonfly.git] / usr.bin / m4 / NOTES
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         +-------+