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