/* quine1.c : A simple quine (prints it's own source code) */ /* Written by Jonathan Mayo, March 2002. * PUBLIC DOMAIN / NO COPYRIGHT CLAIMED */ #include void decode(const char *str, FILE *out) { while(*str) { if(*str=='@') { (str++); switch(*str) { case '@': fputc('@',out); break; case 'N': fputs("\\n",out); break; case 'n': fputc('\n',out); break; case 'q': fputc('\"',out); break; case 's': fputc('\\',out); break; case 't': fputc('\t',out); break; } } else { fputc(*str,out); } str++; } } void encode(const char *str, FILE *out) { fputs("\n\t\"",out); while(*str) { fputc(*str,out); if(*str=='@') { (str++); if(*str == 'n') fputs("n\"\n \"",out); else if(*str == 'N') fputc('N',out); else fputc(*str,out); } str++; } fputc('\"',out); } void quine() { const char *p[] = { "/* quine1.c : A simple quine (prints it's own source code) */@n" "/* Written by Jonathan Mayo, March 2002.@n" " * PUBLIC DOMAIN / NO COPYRIGHT CLAIMED */@n" "#include @n" "void decode(const char *str, FILE *out)@n" "{@n" " while(*str) {@n" " if(*str=='@@') {@n" " (str++);@n" " switch(*str) {@n" " case '@@': fputc('@@',out); break;@n" " case 'N': fputs(@q@s@sn@q,out); break;@n" " case 'n': fputc('@sn',out); break;@n" " case 'q': fputc('@s@q',out); break;@n" " case 's': fputc('@s@s',out); break;@n" " case 't': fputc('@st',out); break;@n" " }@n" " } else {@n" " fputc(*str,out);@n" " }@n" " str++;@n" " }@n" "}@n" "@n" "void encode(const char *str, FILE *out)@n" "{@n" " fputs(@q@sn@st@s@q@q,out);@n" " while(*str) {@n" " fputc(*str,out);@n" " if(*str=='@@') {@n" " (str++);@n" " if(*str == 'n') @n" " fputs(@qn@s@q@sn@t@s@q@q,out);@n" " else if(*str == 'N')@n" " fputc('N',out);@n" " else@n" " fputc(*str,out);@n" " }@n" " str++;@n" " }@n" " fputc('@s@q',out);@n" "}@n" "@n" "void quine()@n" "{@n" " const char *p[] = {", " };@n" " decode(p[0],stdout);@n" " encode(p[0],stdout);@n" " fputc(',',stdout); @n" " encode(p[1],stdout);@n" " decode(p[1],stdout);@n" " fputc('@sn',stdout);@n" "}@n" "@n" "int main(int argc, char **argv)@n" "{@n" " quine();@n" " return 0; @n" "}" }; decode(p[0],stdout); encode(p[0],stdout); fputc(',',stdout); encode(p[1],stdout); decode(p[1],stdout); fputc('\n',stdout); } int main(int argc, char **argv) { quine(); return 0; }