|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: I T
Length: 6290 (0x1892) Types: TextFile Names: »Ish.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Ish/Ish.c«
#include <stdio.h> #include <signal.h> #include <setjmp.h> #define PROMPT "$ " jmp_buf address; char buffer[256]; char word[256]; int position; int probno; char *problem[] = { "no way josea\n", "cannot fork (); try again later\n", "no\n", "\n\nMessage from root on tty05 at 21:17 ...\007\007\n\n\n", "why should I?\n", "memory fault - core dumped\n", "don't boss ME around\n", "login: ", "I don't want to\n", ": cannot execute\n", "lemme alone\n", "From root 21:17: SYSTEM WILL BE GOING DOWN IN 1 MINUTE\n", "fat chance buster\n", "permission denied\n", 0 }; int ls (); int rm (); int cd (); int cat (); int ed (); int vi (); int iff (); int then (); int elif (); int fi (); int echo (); int whyle (); int doo (); int done (); int cace (); int in (); int esac (); int ps (); int who (); struct entry { char *word; int (*func) (); } oper[] = { { "ls", ls }, { "rm", rm }, { "cd", cd }, { "cat", cat }, { "ed", ed }, { "vi", vi }, { "if", iff }, { "then", then }, { "elif", elif }, { "fi", fi }, { "echo", echo }, { "while",whyle }, { "do", doo }, { "done", done }, { "case", cace }, { "in", in }, { "esac", esac }, { "ps", ps }, { "who", who }, 0, 0 }; int intr (); main () { setjmp (address); main: signal (SIGINT, intr); printf (PROMPT); if (!gets (buffer)) quit (); position = 0; if (!*buffer) goto main; parse (); goto main; } quit () { printf ("\nBye!\n"); exit (0); } intr () { putchar ('\n'); longjmp (address); } readword () { char c; int pos; pos = 0; if (!buffer[position]) { word[0] = '\0'; return; } while (buffer[position] == ' ' || buffer[position] == '\t') position++; while ((c = buffer[position]) && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')) word[pos++] = buffer[position++]; word[pos] = '\0'; } parse () { readword (); if (!*word) fatal ("%c unexpected\n", buffer[position]); action (word); fatal ("ish: %s not found\n", word); } fatal (string, arg) char *string; int arg; { printf (string, arg); longjmp (address); } action (string) char *string; { int i; difficult (); for (i = 0; oper[i].word; i++) if (strcmp (word, oper[i].word) == 0) (*(oper[i].func)) (); } difficult () /* routine to be a general pain */ { int prob; prob = rand () % 4; if (prob) return; if (!problem[++probno]) probno = 0; fatal (problem[probno]); } ls () { readword (); if (*word) fatal ("ls: can't seem to find %s\n", word); puts ("READ_ME"); puts ("answer"); puts ("copyright"); puts ("peace"); puts ("puzzle"); puts ("rogue.c"); longjmp (address); } rm () { fatal ("rm: usage rm *.*\n"); } cd () { printf ("I can't, I'm stuck\n"); longjmp (address); } cat () { readword (); if (*word) printfile (); if (buffer[position] == '>') fatal ("cat: cannot open output file\n"); fatal ("cat: usage cat -abcdefghijklmnopqrstuvwxyz0123456789 [ file ] ...\n"); } printfile () { if (!strcmp (word, "READ_ME")) { printf ("UNIX 5.0 Self Assertion UNIX 5.0\n\n"); printf ("SYNTAX:\n\n\tassert yourself\n\n"); printf ("DESCRIPTION:\n\n\t Are you one of those people who always\n"); printf ("does what he is told without question? Would you jump in a lake\n"); printf ("if told to? Would you give someone $10 if told to? Would you read\n"); printf ("a file because it was named READ_ME, READ.ME, README, or the like?\n"); printf ("If so, send $20 to the following address:\n"); printf ("\tSelf Assertion Foundation\n"); printf ("\tPennsylvania Avenue\n"); printf ("\tWashington, D.C. 00018\n"); printf ("\n\n\n\n\n\n\n\n\n"); printf ("Page 1 UNIX MANUAL Page 1\n"); } else if (!strcmp (word, "copyright")) { printf ("This file may not be used for purpose of profit or sale; it may\n"); printf ("not be changed, distributed, killed, read, kept, or executed.\n"); } else if (!strcmp (word, "rogue.c")) { printf ("char *sccs = \"@1#0 rogue.c\";\n"); printf ("\n#include <sys/rogue.h>\n"); printf ("\nmain (argc, argv)\n"); printf ("bool argc;\nchar ****argv[][];\n"); printf ("{\n\tfor (;;)\n\t\tmakedungeon ()\n"); printf ("\t\tenterdungeon ()\n"); printf ("\t}\n"); printf ("}\n"); } else if (!strcmp (word, "peace")) { printf ("peace: does not exist\n"); } else if (!strcmp (word, "puzzle")) { printf ("...and the answer to the Mystery of Life is:\n"); sleep (3); printf ("\007\007disk read error -- core dumped\n"); } else system ("/usr/games/fortune"); longjmp (address); } ed () { sleep (2); readword (); printf ("?%s\n", word); for (;;) { if (!gets (buffer)) break; if (*buffer == 'q') break; printf ("?\n"); } longjmp (address); } vi () { strcpy (word, getenv ("TERM")); fatal ("vi: terminal %s not found\n", word); } iff () { fatal ("I don't know if I should do it or not\n"); } then () { fatal ("then??? you MUST be kidding\n"); } elif () { fatal ("you must be too lazy to use 'else if'\n"); } fi () { fatal ("fi to you too\n"); } echo () { fatal ("HELLO!! HELLO! Hello! Hello hello\n"); } whyle () { fatal ("while: boolean expression too complex\n"); } doo () { fatal ("no! do it yourself.\n"); } done () { fatal ("it's about time\n"); } cace () { printf ("case? what case? wait! please, hold on! I don't understand!\n"); fatal ("slow down, pleeeze!! pretty please?? grovel grovel...\n"); } in () { printf ("come on, stop using commands like in, else, then, which are only\n"); fatal ("parts of other commands, willya??\n"); } esac () { printf ("Wait, you meant 'case' didn't you? You must have your monitor\n"); fatal ("upside-down.\n"); } ps () { fatal ("the processor is not being put to any reasonable use.\n"); } who () { printf ("root tty00 Jun 23 17:21\n"); printf ("root tty01 Jun 23 17:21\n"); printf ("uucp tty03 Jun 23 17:21\n"); printf ("jerk tty05 Jun 23 17:22\n"); printf ("reagan ttyaa Jun 23 17:25\n"); printf ("mondale ttyab Jun 23 17:27\n"); printf ("carter ttybf Jun 23 17:25\n"); printf ("nixon ttyzz Jan 1 00:01\n"); printf ("ford ttyyz9 Jun 33 25:-10\n"); fatal ("jfc tty1e6 4 p.m. yesterday\n"); } /* --- Cut here if you feel like it --- */ /* Don Dapkus */