/* This program prints out a program that prints out its own source code */ #include void w(char *s, int k) { while(*s){if(k)if(*s=='\\'||*s=='\"'||*s=='\n')fputc('\\',stdout);if(k&&*s=='\n')fputc('n',stdout);else fputc(*s,stdout);++s;} } char *part_a(void) { char *out = "void part_b(char *s)\n{\n" " w(\"#include \\n\\nvoid w(char *s, int k)\\n{\\n\", 0);\n" " w(\" while(*s){if(k)if(*s=='\\\\'||*s=='\\\"'||*s=='\\n')fputc('\\\\',stdout);if(k&&*s=='\\n')fputc('n',stdout);else \", 1);\n" " w(\"fputc(*s,stdout);++s;}\\n}\\n\\nchar *part_a(void)\\n{\\n char *out = \\\"\", 0);\n" " w(s, 1); w(\"\\\";\\n\\n return out;\\n}\\n\\n\", 0);\n" " w(s, 0); w(\"\\n\\nint main(void)\\n{\\n part_b(part_a());\\n\\n return 0;\\n}\\n\", 0);\n" "}\n\n"; return out; } void part_b(char *s) { w("#include \n\nvoid w(char *s, int k)\n{\n", 0); w(" while(*s){if(k)if(*s=='\\'||*s=='\"'||*s=='\n')fputc('\\',stdout);if(k&&*s=='\n')fputc('n',stdout);else ", 1); w("fputc(*s,stdout);++s;}\n}\n\nchar *part_a(void)\n{\n char *out = \"", 0); w(s, 1); w("\";\n\n return out;\n}\n\n", 0); w(s, 0); w("\n\nint main(void)\n{\n part_b(part_a());\n\n return 0;\n}\n", 0); } int main(void) { part_b(part_a()); return 0; }