/* This program prints out a program that prints out its own source code */

#include <stdio.h>

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 <stdio.h>\\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 <stdio.h>\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;
}
