|
|
1.1 ! root 1: ! 2: static char sccsid[] = " worms.c 4.1 82/10/24 "; ! 3: ! 4: /* ! 5: ! 6: @@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@ ! 7: @@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@ ! 8: @@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@ ! 9: @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ ! 10: @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ ! 11: @@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ ! 12: @@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ ! 13: @@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@ ! 14: @@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@ ! 15: ! 16: Eric P. Scott ! 17: Caltech High Energy Physics ! 18: October, 1980 ! 19: ! 20: */ ! 21: #include <stdio.h> ! 22: #include <sgtty.h> ! 23: #define cursor(col,row) tputs(tgoto(CM,col,row),1,outc) ! 24: outc(c) ! 25: { ! 26: putchar(c); ! 27: } ! 28: extern char *UP; ! 29: extern short ospeed; ! 30: int Wrap; ! 31: short *ref[24]; ! 32: static char flavor[]={ ! 33: 'O', '*', '#', '$', '%', '0' ! 34: }; ! 35: static short xinc[]={ ! 36: 1, 1, 1, 0, -1, -1, -1, 0 ! 37: }, yinc[]={ ! 38: -1, 0, 1, 1, 1, 0, -1, -1 ! 39: }; ! 40: static struct worm { ! 41: int orientation, head; ! 42: short *xpos, *ypos; ! 43: } worm[40]; ! 44: static char *field; ! 45: static int length=16, number=3, trail=' '; ! 46: static struct options { ! 47: int nopts; ! 48: int opts[3]; ! 49: } normal[8]={ ! 50: { 3, { 7, 0, 1 } }, ! 51: { 3, { 0, 1, 2 } }, ! 52: { 3, { 1, 2, 3 } }, ! 53: { 3, { 2, 3, 4 } }, ! 54: { 3, { 3, 4, 5 } }, ! 55: { 3, { 4, 5, 6 } }, ! 56: { 3, { 5, 6, 7 } }, ! 57: { 3, { 6, 7, 0 } } ! 58: }, upper[8]={ ! 59: { 1, { 1, 0, 0 } }, ! 60: { 2, { 1, 2, 0 } }, ! 61: { 0, { 0, 0, 0 } }, ! 62: { 0, { 0, 0, 0 } }, ! 63: { 0, { 0, 0, 0 } }, ! 64: { 2, { 4, 5, 0 } }, ! 65: { 1, { 5, 0, 0 } }, ! 66: { 2, { 1, 5, 0 } } ! 67: }, left[8]={ ! 68: { 0, { 0, 0, 0 } }, ! 69: { 0, { 0, 0, 0 } }, ! 70: { 0, { 0, 0, 0 } }, ! 71: { 2, { 2, 3, 0 } }, ! 72: { 1, { 3, 0, 0 } }, ! 73: { 2, { 3, 7, 0 } }, ! 74: { 1, { 7, 0, 0 } }, ! 75: { 2, { 7, 0, 0 } } ! 76: }, right[8]={ ! 77: { 1, { 7, 0, 0 } }, ! 78: { 2, { 3, 7, 0 } }, ! 79: { 1, { 3, 0, 0 } }, ! 80: { 2, { 3, 4, 0 } }, ! 81: { 0, { 0, 0, 0 } }, ! 82: { 0, { 0, 0, 0 } }, ! 83: { 0, { 0, 0, 0 } }, ! 84: { 2, { 6, 7, 0 } } ! 85: }, lower[8]={ ! 86: { 0, { 0, 0, 0 } }, ! 87: { 2, { 0, 1, 0 } }, ! 88: { 1, { 1, 0, 0 } }, ! 89: { 2, { 1, 5, 0 } }, ! 90: { 1, { 5, 0, 0 } }, ! 91: { 2, { 5, 6, 0 } }, ! 92: { 0, { 0, 0, 0 } }, ! 93: { 0, { 0, 0, 0 } } ! 94: }, upleft[8]={ ! 95: { 0, { 0, 0, 0 } }, ! 96: { 0, { 0, 0, 0 } }, ! 97: { 0, { 0, 0, 0 } }, ! 98: { 0, { 0, 0, 0 } }, ! 99: { 0, { 0, 0, 0 } }, ! 100: { 1, { 3, 0, 0 } }, ! 101: { 2, { 1, 3, 0 } }, ! 102: { 1, { 1, 0, 0 } } ! 103: }, upright[8]={ ! 104: { 2, { 3, 5, 0 } }, ! 105: { 1, { 3, 0, 0 } }, ! 106: { 0, { 0, 0, 0 } }, ! 107: { 0, { 0, 0, 0 } }, ! 108: { 0, { 0, 0, 0 } }, ! 109: { 0, { 0, 0, 0 } }, ! 110: { 0, { 0, 0, 0 } }, ! 111: { 1, { 5, 0, 0 } } ! 112: }, lowleft[8]={ ! 113: { 3, { 7, 0, 1 } }, ! 114: { 0, { 0, 0, 0 } }, ! 115: { 0, { 0, 0, 0 } }, ! 116: { 1, { 1, 0, 0 } }, ! 117: { 2, { 1, 7, 0 } }, ! 118: { 1, { 7, 0, 0 } }, ! 119: { 0, { 0, 0, 0 } }, ! 120: { 0, { 0, 0, 0 } } ! 121: }, lowright[8]={ ! 122: { 0, { 0, 0, 0 } }, ! 123: { 1, { 7, 0, 0 } }, ! 124: { 2, { 5, 7, 0 } }, ! 125: { 1, { 5, 0, 0 } }, ! 126: { 0, { 0, 0, 0 } }, ! 127: { 0, { 0, 0, 0 } }, ! 128: { 0, { 0, 0, 0 } }, ! 129: { 0, { 0, 0, 0 } } ! 130: }; ! 131: main(argc,argv) ! 132: int argc; ! 133: char *argv[]; ! 134: { ! 135: extern fputchar(); ! 136: char *malloc(); ! 137: char *getenv(); ! 138: char *tgetstr(), *tgoto(); ! 139: float ranf(); ! 140: register int x, y; ! 141: register int n; ! 142: register struct worm *w; ! 143: register struct options *op; ! 144: register int h; ! 145: register short *ip; ! 146: char *AL, *BC, *CM, *EI, *HO, *IC, *IM, *IP, *SR; ! 147: int CO, IN, LI, last, bottom; ! 148: char *tcp; ! 149: register char *term; ! 150: char tcb[100]; ! 151: struct sgttyb sg; ! 152: setbuf(stdout,malloc(BUFSIZ)); ! 153: for (x=1;x<argc;x++) { ! 154: register char *p; ! 155: p=argv[x]; ! 156: if (*p=='-') p++; ! 157: switch (*p) { ! 158: case 'f': ! 159: field="WORM"; ! 160: break; ! 161: case 'l': ! 162: if (++x==argc) goto usage; ! 163: if ((length=atoi(argv[x]))<2||length>1024) { ! 164: fprintf(stderr,"%s: Invalid length\n",*argv); ! 165: exit(1); ! 166: } ! 167: break; ! 168: case 'n': ! 169: if (++x==argc) goto usage; ! 170: if ((number=atoi(argv[x]))<1||number>40) { ! 171: fprintf(stderr,"%s: Invalid number of worms\n",*argv); ! 172: exit(1); ! 173: } ! 174: break; ! 175: case 't': ! 176: trail='.'; ! 177: break; ! 178: default: ! 179: usage: ! 180: fprintf(stderr, ! 181: "usage: %s [-field] [-length #] [-number #] [-trail]\n",*argv); ! 182: exit(1); ! 183: break; ! 184: } ! 185: } ! 186: if (!(term=getenv("TERM"))) { ! 187: fprintf(stderr,"%s: TERM: parameter not set\n",*argv); ! 188: exit(1); ! 189: } ! 190: if (tgetent(malloc(1024),term)<=0) { ! 191: fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term); ! 192: exit(1); ! 193: } ! 194: tcp=tcb; ! 195: if (!(CM=tgetstr("cm",&tcp))) { ! 196: fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv); ! 197: exit(1); ! 198: } ! 199: AL=tgetstr("al",&tcp); ! 200: BC=tgetflag("bs") ? "\b" : tgetstr("bc",&tcp); ! 201: if ((CO=tgetnum("co"))<=0) CO=80; ! 202: last=CO-1; ! 203: EI=tgetstr("ei",&tcp); ! 204: HO=tgetstr("ho",&tcp); ! 205: IC=tgetstr("ic",&tcp); ! 206: IM=tgetstr("im",&tcp); ! 207: IN=tgetflag("in"); ! 208: IP=tgetstr("ip",&tcp); ! 209: if ((LI=tgetnum("li"))<=0) LI=24; ! 210: bottom=LI-1; ! 211: SR=tgetstr("sr",&tcp); ! 212: UP=tgetstr("up",&tcp); ! 213: gtty(fileno(stdout),&sg); ! 214: ospeed=sg.sg_ospeed; ! 215: Wrap=tgetflag("am"); ! 216: ip=(short *)malloc(LI*CO*sizeof (short)); ! 217: for (n=0;n<LI;) { ! 218: ref[n++]=ip; ip+=CO; ! 219: } ! 220: for (ip=ref[0],n=LI*CO;--n>=0;) *ip++=0; ! 221: if (Wrap) ref[bottom][last]=1; ! 222: for (n=number, w= &worm[0];--n>=0;w++) { ! 223: w->orientation=w->head=0; ! 224: if (!(ip=(short *)malloc(length*sizeof (short)))) { ! 225: fprintf(stderr,"%s: out of memory\n",*argv); ! 226: exit(1); ! 227: } ! 228: w->xpos=ip; ! 229: for (x=length;--x>=0;) *ip++ = -1; ! 230: if (!(ip=(short *)malloc(length*sizeof (short)))) { ! 231: fprintf(stderr,"%s: out of memory\n",*argv); ! 232: exit(1); ! 233: } ! 234: w->ypos=ip; ! 235: for (y=length;--y>=0;) *ip++ = -1; ! 236: } ! 237: tputs(tgetstr("cl",&tcp),1,fputchar); ! 238: if (field) { ! 239: register char *p; ! 240: p=field; ! 241: for (y=bottom;--y>=0;) { ! 242: for (x=CO;--x>=0;) { ! 243: putchar(*p++); ! 244: if (!*p) p=field; ! 245: } ! 246: if (!Wrap) putchar('\n'); ! 247: fflush(stdout); ! 248: } ! 249: if (Wrap) { ! 250: if (IM&&!IN) { ! 251: for (x=last;--x>0;) { ! 252: putchar(*p++); ! 253: if (!*p) p=field; ! 254: } ! 255: y= *p++; if (!*p) p=field; ! 256: putchar(*p); ! 257: if (BC) fputs(BC,stdout); ! 258: else cursor(last-1,bottom); ! 259: fputs(IM,stdout); ! 260: if (IC) tputs(IC,1,fputchar); ! 261: putchar(y); ! 262: if (IP) tputs(IP,1,fputchar); ! 263: fputs(EI,stdout); ! 264: } ! 265: else if (SR||AL) { ! 266: if (HO) fputs(HO,stdout); ! 267: else cursor(0,0); ! 268: if (SR) tputs(SR,1,fputchar); ! 269: else tputs(AL,LI,fputchar); ! 270: for (x=CO;--x>=0;) { ! 271: putchar(*p++); ! 272: if (!*p) p=field; ! 273: } ! 274: } ! 275: else for (x=last;--x>=0;) { ! 276: putchar(*p++); ! 277: if (!*p) p=field; ! 278: } ! 279: } ! 280: else for (x=CO;--x>=0;) { ! 281: putchar(*p++); ! 282: if (!*p) p=field; ! 283: } ! 284: } ! 285: fflush(stdout); ! 286: for (;;) { ! 287: for (n=0,w= &worm[0];n<number;n++,w++) { ! 288: if ((x=w->xpos[h=w->head])<0) { ! 289: cursor(x=w->xpos[h]=0,y=w->ypos[h]=bottom); ! 290: putchar(flavor[n%6]); ! 291: ref[y][x]++; ! 292: } ! 293: else y=w->ypos[h]; ! 294: if (++h==length) h=0; ! 295: if (w->xpos[w->head=h]>=0) { ! 296: register int x1, y1; ! 297: x1=w->xpos[h]; y1=w->ypos[h]; ! 298: if (--ref[y1][x1]==0) { ! 299: cursor(x1,y1); putchar(trail); ! 300: } ! 301: } ! 302: op= &(x==0 ? (y==0 ? upleft : (y==bottom ? lowleft : left)) : ! 303: (x==last ? (y==0 ? upright : (y==bottom ? lowright : right)) : ! 304: (y==0 ? upper : (y==bottom ? lower : normal))))[w->orientation]; ! 305: switch (op->nopts) { ! 306: case 0: ! 307: fflush(stdout); ! 308: abort(); ! 309: return; ! 310: case 1: ! 311: w->orientation=op->opts[0]; ! 312: break; ! 313: default: ! 314: w->orientation=op->opts[(int)(ranf()*(float)op->nopts)]; ! 315: } ! 316: cursor(x+=xinc[w->orientation], y+=yinc[w->orientation]); ! 317: if (!Wrap||x!=last||y!=bottom) putchar(flavor[n%6]); ! 318: ref[w->ypos[h]=y][w->xpos[h]=x]++; ! 319: } ! 320: fflush(stdout); ! 321: } ! 322: } ! 323: fputchar(c) ! 324: char c; ! 325: { ! 326: putchar(c); ! 327: } ! 328: float ranf() { ! 329: return((float)rand()/2147483647.); ! 330: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.