diff --git a/.gitignore b/.gitignore index fdd08f5..21ede4a 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,7 @@ a.out Colleen_*.c Grace_*.c Sully_*.c +!Colleen_exploded.c +!Grace_exploded.c +!Sully_exploded.c *test* diff --git a/1_Colleen/Colleen_exploded.c b/1_Colleen/Colleen_exploded.c new file mode 100644 index 0000000..a9ac14e --- /dev/null +++ b/1_Colleen/Colleen_exploded.c @@ -0,0 +1,32 @@ +/* + comment outside +*/ +#include +\ +char *second_function() \ +{ \ + return "\ + /*%c comment outside%c*/%c\ + #include %c\ + char *second_function() \ + { \ + return %c%s%c; \ + }%c\ + int main() \ + { \ + char *program = second_function(); \ + printf(program, 10, 10, 10, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); \ + return 0;%c \ + /*%c comment inside%c */%c\ + }%c\ + "; \ +} +int main() \ +{ \ + char *program = second_function(); \ + printf(program, 10, 10, 10, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); \ + return 0; + /* + comment inside + */ +} diff --git a/2_Grace/Grace_exploded.c b/2_Grace/Grace_exploded.c new file mode 100644 index 0000000..8dfbca3 --- /dev/null +++ b/2_Grace/Grace_exploded.c @@ -0,0 +1,18 @@ +#include +#define xstr(s) #s +#define str(s) xstr(s) +#define MAIN(s) \ +int main() \ +{ \ + char *before = "#include \n#define xstr(s) #s\n#define str(s) xstr(s)\n#define MAIN(s) "; \ + char *quine = s; \ + char *after = "\n/*\n comment\n*/\nMAIN(str(MAIN(s)))\n"; \ + FILE *file = fopen("Grace_kid.c", "w"); \ + fprintf(file, "%s%s%s", before, quine, after); \ + fclose(file); \ + return 0; \ +} +/* + comment +*/ +MAIN(str(MAIN(s))) diff --git a/3_Sully/Sully_exploded.c b/3_Sully/Sully_exploded.c new file mode 100644 index 0000000..085d265 --- /dev/null +++ b/3_Sully/Sully_exploded.c @@ -0,0 +1,56 @@ +#define _GNU_SOURCE /* for asprintf */ +#include /* for free and system */ +#include +#define xstr(s) #s +#define str(s) xstr(s) +#define FT(s) \ +int main() \ +{ \ +\ + char *before = \ + "\ + #define _GNU_SOURCE /* for asprintf */\n\ + #include /* for free and system */\n\ + #include \n\ + #define xstr(s) #s\n\ + #define str(s) xstr(s)\n\ + #define FT(s) \ + "; \ + char *quine = s; \ + char *after = \ + "\ + \n\ + int i = %i;\n\ + FT(str(FT(s)))\n\ + "; \ +\ + i--; \ +\ + char *kid_name; \ + char *kid_name_c; \ + char *decremented_after; \ + char *cmd; \ + asprintf(&kid_name, "Sully_%i", i); \ + asprintf(&kid_name_c, "%s.c", kid_name); \ +\ + FILE *file = fopen(kid_name_c, "w"); \ + asprintf(&decremented_after, after, i); \ + fprintf(file, "%s%s%s", before, quine, decremented_after); \ + fclose(file); \ +\ + asprintf(&cmd, "clang %1$s -o %2$s ; ./%2$s", kid_name_c, kid_name); \ + printf("cmd: %s\n", cmd); \ + if (i > 0) \ + {\ + system(cmd); \ + } \ +\ + free(kid_name_c); \ + free(kid_name); \ + free(decremented_after); \ + free(cmd); \ +\ + return 0; \ +} +int i = 5; +FT(str(FT(s)))