+
+static char sccsid[] = " rain.c 4.1 82/10/24 ";
+
+#include <stdio.h>
+#include <sgtty.h>
+#include <signal.h>
+/* rain 11/3/1980 EPS/CITHEP */
+/* cc rain.c -o rain -O -ltermlib */
+#define cursor(col,row) tputs(tgoto(CM,col,row),1,outc)
+outc(c)
+{
+ putchar(c);
+}
+extern char *UP;
+extern short ospeed;
+struct sgttyb old_tty;
+char *LL, *TE, *TI;
+main(argc,argv)
+int argc;
+char *argv[];
+{
+ extern fputchar();
+ char *malloc();
+ char *getenv();
+ char *tgetstr(), *tgoto();
+ float ranf();
+ int onsig();
+ register int x, y, j;
+ static int xpos[5], ypos[5];
+ register char *CM, *BC, *DN, *ND;
+ char *tcp;
+ register char *term;
+ char tcb[100];
+ struct sgttyb sg;
+ setbuf(stdout,malloc(BUFSIZ));
+ if (!(term=getenv("TERM"))) {
+ fprintf(stderr,"%s: TERM: parameter not set\n",*argv);
+ exit(1);
+ }
+ if (tgetent(malloc(1024),term)<=0) {
+ fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term);
+ exit(1);
+ }
+ tcp=tcb;
+ if (!(CM=tgetstr("cm",&tcp))) {
+ fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv);
+ exit(1);
+ }
+ if (!(BC=tgetstr("bc",&tcp))) BC="\b";
+ if (!(DN=tgetstr("dn",&tcp))) DN="\n";
+ if (!(ND=tgetstr("nd",&tcp))) ND=" ";
+ TE=tgetstr("te",&tcp);
+ TI=tgetstr("ti",&tcp);
+ UP=tgetstr("up",&tcp);
+ if (!(LL=tgetstr("ll",&tcp))) strcpy(LL=malloc(10),tgoto(CM,0,23));
+ gtty(1, &sg);
+ ospeed=sg.sg_ospeed;
+ for (j=SIGHUP;j<=SIGTERM;j++)
+ if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig);
+ gtty(1, &old_tty); /* save tty bits for exit */
+ gtty(1, &sg);
+ sg.sg_flags&=~(CRMOD|ECHO);
+ stty(1, &sg);
+ if (TI) fputs(TI,stdout);
+ tputs(tgetstr("cl",&tcp),1,fputchar);
+ fflush(stdout);
+ for (j=5;--j>=0;) {
+ xpos[j]=(int)(76.*ranf())+2;
+ ypos[j]=(int)(20.*ranf())+2;
+ }
+ for (j=0;;) {
+ x=(int)(76.*ranf())+2;
+ y=(int)(20.*ranf())+2;
+ cursor(x,y); fputchar('.');
+ cursor(xpos[j],ypos[j]); fputchar('o');
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]); fputchar('O');
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]-1);
+ fputchar('-');
+ fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
+ fputs("|.|",stdout);
+ fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
+ fputchar('-');
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]-2); fputchar('-');
+ fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
+ fputs("/ \\",stdout);
+ cursor(xpos[j]-2,ypos[j]);
+ fputs("| O |",stdout);
+ cursor(xpos[j]-1,ypos[j]+1);
+ fputs("\\ /",stdout);
+ fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
+ fputchar('-');
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]-2); fputchar(' ');
+ fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
+ fputchar(' '); fputs(ND,stdout); fputchar(' ');
+ cursor(xpos[j]-2,ypos[j]);
+ fputchar(' '); fputs(ND,stdout); fputchar(' ');
+ fputs(ND,stdout); fputchar(' ');
+ cursor(xpos[j]-1,ypos[j]+1);
+ fputchar(' '); fputs(ND,stdout); fputchar(' ');
+ fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout);
+ fputchar(' ');
+ xpos[j]=x; ypos[j]=y;
+ fflush(stdout);
+ }
+}
+onsig(n)
+int n;
+{
+ struct sgttyb sg;
+ fputs(LL, stdout);
+ if (TE) fputs(TE, stdout);
+ fflush(stdout);
+ stty(1, &old_tty);
+ kill(getpid(),n);
+ _exit(0);
+}
+fputchar(c)
+char c;
+{
+ putchar(c);
+}
+float ranf() {
+ return((float)rand()/2147483647.);
+}