const char *lines[] = {
    "",
    "#include <stdio.h>",
    "#define NLINES ((sizeof lines) / (sizeof lines[0]))",
    "",
    "void",
    "print_escaped (const char *line)",
    "{",
    "    const char *in;",
    "",
    "    printf (\"    \\\"\");",
    "",
    "    for (in = line; *in; ++in)",
    "        switch (*in) {",
    "        case '\"':",
    "            printf (\"\\\\\\\"\");",
    "            break;",
    "        case '\\\\':",
    "            printf (\"\\\\\\\\\");",
    "            break;",
    "        default:",
    "            printf (\"%c\", *in);",
    "        }",
    "",
    "    printf (\"\\\",\\n\");",
    "}",
    "",
    "int",
    "main (void)",
    "{",
    "    size_t k;",
    "",
    "    printf (\"const char *lines[] = {\\n\");",
    "    for (k = 0; k < NLINES; ++k)",
    "        print_escaped (lines[k]);",
    "    printf (\"};\\n\");",
    "",
    "    for (k = 0; k < NLINES; ++k)",
    "        printf (\"%s\\n\", lines[k]);",
    "",
    "    return 0;",
    "}",
};

#include <stdio.h>
#define NLINES ((sizeof lines) / (sizeof lines[0]))

void
print_escaped (const char *line)
{
    const char *in;

    printf ("    \"");

    for (in = line; *in; ++in)
        switch (*in) {
        case '"':
            printf ("\\\"");
            break;
        case '\\':
            printf ("\\\\");
            break;
        default:
            printf ("%c", *in);
        }

    printf ("\",\n");
}

int
main (void)
{
    size_t k;

    printf ("const char *lines[] = {\n");
    for (k = 0; k < NLINES; ++k)
        print_escaped (lines[k]);
    printf ("};\n");

    for (k = 0; k < NLINES; ++k)
        printf ("%s\n", lines[k]);

    return 0;
}
