Leyendo sobre metaprogramacion, decidí hacer mi primer Quine.. o para los que no conocen el termino, un programa capaz de generar como salida su código fuente...acepto sugerencias o correcciones.
#include <stdio.h> char fuente[] = { 'i', 'n', 't', ' ', 'm', 'a', 'i', 'n', '(', ')', '{', '\n', '\t', 'i', 'n', 't', ' ', 'i', ';', '\n', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '#', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '<', 's', 't', 'd', 'i', 'o', '.', 'h', '>', '\\', 'n', 'c', 'h', 'a', 'r', ' ', 'f', 'u', 'e', 'n', 't', 'e', '[', ']', ' ', '=', ' ', '{', '\\', 'n', '"', ')', ';', '\n', '\t', 'f', 'o', 'r', '(', 'i', '=', '0', ';', 'f', 'u', 'e', 'n', 't', 'e', '[', 'i', ']', ';', 'i', '+', '+', ')', '{', '\n', '\t', '\t', 's', 'w', 'i', 't', 'c', 'h', '(', 'f', 'u', 'e', 'n', 't', 'e', '[', 'i', ']', ')', '{', '\n', '\t', '\t', '\t', 'c', 'a', 's', 'e', ' ', '\'', '\\', 'n', '\'', ':', '\n', '\t', '\t', '\t', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '\\', 't', '\'', '\\', '\\', 'n', '\'', ',', '\\', 'n', '"', ')', ';', '\n', '\t', '\t', '\t', '\t', 'b', 'r', 'e', 'a', 'k', ';', '\n', '\t', '\t', '\t', 'c', 'a', 's', 'e', ' ', '\'', '\\', 't', '\'', ':', '\n', '\t', '\t', '\t', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '\\', 't', '\'', '\\', '\\', 't', '\'', ',', '\\', 'n', '"', ')', ';', '\n', '\t', '\t', '\t', '\t', 'b', 'r', 'e', 'a', 'k', ';', '\n', '\t', '\t', '\t', 'c', 'a', 's', 'e', ' ', '\'', '\\', '\\', '\'', ':', '\n', '\t', '\t', '\t', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '\\', 't', '\'', '\\', '\\', '\\', '\\', '\'', ',', '\\', 'n', '"', ')', ';', '\n', '\t', '\t', '\t', '\t', 'b', 'r', 'e', 'a', 'k', ';', '\n', '\t', '\t', '\t', 'c', 'a', 's', 'e', ' ', '\'', '\\', '\'', '\'', ':', '\n', '\t', '\t', '\t', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '\\', 't', '\'', '\\', '\\', '\\', '\'', '\'', '\\', 'n', '"', ')', ';', '\n', '\t', '\t', '\t', '\t', 'b', 'r', 'e', 'a', 'k', ';', '\n', '\t', '\t', '\t', 'd', 'e', 'f', 'a', 'u', 'l', 't', ':', '\n', '\t', '\t', '\t', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '\\', 't', '\'', '%', 'c', '\'', ',', '\\', 'n', '"', ',', 'f', 'u', 'e', 'n', 't', 'e', '[', 'i', ']', ')', ';', '\n', '\t', '\t', '}', '\n', '\t', '}', '\n', '\t', 'p', 'r', 'i', 'n', 't', 'f', '(', '"', '\\', 't', '0', '\\', 'n', '}', ';', '\\', 'n', '\\', 'n', '%', 's', '\\', 'n', '"', ',', 'f', 'u', 'e', 'n', 't', 'e', ')', ';', '\n', '\t', 'r', 'e', 't', 'u', 'r', 'n', ' ', '0', ';', '\n', '}', 0 }; int main(){ int i; printf("#include <stdio.h>\nchar fuente[] = {\n"); for(i=0;fuente[i];i++){ switch(fuente[i]){ case '\n': printf("\t'\\n',\n"); break; case '\t': printf("\t'\\t',\n"); break; case '\\': printf("\t'\\\\',\n"); break; case '\'': printf("\t'\\\'',\n"); break; default: printf("\t'%c',\n",fuente[i]); } } printf("\t0\n};\n\n%s\n",fuente); return 0; }
0 comentarios:
Publicar un comentario