1*8869Smckusick 2*8869Smckusick static char sccsid[] = " rain.c 4.1 82/10/24 "; 3*8869Smckusick 4*8869Smckusick #include <stdio.h> 5*8869Smckusick #include <sgtty.h> 6*8869Smckusick #include <signal.h> 7*8869Smckusick /* rain 11/3/1980 EPS/CITHEP */ 8*8869Smckusick /* cc rain.c -o rain -O -ltermlib */ 9*8869Smckusick #define cursor(col,row) tputs(tgoto(CM,col,row),1,outc) 10*8869Smckusick outc(c) 11*8869Smckusick { 12*8869Smckusick putchar(c); 13*8869Smckusick } 14*8869Smckusick extern char *UP; 15*8869Smckusick extern short ospeed; 16*8869Smckusick struct sgttyb old_tty; 17*8869Smckusick char *LL, *TE, *TI; 18*8869Smckusick main(argc,argv) 19*8869Smckusick int argc; 20*8869Smckusick char *argv[]; 21*8869Smckusick { 22*8869Smckusick extern fputchar(); 23*8869Smckusick char *malloc(); 24*8869Smckusick char *getenv(); 25*8869Smckusick char *tgetstr(), *tgoto(); 26*8869Smckusick float ranf(); 27*8869Smckusick int onsig(); 28*8869Smckusick register int x, y, j; 29*8869Smckusick static int xpos[5], ypos[5]; 30*8869Smckusick register char *CM, *BC, *DN, *ND; 31*8869Smckusick char *tcp; 32*8869Smckusick register char *term; 33*8869Smckusick char tcb[100]; 34*8869Smckusick struct sgttyb sg; 35*8869Smckusick setbuf(stdout,malloc(BUFSIZ)); 36*8869Smckusick if (!(term=getenv("TERM"))) { 37*8869Smckusick fprintf(stderr,"%s: TERM: parameter not set\n",*argv); 38*8869Smckusick exit(1); 39*8869Smckusick } 40*8869Smckusick if (tgetent(malloc(1024),term)<=0) { 41*8869Smckusick fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term); 42*8869Smckusick exit(1); 43*8869Smckusick } 44*8869Smckusick tcp=tcb; 45*8869Smckusick if (!(CM=tgetstr("cm",&tcp))) { 46*8869Smckusick fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv); 47*8869Smckusick exit(1); 48*8869Smckusick } 49*8869Smckusick if (!(BC=tgetstr("bc",&tcp))) BC="\b"; 50*8869Smckusick if (!(DN=tgetstr("dn",&tcp))) DN="\n"; 51*8869Smckusick if (!(ND=tgetstr("nd",&tcp))) ND=" "; 52*8869Smckusick TE=tgetstr("te",&tcp); 53*8869Smckusick TI=tgetstr("ti",&tcp); 54*8869Smckusick UP=tgetstr("up",&tcp); 55*8869Smckusick if (!(LL=tgetstr("ll",&tcp))) strcpy(LL=malloc(10),tgoto(CM,0,23)); 56*8869Smckusick gtty(1, &sg); 57*8869Smckusick ospeed=sg.sg_ospeed; 58*8869Smckusick for (j=SIGHUP;j<=SIGTERM;j++) 59*8869Smckusick if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig); 60*8869Smckusick gtty(1, &old_tty); /* save tty bits for exit */ 61*8869Smckusick gtty(1, &sg); 62*8869Smckusick sg.sg_flags&=~(CRMOD|ECHO); 63*8869Smckusick stty(1, &sg); 64*8869Smckusick if (TI) fputs(TI,stdout); 65*8869Smckusick tputs(tgetstr("cl",&tcp),1,fputchar); 66*8869Smckusick fflush(stdout); 67*8869Smckusick for (j=5;--j>=0;) { 68*8869Smckusick xpos[j]=(int)(76.*ranf())+2; 69*8869Smckusick ypos[j]=(int)(20.*ranf())+2; 70*8869Smckusick } 71*8869Smckusick for (j=0;;) { 72*8869Smckusick x=(int)(76.*ranf())+2; 73*8869Smckusick y=(int)(20.*ranf())+2; 74*8869Smckusick cursor(x,y); fputchar('.'); 75*8869Smckusick cursor(xpos[j],ypos[j]); fputchar('o'); 76*8869Smckusick if (j==0) j=4; else --j; 77*8869Smckusick cursor(xpos[j],ypos[j]); fputchar('O'); 78*8869Smckusick if (j==0) j=4; else --j; 79*8869Smckusick cursor(xpos[j],ypos[j]-1); 80*8869Smckusick fputchar('-'); 81*8869Smckusick fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout); 82*8869Smckusick fputs("|.|",stdout); 83*8869Smckusick fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout); 84*8869Smckusick fputchar('-'); 85*8869Smckusick if (j==0) j=4; else --j; 86*8869Smckusick cursor(xpos[j],ypos[j]-2); fputchar('-'); 87*8869Smckusick fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout); 88*8869Smckusick fputs("/ \\",stdout); 89*8869Smckusick cursor(xpos[j]-2,ypos[j]); 90*8869Smckusick fputs("| O |",stdout); 91*8869Smckusick cursor(xpos[j]-1,ypos[j]+1); 92*8869Smckusick fputs("\\ /",stdout); 93*8869Smckusick fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout); 94*8869Smckusick fputchar('-'); 95*8869Smckusick if (j==0) j=4; else --j; 96*8869Smckusick cursor(xpos[j],ypos[j]-2); fputchar(' '); 97*8869Smckusick fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout); 98*8869Smckusick fputchar(' '); fputs(ND,stdout); fputchar(' '); 99*8869Smckusick cursor(xpos[j]-2,ypos[j]); 100*8869Smckusick fputchar(' '); fputs(ND,stdout); fputchar(' '); 101*8869Smckusick fputs(ND,stdout); fputchar(' '); 102*8869Smckusick cursor(xpos[j]-1,ypos[j]+1); 103*8869Smckusick fputchar(' '); fputs(ND,stdout); fputchar(' '); 104*8869Smckusick fputs(DN,stdout); fputs(BC,stdout); fputs(BC,stdout); 105*8869Smckusick fputchar(' '); 106*8869Smckusick xpos[j]=x; ypos[j]=y; 107*8869Smckusick fflush(stdout); 108*8869Smckusick } 109*8869Smckusick } 110*8869Smckusick onsig(n) 111*8869Smckusick int n; 112*8869Smckusick { 113*8869Smckusick struct sgttyb sg; 114*8869Smckusick fputs(LL, stdout); 115*8869Smckusick if (TE) fputs(TE, stdout); 116*8869Smckusick fflush(stdout); 117*8869Smckusick stty(1, &old_tty); 118*8869Smckusick kill(getpid(),n); 119*8869Smckusick _exit(0); 120*8869Smckusick } 121*8869Smckusick fputchar(c) 122*8869Smckusick char c; 123*8869Smckusick { 124*8869Smckusick putchar(c); 125*8869Smckusick } 126*8869Smckusick float ranf() { 127*8869Smckusick return((float)rand()/2147483647.); 128*8869Smckusick } 129