Custom Search

Tuesday, March 20, 2007

Quine

Write a C program that executes and prints itself in the output.
(Do not use any file concepts such as reading from source file, the source will not be provided.)

The answer is
A program that produces its complete source code as its only output is called a quine. This is a technique some times used in viruses.( dont ask me to write a virus or to help in writing a virus ).

char*f="char*f=%c%s%c;main()
{printf(f,34,f,34,10);}";
main(){printf(f,34,f,34,10);}

Let us understand the above program.
Before that, have a look at this code
char t[10]="%s";
char name[10]="hello";
printf(t,name);

it prints
hello

generally printf takes parameters. treats the first string is to be printed and if there is some %s in the first string, it searches for the next parameter(ignores it, if there is no corrosponding parameter in the printf call). prints it with out any doubt.

Now, let us understand this code

The program is
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}";
main(){printf(f,34,f,34,10);}

initially, we r declaring a character pointer f.
we are storing the text that is present in the program into the pointer p but, with some technique to print itself twice.

char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}";
main(){printf(f,34,f,34,10);}

we are storing char *f=%c%s%c;main(){printf(f,34,f,34,10);}
in to the character pointer f
in the main we are calling a printf.
f is passed as a first variable to printf

char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}";
main(){printf(f,34,f,34,10);}

The printf will look like

printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}" ,34,f,34,10);
observer the double quotes text in printf, it has %c%s%c

printf("char*f= %c%s%c;main(){printf(f,34,f,34,10);}",34,f,34,10);

there i am printing 34, f, 34. (34 is ascii double quotes ("))
the entire printf will look like
printf("char*f=" char*f=%c%s%c;main(){printf(f,34,f,34,10);}"",10);

we can omit 10. it is not necessary.

if it is not clear, write the program on a paper and try the steps described above.

if u r comfortable, have a look at ............(not compulsary, leave this complex example if u dont understand)
A complex quine example

/* A simple quine (self-printing program), in standard C. */

/* Note: in designing this quine, we have tried to make the code clear and readable, not concise and obscure as many quines are, so that the general principle can be made clear at the expense of length. In a nutshell: use the same data structure (called "progdata" below) to output the program code (which it represents) and its own textual representation. */

#include

void quote(const char *s)
/* This function takes a character string s and prints the
* textual representation of s as it might appear formatted in C
* code. */
{
int i;

printf(" \"");
for (i = 0; s[i]; i++) {
/* Certain characters are quoted. */
if (s[i] == '\\')
printf("\\\\");
else if (s[i] == '"')
printf("\\\"");
else if (s[i] == '\n')
printf("\\n");
/* Others are just printed as such. */
else
printf("%c", s[i]);
/* Also insert occasional line breaks. */
if (i % 48 == 47)
printf("\"\n \"");
}
printf("\"");
}

/* What follows is a string representation of the program code, from
* beginning to end (formated as per quote() function, above), except
* that the string _itself_ is coded as two consecutive '@'
* characters. */
const char progdata[] =
"/* A simple quine (self-printing program), in st"
"andard C. */\n\n/* Note: in designing this quine, "
"we have tried to make the code clear\n * and read"
"able, not concise and obscure as many quines are"
", so that\n * the general principle can be made c"
"lear at the expense of length.\n * In a nutshell:"
" use the same data structure (called \"progdata\"\n"
" * below) to output the program code (which it r"
"epresents) and its own\n * textual representation"
". */\n\n#include \n\nvoid quote(const char "
"*s)\n /* This function takes a character stri"
"ng s and prints the\n * textual representati"
"on of s as it might appear formatted in C\n "
"* code. */\n{\n int i;\n\n printf(\" \\\"\");\n "
" for (i = 0; s[i]; i++) {\n /* Certain c"
"haracters are quoted. */\n if (s[i] == '\\\\"
"')\n printf(\"\\\\\\\\\");\n else if ("
"s[i] == '\"')\n printf(\"\\\\\\\"\");\n "
" else if (s[i] == '\\n')\n printf(\"\\\\n\""
");\n /* Others are just printed as such. *"
"/\n else\n printf(\"%c\", s[i]);\n "
" /* Also insert occasional line breaks. */"
"\n if (i % 48 == 47)\n printf(\"\\"
"\"\\n \\\"\");\n }\n printf(\"\\\"\");\n}\n\n/* What "
"follows is a string representation of the progra"
"m code, from\n * beginning to end (formated as pe"
"r quote() function, above), except\n * that the s"
"tring _itself_ is coded as two consecutive '@'\n "
"* characters. */\nconst char progdata[] =\n@@;\n\nin"
"t main(void)\n /* The program itself... */\n{\n"
" int i;\n\n /* Print the program code, chara"
"cter by character. */\n for (i = 0; progdata[i"
"]; i++) {\n if (progdata[i] == '@' && prog"
"data[i + 1] == '@')\n /* We encounter "
"two '@' signs, so we must print the quoted\n "
" * form of the program code. */\n {"
"\n quote(progdata); /* Quote all. *"
"/\n i++; /* Skip second"
" '@'. */\n } else\n printf(\"%c\","
" progdata[i]); /* Print character. */\n }\n "
" return 0;\n}\n";

int main(void)
/* The program itself... */
{
int i;

/* Print the program code, character by character. */
for (i = 0; progdata[i]; i++) {
if (progdata[i] == '@' && progdata[i + 1] == '@')
/* We encounter two '@' signs, so we must print the quoted
* form of the program code. */
{
quote(progdata); /* Quote all. */
i++; /* Skip second '@'. */
} else
printf("%c", progdata[i]); /* Print character. */
}
return 0;
}


I hope the things are clear about quine. if any one can explain in better way, mail me i will forward it to all.
Thank you.

No comments: