121200Sdist /* 221200Sdist * Copyright (c) 1980 Regents of the University of California. 321200Sdist * All rights reserved. The Berkeley software License Agreement 421200Sdist * specifies the terms and conditions for redistribution. 521200Sdist */ 68869Smckusick 721200Sdist #ifndef lint 821200Sdist char copyright[] = 921200Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 1021200Sdist All rights reserved.\n"; 1121200Sdist #endif not lint 128869Smckusick 1321200Sdist #ifndef lint 14*23869Smckusick static char sccsid[] = "@(#)rain.c 5.2 (Berkeley) 07/15/85"; 1521200Sdist #endif not lint 1621200Sdist 17*23869Smckusick #define BSD 18*23869Smckusick 198869Smckusick #include <stdio.h> 20*23869Smckusick #ifdef USG 21*23869Smckusick #include <termio.h> 22*23869Smckusick #else 238869Smckusick #include <sgtty.h> 24*23869Smckusick #endif 258869Smckusick #include <signal.h> 268869Smckusick /* rain 11/3/1980 EPS/CITHEP */ 278869Smckusick /* cc rain.c -o rain -O -ltermlib */ 28*23869Smckusick #define cursor(col,row) tputs(tgoto(CM,col,row),1,fputchar) 298869Smckusick extern char *UP; 308869Smckusick extern short ospeed; 31*23869Smckusick #ifdef USG 32*23869Smckusick struct termio old_tty; 33*23869Smckusick #else 348869Smckusick struct sgttyb old_tty; 35*23869Smckusick #endif 368869Smckusick char *LL, *TE, *TI; 378869Smckusick main(argc,argv) 388869Smckusick int argc; 398869Smckusick char *argv[]; 408869Smckusick { 418869Smckusick extern fputchar(); 428869Smckusick char *malloc(); 438869Smckusick char *getenv(); 448869Smckusick char *tgetstr(), *tgoto(); 458869Smckusick float ranf(); 468869Smckusick int onsig(); 478869Smckusick register int x, y, j; 488869Smckusick static int xpos[5], ypos[5]; 498869Smckusick register char *CM, *BC, *DN, *ND; 50*23869Smckusick int CO, LI; 518869Smckusick char *tcp; 528869Smckusick register char *term; 538869Smckusick char tcb[100]; 54*23869Smckusick #ifdef USG 55*23869Smckusick struct termio sg; 56*23869Smckusick #else 578869Smckusick struct sgttyb sg; 58*23869Smckusick #endif 59*23869Smckusick float cols, lines; 60*23869Smckusick 618869Smckusick setbuf(stdout,malloc(BUFSIZ)); 628869Smckusick if (!(term=getenv("TERM"))) { 638869Smckusick fprintf(stderr,"%s: TERM: parameter not set\n",*argv); 648869Smckusick exit(1); 658869Smckusick } 668869Smckusick if (tgetent(malloc(1024),term)<=0) { 678869Smckusick fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term); 688869Smckusick exit(1); 698869Smckusick } 708869Smckusick tcp=tcb; 718869Smckusick if (!(CM=tgetstr("cm",&tcp))) { 728869Smckusick fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv); 738869Smckusick exit(1); 748869Smckusick } 758869Smckusick if (!(BC=tgetstr("bc",&tcp))) BC="\b"; 768869Smckusick if (!(DN=tgetstr("dn",&tcp))) DN="\n"; 778869Smckusick if (!(ND=tgetstr("nd",&tcp))) ND=" "; 78*23869Smckusick if ((CO = tgetnum("co")) == -1) 79*23869Smckusick CO = 80; 80*23869Smckusick if ((LI = tgetnum("li")) == -1) 81*23869Smckusick LI = 24; 82*23869Smckusick cols = CO - 4; 83*23869Smckusick lines = LI - 4; 848869Smckusick TE=tgetstr("te",&tcp); 858869Smckusick TI=tgetstr("ti",&tcp); 868869Smckusick UP=tgetstr("up",&tcp); 878869Smckusick if (!(LL=tgetstr("ll",&tcp))) strcpy(LL=malloc(10),tgoto(CM,0,23)); 88*23869Smckusick #ifdef USG 89*23869Smckusick ioctl(1, TCGETA, &sg); 90*23869Smckusick ospeed=sg.c_cflag&CBAUD; 91*23869Smckusick #else 928869Smckusick gtty(1, &sg); 938869Smckusick ospeed=sg.sg_ospeed; 94*23869Smckusick #endif 958869Smckusick for (j=SIGHUP;j<=SIGTERM;j++) 968869Smckusick if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig); 97*23869Smckusick #ifdef USG 98*23869Smckusick ioctl(1, TCGETA, &old_tty); /* save tty bits for exit */ 99*23869Smckusick ioctl(1, TCGETA, &sg); 100*23869Smckusick sg.c_iflag&=~ICRNL; 101*23869Smckusick sg.c_oflag&=~ONLCR; 102*23869Smckusick sg.c_lflag&=~ECHO; 103*23869Smckusick ioctl(1, TCSETAW, &sg); 104*23869Smckusick #else 1058869Smckusick gtty(1, &old_tty); /* save tty bits for exit */ 1068869Smckusick gtty(1, &sg); 1078869Smckusick sg.sg_flags&=~(CRMOD|ECHO); 1088869Smckusick stty(1, &sg); 109*23869Smckusick #endif 110*23869Smckusick if (TI) tputs(TI,1,fputchar); 1118869Smckusick tputs(tgetstr("cl",&tcp),1,fputchar); 1128869Smckusick fflush(stdout); 1138869Smckusick for (j=5;--j>=0;) { 114*23869Smckusick xpos[j]=(int)(cols*ranf())+2; 115*23869Smckusick ypos[j]=(int)(lines*ranf())+2; 1168869Smckusick } 1178869Smckusick for (j=0;;) { 118*23869Smckusick x=(int)(cols*ranf())+2; 119*23869Smckusick y=(int)(lines*ranf())+2; 1208869Smckusick cursor(x,y); fputchar('.'); 1218869Smckusick cursor(xpos[j],ypos[j]); fputchar('o'); 1228869Smckusick if (j==0) j=4; else --j; 1238869Smckusick cursor(xpos[j],ypos[j]); fputchar('O'); 1248869Smckusick if (j==0) j=4; else --j; 1258869Smckusick cursor(xpos[j],ypos[j]-1); 1268869Smckusick fputchar('-'); 127*23869Smckusick tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 1288869Smckusick fputs("|.|",stdout); 129*23869Smckusick tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 1308869Smckusick fputchar('-'); 1318869Smckusick if (j==0) j=4; else --j; 1328869Smckusick cursor(xpos[j],ypos[j]-2); fputchar('-'); 133*23869Smckusick tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 1348869Smckusick fputs("/ \\",stdout); 1358869Smckusick cursor(xpos[j]-2,ypos[j]); 1368869Smckusick fputs("| O |",stdout); 1378869Smckusick cursor(xpos[j]-1,ypos[j]+1); 1388869Smckusick fputs("\\ /",stdout); 139*23869Smckusick tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 1408869Smckusick fputchar('-'); 1418869Smckusick if (j==0) j=4; else --j; 1428869Smckusick cursor(xpos[j],ypos[j]-2); fputchar(' '); 143*23869Smckusick tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 144*23869Smckusick fputchar(' '); tputs(ND,1,fputchar); fputchar(' '); 1458869Smckusick cursor(xpos[j]-2,ypos[j]); 146*23869Smckusick fputchar(' '); tputs(ND,1,fputchar); fputchar(' '); 147*23869Smckusick tputs(ND,1,fputchar); fputchar(' '); 1488869Smckusick cursor(xpos[j]-1,ypos[j]+1); 149*23869Smckusick fputchar(' '); tputs(ND,1,fputchar); fputchar(' '); 150*23869Smckusick tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 1518869Smckusick fputchar(' '); 1528869Smckusick xpos[j]=x; ypos[j]=y; 1538869Smckusick fflush(stdout); 1548869Smckusick } 1558869Smckusick } 1568869Smckusick onsig(n) 1578869Smckusick int n; 1588869Smckusick { 159*23869Smckusick #ifdef USG 160*23869Smckusick struct termio sg; 161*23869Smckusick #else 1628869Smckusick struct sgttyb sg; 163*23869Smckusick #endif 164*23869Smckusick tputs(LL, 1, fputchar); 165*23869Smckusick if (TE) tputs(TE, 1, fputchar); 1668869Smckusick fflush(stdout); 167*23869Smckusick #ifdef USG 168*23869Smckusick ioctl(1, TCSETAW, &old_tty); 169*23869Smckusick #else 1708869Smckusick stty(1, &old_tty); 171*23869Smckusick #endif 1728869Smckusick kill(getpid(),n); 1738869Smckusick _exit(0); 1748869Smckusick } 1758869Smckusick fputchar(c) 1768869Smckusick char c; 1778869Smckusick { 1788869Smckusick putchar(c); 1798869Smckusick } 1808869Smckusick float ranf() { 181*23869Smckusick #ifdef BSD 1828869Smckusick return((float)rand()/2147483647.); 183*23869Smckusick #else 184*23869Smckusick return((float)rand()/32767.); 185*23869Smckusick #endif 1868869Smckusick } 187