summaryrefslogtreecommitdiffstats
path: root/games/larn/nap.c
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1994-09-04 04:03:31 +0000
committerjkh <jkh@FreeBSD.org>1994-09-04 04:03:31 +0000
commit057afceb86e030ad65b0130436860d9a18066186 (patch)
treea0ced9c9b9278eb776d89cd2565c27ddcf020b51 /games/larn/nap.c
parenteedec95276cdb8aef98e92c5371000f10b8d6ba7 (diff)
downloadFreeBSD-src-057afceb86e030ad65b0130436860d9a18066186.zip
FreeBSD-src-057afceb86e030ad65b0130436860d9a18066186.tar.gz
Bring in the 4.4 Lite games directory, modulo man page changes and segregation
of the x11 based games. I'm not going to tag the originals with bsd_44_lite and do this in two stages since it's just not worth it for this collection, and I've got directory renames to deal with that way. Bleah. Submitted by: jkh
Diffstat (limited to 'games/larn/nap.c')
-rw-r--r--games/larn/nap.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/games/larn/nap.c b/games/larn/nap.c
new file mode 100644
index 0000000..b7a877d
--- /dev/null
+++ b/games/larn/nap.c
@@ -0,0 +1,116 @@
+/* nap.c Larn is copyrighted 1986 by Noah Morgan. */
+#include <signal.h>
+#include <sys/types.h>
+#ifdef SYSV
+#include <sys/times.h>
+#else
+#ifdef BSD
+#include <sys/timeb.h>
+#endif BSD
+#endif SYSV
+
+/*
+ * routine to take a nap for n milliseconds
+ */
+nap(x)
+ register int x;
+ {
+ if (x<=0) return; /* eliminate chance for infinite loop */
+ lflush();
+ if (x > 999) sleep(x/1000); else napms(x);
+ }
+
+#ifdef NONAP
+napms(x) /* do nothing */
+ int x;
+ {
+ }
+#else NONAP
+#ifdef SYSV
+/* napms - sleep for time milliseconds - uses times() */
+/* this assumes that times returns a relative time in 60ths of a second */
+/* this will do horrible things if your times() returns seconds! */
+napms(time)
+ int time;
+ {
+ long matchclock, times();
+ struct tms stats;
+
+ if (time<=0) time=1; /* eliminate chance for infinite loop */
+ if ((matchclock = times(&stats)) == -1 || matchclock == 0)
+ return; /* error, or BSD style times() */
+ matchclock += (time / 17); /*17 ms/tic is 1000 ms/sec / 60 tics/sec */
+
+ while(matchclock < times(&stats))
+ ;
+ }
+
+#else not SYSV
+#ifdef BSD
+#ifdef SIGVTALRM
+/* This must be BSD 4.2! */
+#include <sys/time.h>
+#define bit(_a) (1<<((_a)-1))
+
+static nullf()
+ {
+ }
+
+/* napms - sleep for time milliseconds - uses setitimer() */
+napms(time)
+ int time;
+ {
+ struct itimerval timeout;
+ int (*oldhandler) ();
+ int oldsig;
+
+ if (time <= 0) return;
+
+ timerclear(&timeout.it_interval);
+ timeout.it_value.tv_sec = time / 1000;
+ timeout.it_value.tv_usec = (time % 1000) * 1000;
+
+ oldsig = sigblock(bit(SIGALRM));
+ setitimer(ITIMER_REAL, &timeout, (struct itimerval *)0);
+ oldhandler = signal(SIGALRM, nullf);
+ sigpause(oldsig);
+ signal(SIGALRM, oldhandler);
+ sigsetmask(oldsig);
+ }
+
+#else
+/* napms - sleep for time milliseconds - uses ftime() */
+
+static napms(time)
+ int time;
+ {
+ /* assumed to be BSD UNIX */
+ struct timeb _gtime;
+ time_t matchtime;
+ unsigned short matchmilli;
+ register struct timeb *tp = & _gtime;
+
+ if (time <= 0) return;
+ ftime(tp);
+ matchmilli = tp->millitm + time;
+ matchtime = tp->time;
+ while (matchmilli >= 1000)
+ {
+ ++matchtime;
+ matchmilli -= 1000;
+ }
+
+ while(1)
+ {
+ ftime(tp);
+ if ((tp->time > matchtime) ||
+ ((tp->time == matchtime) && (tp->millitm >= matchmilli)))
+ break;
+ }
+ }
+#endif
+#else not BSD
+static napms(time) int time; {} /* do nothing, forget it */
+#endif BSD
+#endif SYSV
+#endif NONAP
OpenPOWER on IntegriCloud