|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: char copyright[] =
20: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
21: All rights reserved.\n";
22: #endif /* not lint */
23:
24: #ifndef lint
25: static char sccsid[] = "@(#)rain.c 5.4 (Berkeley) 6/27/88";
26: #endif /* not lint */
27:
28: /*
29: * rain 11/3/1980 EPS/CITHEP
30: * cc rain.c -o rain -O -ltermlib
31: */
32:
33: #include <sys/types.h>
34: #include <stdio.h>
35: #ifdef USG
36: #include <termio.h>
37: #else
38: #include <sgtty.h>
39: #endif
40: #include <signal.h>
41:
42: #define cursor(c, r) tputs(tgoto(CM, c, r), 1, fputchar)
43:
44: #ifdef USG
45: static struct termio sg, old_tty;
46: #else
47: static struct sgttyb sg, old_tty;
48: #endif
49:
50: int fputchar();
51: char *LL, *TE, *tgoto();
52:
53: main(argc, argv)
54: int argc;
55: char **argv;
56: {
57: extern short ospeed;
58: extern char *UP;
59: register int x, y, j;
60: register char *CM, *BC, *DN, *ND, *term;
61: char *TI, *tcp, *mp, tcb[100],
62: *malloc(), *getenv(), *strcpy(), *tgetstr();
63: long cols, lines, random();
64: int xpos[5], ypos[5], onsig();
65:
66: if (!(term = getenv("TERM"))) {
67: fprintf(stderr, "%s: TERM: parameter not set\n", *argv);
68: exit(1);
69: }
70: if (!(mp = malloc((u_int)1024))) {
71: fprintf(stderr, "%s: out of space.\n", *argv);
72: exit(1);
73: }
74: if (tgetent(mp, term) <= 0) {
75: fprintf(stderr, "%s: %s: unknown terminal type\n", *argv, term);
76: exit(1);
77: }
78: tcp = tcb;
79: if (!(CM = tgetstr("cm", &tcp))) {
80: fprintf(stderr, "%s: terminal not capable of cursor motion\n", *argv);
81: exit(1);
82: }
83: if (!(BC = tgetstr("bc", &tcp)))
84: BC = "\b";
85: if (!(DN = tgetstr("dn", &tcp)))
86: DN = "\n";
87: if (!(ND = tgetstr("nd", &tcp)))
88: ND = " ";
89: if ((cols = tgetnum("co")) == -1)
90: cols = 80;
91: if ((lines = tgetnum("li")) == -1)
92: lines = 24;
93: cols -= 4;
94: lines -= 4;
95: TE = tgetstr("te", &tcp);
96: TI = tgetstr("ti", &tcp);
97: UP = tgetstr("up", &tcp);
98: if (!(LL = tgetstr("ll", &tcp))) {
99: if (!(LL = malloc((u_int)10))) {
100: fprintf(stderr, "%s: out of space.\n", *argv);
101: exit(1);
102: }
103: (void)strcpy(LL, tgoto(CM, 0, 23));
104: }
105: #ifdef USG
106: ioctl(1, TCGETA, &sg);
107: ospeed = sg.c_cflag&CBAUD;
108: #else
109: gtty(1, &sg);
110: ospeed = sg.sg_ospeed;
111: #endif
112: (void)signal(SIGHUP, onsig);
113: (void)signal(SIGINT, onsig);
114: (void)signal(SIGQUIT, onsig);
115: (void)signal(SIGSTOP, onsig);
116: (void)signal(SIGTSTP, onsig);
117: (void)signal(SIGTERM, onsig);
118: #ifdef USG
119: ioctl(1, TCGETA, &old_tty); /* save tty bits for exit */
120: ioctl(1, TCGETA, &sg);
121: sg.c_iflag &= ~ICRNL;
122: sg.c_oflag &= ~ONLCR;
123: sg.c_lflag &= ~ECHO;
124: ioctl(1, TCSETAW, &sg);
125: #else
126: gtty(1, &old_tty); /* save tty bits for exit */
127: gtty(1, &sg);
128: sg.sg_flags &= ~(CRMOD|ECHO);
129: stty(1, &sg);
130: #endif
131: if (TI)
132: tputs(TI, 1, fputchar);
133: tputs(tgetstr("cl", &tcp), 1, fputchar);
134: (void)fflush(stdout);
135: for (j = 4; j >= 0; --j) {
136: xpos[j] = random() % cols + 2;
137: ypos[j] = random() % lines + 2;
138: }
139: for (j = 0;;) {
140: x = random() % cols + 2;
141: y = random() % lines + 2;
142: cursor(x, y);
143: fputchar('.');
144: cursor(xpos[j], ypos[j]);
145: fputchar('o');
146: if (!j--)
147: j = 4;
148: cursor(xpos[j], ypos[j]);
149: fputchar('O');
150: if (!j--)
151: j = 4;
152: cursor(xpos[j], ypos[j] - 1);
153: fputchar('-');
154: tputs(DN, 1, fputchar);
155: tputs(BC, 1, fputchar);
156: tputs(BC, 1, fputchar);
157: fputs("|.|", stdout);
158: tputs(DN, 1, fputchar);
159: tputs(BC, 1, fputchar);
160: tputs(BC, 1, fputchar);
161: fputchar('-');
162: if (!j--)
163: j = 4;
164: cursor(xpos[j], ypos[j] - 2);
165: fputchar('-');
166: tputs(DN, 1, fputchar);
167: tputs(BC, 1, fputchar);
168: tputs(BC, 1, fputchar);
169: fputs("/ \\", stdout);
170: cursor(xpos[j] - 2, ypos[j]);
171: fputs("| O |", stdout);
172: cursor(xpos[j] - 1, ypos[j] + 1);
173: fputs("\\ /", stdout);
174: tputs(DN, 1, fputchar);
175: tputs(BC, 1, fputchar);
176: tputs(BC, 1, fputchar);
177: fputchar('-');
178: if (!j--)
179: j = 4;
180: cursor(xpos[j], ypos[j] - 2);
181: fputchar(' ');
182: tputs(DN, 1, fputchar);
183: tputs(BC, 1, fputchar);
184: tputs(BC, 1, fputchar);
185: fputchar(' ');
186: tputs(ND, 1, fputchar);
187: fputchar(' ');
188: cursor(xpos[j] - 2, ypos[j]);
189: fputchar(' ');
190: tputs(ND, 1, fputchar);
191: fputchar(' ');
192: tputs(ND, 1, fputchar);
193: fputchar(' ');
194: cursor(xpos[j] - 1, ypos[j] + 1);
195: fputchar(' ');
196: tputs(ND, 1, fputchar);
197: fputchar(' ');
198: tputs(DN, 1, fputchar);
199: tputs(BC, 1, fputchar);
200: tputs(BC, 1, fputchar);
201: fputchar(' ');
202: xpos[j] = x;
203: ypos[j] = y;
204: (void)fflush(stdout);
205: }
206: }
207:
208: static
209: onsig()
210: {
211: tputs(LL, 1, fputchar);
212: if (TE)
213: tputs(TE, 1, fputchar);
214: (void)fflush(stdout);
215: #ifdef USG
216: ioctl(1, TCSETAW, &old_tty);
217: #else
218: stty(1, &old_tty);
219: #endif
220: exit(0);
221: }
222:
223: static
224: fputchar(c)
225: char c;
226: {
227: putchar(c);
228: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.