1 /* nap.c Larn is copyrighted 1986 by Noah Morgan. */ 2 #include <signal.h> 3 #include <sys/types.h> 4 #ifdef SYSV 5 #include <sys/times.h> 6 #else 7 #ifdef BSD 8 #include <sys/timeb.h> 9 #endif BSD 10 #endif SYSV 11 12 /* 13 * routine to take a nap for n milliseconds 14 */ nap(x)15nap(x) 16 register int x; 17 { 18 if (x<=0) return; /* eliminate chance for infinite loop */ 19 lflush(); 20 if (x > 999) sleep(x/1000); else napms(x); 21 } 22 23 #ifdef NONAP napms(x)24napms(x) /* do nothing */ 25 int x; 26 { 27 } 28 #else NONAP 29 #ifdef SYSV 30 /* napms - sleep for time milliseconds - uses times() */ 31 /* this assumes that times returns a relative time in 60ths of a second */ 32 /* this will do horrible things if your times() returns seconds! */ napms(time)33napms(time) 34 int time; 35 { 36 long matchclock, times(); 37 struct tms stats; 38 39 if (time<=0) time=1; /* eliminate chance for infinite loop */ 40 if ((matchclock = times(&stats)) == -1 || matchclock == 0) 41 return; /* error, or BSD style times() */ 42 matchclock += (time / 17); /*17 ms/tic is 1000 ms/sec / 60 tics/sec */ 43 44 while(matchclock < times(&stats)) 45 ; 46 } 47 48 #else not SYSV 49 #ifdef BSD 50 #ifdef SIGVTALRM 51 /* This must be BSD 4.2! */ 52 #include <sys/time.h> 53 #define bit(_a) (1<<((_a)-1)) 54 nullf()55static nullf() 56 { 57 } 58 59 /* napms - sleep for time milliseconds - uses setitimer() */ napms(time)60napms(time) 61 int time; 62 { 63 struct itimerval timeout; 64 int (*oldhandler) (); 65 int oldsig; 66 67 if (time <= 0) return; 68 69 timerclear(&timeout.it_interval); 70 timeout.it_value.tv_sec = time / 1000; 71 timeout.it_value.tv_usec = (time % 1000) * 1000; 72 73 oldsig = sigblock(bit(SIGALRM)); 74 setitimer(ITIMER_REAL, &timeout, (struct itimerval *)0); 75 oldhandler = signal(SIGALRM, nullf); 76 sigpause(oldsig); 77 signal(SIGALRM, oldhandler); 78 sigsetmask(oldsig); 79 } 80 81 #else 82 /* napms - sleep for time milliseconds - uses ftime() */ 83 napms(time)84static napms(time) 85 int time; 86 { 87 /* assumed to be BSD UNIX */ 88 struct timeb _gtime; 89 time_t matchtime; 90 unsigned short matchmilli; 91 register struct timeb *tp = & _gtime; 92 93 if (time <= 0) return; 94 ftime(tp); 95 matchmilli = tp->millitm + time; 96 matchtime = tp->time; 97 while (matchmilli >= 1000) 98 { 99 ++matchtime; 100 matchmilli -= 1000; 101 } 102 103 while(1) 104 { 105 ftime(tp); 106 if ((tp->time > matchtime) || 107 ((tp->time == matchtime) && (tp->millitm >= matchmilli))) 108 break; 109 } 110 } 111 #endif 112 #else not BSD napms(time)113static napms(time) int time; {} /* do nothing, forget it */ 114 #endif BSD 115 #endif SYSV 116 #endif NONAP 117