1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: char copyright[] = 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 10: All rights reserved.\n"; 11: #endif not lint 12: 13: #ifndef lint 14: static char sccsid[] = "@(#)rain.c 5.2 (Berkeley) 7/15/85"; 15: #endif not lint 16: 17: #define BSD 18: 19: #include <stdio.h> 20: #ifdef USG 21: #include <termio.h> 22: #else 23: #include <sgtty.h> 24: #endif 25: #include <signal.h> 26: /* rain 11/3/1980 EPS/CITHEP */ 27: /* cc rain.c -o rain -O -ltermlib */ 28: #define cursor(col,row) tputs(tgoto(CM,col,row),1,fputchar) 29: extern char *UP; 30: extern short ospeed; 31: #ifdef USG 32: struct termio old_tty; 33: #else 34: struct sgttyb old_tty; 35: #endif 36: char *LL, *TE, *TI; 37: main(argc,argv) 38: int argc; 39: char *argv[]; 40: { 41: extern fputchar(); 42: char *malloc(); 43: char *getenv(); 44: char *tgetstr(), *tgoto(); 45: float ranf(); 46: int onsig(); 47: register int x, y, j; 48: static int xpos[5], ypos[5]; 49: register char *CM, *BC, *DN, *ND; 50: int CO, LI; 51: char *tcp; 52: register char *term; 53: char tcb[100]; 54: #ifdef USG 55: struct termio sg; 56: #else 57: struct sgttyb sg; 58: #endif 59: float cols, lines; 60: 61: setbuf(stdout,malloc(BUFSIZ)); 62: if (!(term=getenv("TERM"))) { 63: fprintf(stderr,"%s: TERM: parameter not set\n",*argv); 64: exit(1); 65: } 66: if (tgetent(malloc(1024),term)<=0) { 67: fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term); 68: exit(1); 69: } 70: tcp=tcb; 71: if (!(CM=tgetstr("cm",&tcp))) { 72: fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv); 73: exit(1); 74: } 75: if (!(BC=tgetstr("bc",&tcp))) BC="\b"; 76: if (!(DN=tgetstr("dn",&tcp))) DN="\n"; 77: if (!(ND=tgetstr("nd",&tcp))) ND=" "; 78: if ((CO = tgetnum("co")) == -1) 79: CO = 80; 80: if ((LI = tgetnum("li")) == -1) 81: LI = 24; 82: cols = CO - 4; 83: lines = LI - 4; 84: TE=tgetstr("te",&tcp); 85: TI=tgetstr("ti",&tcp); 86: UP=tgetstr("up",&tcp); 87: if (!(LL=tgetstr("ll",&tcp))) strcpy(LL=malloc(10),tgoto(CM,0,23)); 88: #ifdef USG 89: ioctl(1, TCGETA, &sg); 90: ospeed=sg.c_cflag&CBAUD; 91: #else 92: gtty(1, &sg); 93: ospeed=sg.sg_ospeed; 94: #endif 95: for (j=SIGHUP;j<=SIGTERM;j++) 96: if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig); 97: #ifdef USG 98: ioctl(1, TCGETA, &old_tty); /* save tty bits for exit */ 99: ioctl(1, TCGETA, &sg); 100: sg.c_iflag&=~ICRNL; 101: sg.c_oflag&=~ONLCR; 102: sg.c_lflag&=~ECHO; 103: ioctl(1, TCSETAW, &sg); 104: #else 105: gtty(1, &old_tty); /* save tty bits for exit */ 106: gtty(1, &sg); 107: sg.sg_flags&=~(CRMOD|ECHO); 108: stty(1, &sg); 109: #endif 110: if (TI) tputs(TI,1,fputchar); 111: tputs(tgetstr("cl",&tcp),1,fputchar); 112: fflush(stdout); 113: for (j=5;--j>=0;) { 114: xpos[j]=(int)(cols*ranf())+2; 115: ypos[j]=(int)(lines*ranf())+2; 116: } 117: for (j=0;;) { 118: x=(int)(cols*ranf())+2; 119: y=(int)(lines*ranf())+2; 120: cursor(x,y); fputchar('.'); 121: cursor(xpos[j],ypos[j]); fputchar('o'); 122: if (j==0) j=4; else --j; 123: cursor(xpos[j],ypos[j]); fputchar('O'); 124: if (j==0) j=4; else --j; 125: cursor(xpos[j],ypos[j]-1); 126: fputchar('-'); 127: tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 128: fputs("|.|",stdout); 129: tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 130: fputchar('-'); 131: if (j==0) j=4; else --j; 132: cursor(xpos[j],ypos[j]-2); fputchar('-'); 133: tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 134: fputs("/ \\",stdout); 135: cursor(xpos[j]-2,ypos[j]); 136: fputs("| O |",stdout); 137: cursor(xpos[j]-1,ypos[j]+1); 138: fputs("\\ /",stdout); 139: tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 140: fputchar('-'); 141: if (j==0) j=4; else --j; 142: cursor(xpos[j],ypos[j]-2); fputchar(' '); 143: tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 144: fputchar(' '); tputs(ND,1,fputchar); fputchar(' '); 145: cursor(xpos[j]-2,ypos[j]); 146: fputchar(' '); tputs(ND,1,fputchar); fputchar(' '); 147: tputs(ND,1,fputchar); fputchar(' '); 148: cursor(xpos[j]-1,ypos[j]+1); 149: fputchar(' '); tputs(ND,1,fputchar); fputchar(' '); 150: tputs(DN,1,fputchar); tputs(BC,1,fputchar); tputs(BC,1,fputchar); 151: fputchar(' '); 152: xpos[j]=x; ypos[j]=y; 153: fflush(stdout); 154: } 155: } 156: onsig(n) 157: int n; 158: { 159: #ifdef USG 160: struct termio sg; 161: #else 162: struct sgttyb sg; 163: #endif 164: int fputchar(); 165: 166: tputs(LL, 1, fputchar); 167: if (TE) tputs(TE, 1, fputchar); 168: fflush(stdout); 169: #ifdef USG 170: ioctl(1, TCSETAW, &old_tty); 171: #else 172: stty(1, &old_tty); 173: #endif 174: kill(getpid(),n); 175: _exit(0); 176: } 177: fputchar(c) 178: char c; 179: { 180: putchar(c); 181: } 182: float ranf() { 183: #if defined(BSD) && !defined(pdp11) 184: return((float)rand()/2147483647.); 185: #else 186: return((float)rand()/32767.); 187: #endif 188: }