|
|
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.