summaryrefslogtreecommitdiffstats
path: root/warp/util.c
diff options
context:
space:
mode:
authorkamil <kamil@NetBSD.org>2020-11-09 23:37:05 +0000
committerkamil <kamil@NetBSD.org>2020-11-09 23:37:05 +0000
commita931697f3be302466855163a7e216ffee7766445 (patch)
tree0ac2ab10bd68f8317dcf403536f0d612730ef35c /warp/util.c
parent6d16c3b48f5f1f377e2be346c1189d9f8edac22d (diff)
downloadbsdgames-darwin-a931697f3be302466855163a7e216ffee7766445.tar.gz
bsdgames-darwin-a931697f3be302466855163a7e216ffee7766445.tar.zst
bsdgames-darwin-a931697f3be302466855163a7e216ffee7766445.zip
Add Warp Kit, Version 7.0 by Larry Wall
Warp is a real-time space war game that doesn't get boring very quickly. Read warp.doc and the manual page for more information. games/warp originally distributed with 4.3BSD-Reno, is back to the BSD world via NetBSD. Its remnants were still mentioned in games/Makefile. Larry Wall, the original author and the copyright holder, generously donated the game and copyright to The NetBSD Foundation, Inc. Import the game sources as-is from 4.3BSD-Reno, with the cession of the copyright and license to BSD-2-clause NetBSD-style. Signed-off-by: Larry Wall <larry@wall.org> Signed-off-by: Kamil Rytarowski <kamil@netbsd.org>
Diffstat (limited to 'warp/util.c')
-rw-r--r--warp/util.c344
1 files changed, 344 insertions, 0 deletions
diff --git a/warp/util.c b/warp/util.c
new file mode 100644
index 00000000..a446d7d4
--- /dev/null
+++ b/warp/util.c
@@ -0,0 +1,344 @@
+/* $Header: /cvsroot/src/games/warp/util.c,v 1.1 2020/11/09 23:37:05 kamil Exp $ */
+
+/* $Log: util.c,v $
+/* Revision 1.1 2020/11/09 23:37:05 kamil
+/* Add Warp Kit, Version 7.0 by Larry Wall
+/*
+/* Warp is a real-time space war game that doesn't get boring very quickly.
+/* Read warp.doc and the manual page for more information.
+/*
+/* games/warp originally distributed with 4.3BSD-Reno, is back to the BSD
+/* world via NetBSD. Its remnants were still mentioned in games/Makefile.
+/*
+/* Larry Wall, the original author and the copyright holder, generously
+/* donated the game and copyright to The NetBSD Foundation, Inc.
+/*
+/* Import the game sources as-is from 4.3BSD-Reno, with the cession
+/* of the copyright and license to BSD-2-clause NetBSD-style.
+/*
+/* Signed-off-by: Larry Wall <larry@wall.org>
+/* Signed-off-by: Kamil Rytarowski <kamil@netbsd.org>
+/*
+ * Revision 7.0.1.2 86/10/20 12:07:46 lwall
+ * Made all exits reset tty.
+ *
+ * Revision 7.0.1.1 86/10/16 10:54:02 lwall
+ * Added Damage. Fixed random bugs.
+ *
+ * Revision 7.0 86/10/08 15:14:31 lwall
+ * Split into separate files. Added amoebas and pirates.
+ *
+ */
+
+#include "EXTERN.h"
+#include "warp.h"
+#include "sys/dir.h"
+#include "object.h"
+#include "sig.h"
+#include "term.h"
+#include "INTERN.h"
+#include "util.h"
+
+void
+util_init()
+{
+ ;
+}
+
+void
+movc3(len,src,dest)
+#ifdef vax
+char *dest, *src;
+int len;
+{
+ asm("movc3 4(ap),*8(ap),*12(ap)");
+}
+#else
+Reg1 char *dest;
+Reg2 char *src;
+Reg3 int len;
+{
+ if (dest <= src) {
+ for (; len; len--) {
+ *dest++ = *src++;
+ }
+ }
+ else {
+ dest += len;
+ src += len;
+ for (; len; len--) {
+ *--dest = *--src;
+ }
+ }
+}
+#endif
+
+void
+no_can_do(what)
+char *what;
+{
+ fprintf(stderr,"Sorry, your terminal is too %s to play warp.\r\n",what);
+ finalize(1);
+}
+
+int
+exdis(maxnum)
+int maxnum;
+{
+ double temp, temp2;
+ double exp();
+ double log();
+
+ temp = (double) maxnum;
+#ifndef lint
+ temp2 = (double) myrand();
+#else
+ temp2 = 0.0;
+#endif
+#if RANDBITS == 15
+ return (int) exp(temp2 * log(temp)/0x7fff);
+#else
+#if RANDBITS == 16
+ return (int) exp(temp2 * log(temp)/0xffff);
+#else
+ return (int) exp(temp2 * log(temp)/0x7fffffff);
+#endif
+#endif
+}
+
+static char nomem[] = "warp: out of memory!\r\n";
+
+/* paranoid version of malloc */
+
+char *
+safemalloc(size)
+MEM_SIZE size;
+{
+ char *ptr;
+ char *malloc();
+
+ ptr = malloc(size?size:1); /* malloc(0) is NASTY on our system */
+ if (ptr != Nullch)
+ return ptr;
+ else {
+ fputs(nomem,stdout);
+ sig_catcher(0);
+ }
+ /*NOTREACHED*/
+}
+
+/* safe version of string copy */
+
+char *
+safecpy(to,from,len)
+char *to;
+Reg2 char *from;
+Reg1 int len;
+{
+ Reg3 char *dest = to;
+
+ if (from != Nullch)
+ for (len--; len && (*dest++ = *from++); len--) ;
+ *dest = '\0';
+ return to;
+}
+
+/* copy a string up to some (non-backslashed) delimiter, if any */
+
+char *
+cpytill(to,from,delim)
+Reg2 char *to;
+Reg1 char *from;
+Reg3 int delim;
+{
+ for (; *from; from++,to++) {
+ if (*from == '\\' && from[1] == delim)
+ from++;
+ else if (*from == delim)
+ break;
+ *to = *from;
+ }
+ *to = '\0';
+ return from;
+}
+
+/* return ptr to little string in big string, NULL if not found */
+
+char *
+instr(big, little)
+char *big, *little;
+
+{
+ Reg3 char *t;
+ Reg1 char *s;
+ Reg2 char *x;
+
+ for (t = big; *t; t++) {
+ for (x=t,s=little; *s; x++,s++) {
+ if (!*x)
+ return Nullch;
+ if (*s != *x)
+ break;
+ }
+ if (!*s)
+ return t;
+ }
+ return Nullch;
+}
+
+/* effective access */
+
+#ifdef SETUIDGID
+int
+eaccess(filename, mod)
+char *filename;
+int mod;
+{
+ int protection, euid;
+
+ mod &= 7; /* remove extraneous garbage */
+ if (stat(filename, &filestat) < 0)
+ return -1;
+ euid = geteuid();
+ if (euid == ROOTID)
+ return 0;
+ protection = 7 & (filestat.st_mode >>
+ (filestat.st_uid == euid ? 6 :
+ (filestat.st_gid == getegid() ? 3 : 0)
+ ));
+ if ((mod & protection) == mod)
+ return 0;
+ errno = EACCES;
+ return -1;
+}
+#endif
+
+/*
+ * Get working directory
+ */
+
+#ifdef GETWD
+#define dot "."
+#define dotdot ".."
+
+static char *name;
+
+static DIR *dirp;
+static int off;
+static struct stat d, dd;
+static struct direct *dir;
+
+char *
+getwd(np)
+char *np;
+{
+ long rdev, rino;
+
+ *np++ = '/';
+ *np = 0;
+ name = np;
+ off = -1;
+ stat("/", &d);
+ rdev = d.st_dev;
+ rino = d.st_ino;
+ for (;;) {
+ stat(dot, &d);
+ if (d.st_ino==rino && d.st_dev==rdev)
+ goto done;
+ if ((dirp = opendir(dotdot)) == Null(DIR *))
+ prexit("getwd: cannot open ..\r\n");
+ stat(dotdot, &dd);
+ chdir(dotdot);
+ if(d.st_dev == dd.st_dev) {
+ if(d.st_ino == dd.st_ino)
+ goto done;
+ do
+ if ((dir = readdir(dirp)) == Null(struct direct *))
+ prexit("getwd: read error in ..\r\n");
+ while (dir->d_ino != d.st_ino);
+ }
+ else do {
+ if ((dir = readdir(dirp)) == Null(struct direct *))
+ prexit("getwd: read error in ..\r\n");
+ stat(dir->d_name, &dd);
+ } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
+ cat();
+ closedir(dirp);
+ }
+done:
+ name--;
+ if (chdir(name) < 0) {
+ printf("getwd: can't cd back to %s\r\n",name);
+ sig_catcher(0);
+ }
+ return (name);
+}
+
+void
+cat()
+{
+ Reg1 int i;
+ Reg2 int j;
+
+ i = -1;
+ while (dir->d_name[++i] != 0);
+ if ((off+i+2) > 1024-1)
+ return;
+ for(j=off+1; j>=0; --j)
+ name[j+i+1] = name[j];
+ if (off >= 0)
+ name[i] = '/';
+ off=i+off+1;
+ name[off] = 0;
+ for(--i; i>=0; --i)
+ name[i] = dir->d_name[i];
+}
+
+void
+prexit(cp)
+char *cp;
+{
+ write(2, cp, strlen(cp));
+ sig_catcher(0);
+}
+#else
+char *
+getwd(np) /* shorter but slower */
+char *np;
+{
+ FILE *popen();
+ FILE *pipefp = popen("/bin/pwd","r");
+
+ if (pipefp == Nullfp) {
+ printf("Can't run /bin/pwd\r\n");
+ finalize(1);
+ }
+ Fgets(np,512,pipefp);
+ np[strlen(np)-1] = '\0'; /* wipe out newline */
+ pclose(pipefp);
+ return np;
+}
+#endif
+
+/* copy a string to a safe spot */
+
+char *
+savestr(str)
+char *str;
+{
+ Reg1 char *newaddr = safemalloc((MEM_SIZE)(strlen(str)+1));
+
+ strcpy(newaddr,str);
+ return newaddr;
+}
+
+char *
+getval(nam,def)
+char *nam,*def;
+{
+ char *val;
+
+ if ((val = getenv(nam)) == Nullch || !*val)
+ val = def;
+ return val;
+}