1 #include <stdio.h>
2 
3 #define SPLICE(a, b) INNER_SPLICE(a, b)
4 #define INNER_SPLICE(a, b) a ## b
5 #define STRINGIFY(a) INNER_STRINGIFY(a)
6 #define INNER_STRINGIFY(a) #a
7 
8 #define FIFTY_SEVEN 57
9 
10 #define FORTY_EIGHT 48
11 #undef  FORTY_EIGHT
12 
13 struct outer
14 {
15   struct fields
16   {
17     struct fault
18     {
19       int addr;
20     } fault;
21   } fields;
22 };
23 struct outer address;
24 
25 #define addr fields.fault.addr
26 
27 /* A macro named UNTIL_<func> is #defined until just before the
28    definition of the function <func>.
29 
30    A macro named BEFORE_<func> is not #defined until just before the
31    definition of <func>.
32 
33    The macro WHERE is redefined before each function <func> to the
34    token list ``before <func>''.
35 
36    The macscp IN_MACSCP2_H and IN_MACSCP3_H are defined while
37    processing those header files; macscp4.h uses them to choose
38    appropriate function names, output strings, and macro definitions.  */
39 
40 #define UNTIL_MACSCP1_1
41 #define UNTIL_MACSCP2_1
42 #define UNTIL_MACSCP4_1_FROM_MACSCP2
43 #define UNTIL_MACSCP4_2_FROM_MACSCP2
44 #define UNTIL_MACSCP2_2
45 #define UNTIL_MACSCP1_2
46 #define UNTIL_MACSCP3_1
47 #define UNTIL_MACSCP4_1_FROM_MACSCP3
48 #define UNTIL_MACSCP4_2_FROM_MACSCP3
49 #define UNTIL_MACSCP3_2
50 #define UNTIL_MACSCP1_3
51 
52 #define WHERE before macscp1_1
53 #define BEFORE_MACSCP1_1
54 #undef UNTIL_MACSCP1_1
55 void
macscp1_1()56 macscp1_1 ()
57 {
58   puts ("macscp1_1");
59 }
60 
61 #include "macscp2.h"
62 
63 #undef WHERE
64 #define WHERE before macscp1_2
65 #define BEFORE_MACSCP1_2
66 #undef UNTIL_MACSCP1_2
67 void
macscp1_2()68 macscp1_2 ()
69 {
70   puts ("macscp1_2");
71 }
72 
73 #include "macscp3.h"
74 
75 #undef WHERE
76 #define WHERE before macscp1_3
77 #define BEFORE_MACSCP1_3
78 #undef UNTIL_MACSCP1_3
79 void
macscp1_3()80 macscp1_3 ()
81 {
82   puts ("macscp1_3");
83 }
84 
85 void
macscp_expr(void)86 macscp_expr (void)
87 {
88   int foo = -1;
89 
90   foo = 0;  /* set breakpoint here */
91 #define MACRO_TO_EXPAND foo
92   foo = 1;			/* set second breakpoint here */
93 #undef MACRO_TO_EXPAND
94   foo = 2;			/* stopping point for line test */
95 }
96 
97 #define TWENTY_THREE 23
98 
99 int
main(int argc,char ** argv)100 main (int argc, char **argv)
101 {
102   macscp1_1 ();
103   macscp2_1 ();
104   macscp4_1_from_macscp2 ();
105   macscp4_2_from_macscp2 ();
106   macscp2_2 ();
107   macscp1_2 ();
108   macscp3_1 ();
109   macscp4_1_from_macscp3 ();
110   macscp4_2_from_macscp3 ();
111   macscp3_2 ();
112   macscp1_3 ();
113   macscp_expr ();
114 }
115