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()56macscp1_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()68macscp1_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()80macscp1_3 () 81 { 82 puts ("macscp1_3"); 83 } 84 85 void macscp_expr(void)86macscp_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)100main (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