util.c revision 1.1 1 1.1 kamil /* $Header: /tank/opengrok/rsync2/NetBSD/src/games/warp/util.c,v 1.1 2020/11/09 23:37:05 kamil Exp $ */
2 1.1 kamil
3 1.1 kamil /* $Log: util.c,v $
4 1.1 kamil /* Revision 1.1 2020/11/09 23:37:05 kamil
5 1.1 kamil /* Add Warp Kit, Version 7.0 by Larry Wall
6 1.1 kamil /*
7 1.1 kamil /* Warp is a real-time space war game that doesn't get boring very quickly.
8 1.1 kamil /* Read warp.doc and the manual page for more information.
9 1.1 kamil /*
10 1.1 kamil /* games/warp originally distributed with 4.3BSD-Reno, is back to the BSD
11 1.1 kamil /* world via NetBSD. Its remnants were still mentioned in games/Makefile.
12 1.1 kamil /*
13 1.1 kamil /* Larry Wall, the original author and the copyright holder, generously
14 1.1 kamil /* donated the game and copyright to The NetBSD Foundation, Inc.
15 1.1 kamil /*
16 1.1 kamil /* Import the game sources as-is from 4.3BSD-Reno, with the cession
17 1.1 kamil /* of the copyright and license to BSD-2-clause NetBSD-style.
18 1.1 kamil /*
19 1.1 kamil /* Signed-off-by: Larry Wall <larry (at) wall.org>
20 1.1 kamil /* Signed-off-by: Kamil Rytarowski <kamil (at) netbsd.org>
21 1.1 kamil /*
22 1.1 kamil * Revision 7.0.1.2 86/10/20 12:07:46 lwall
23 1.1 kamil * Made all exits reset tty.
24 1.1 kamil *
25 1.1 kamil * Revision 7.0.1.1 86/10/16 10:54:02 lwall
26 1.1 kamil * Added Damage. Fixed random bugs.
27 1.1 kamil *
28 1.1 kamil * Revision 7.0 86/10/08 15:14:31 lwall
29 1.1 kamil * Split into separate files. Added amoebas and pirates.
30 1.1 kamil *
31 1.1 kamil */
32 1.1 kamil
33 1.1 kamil #include "EXTERN.h"
34 1.1 kamil #include "warp.h"
35 1.1 kamil #include "sys/dir.h"
36 1.1 kamil #include "object.h"
37 1.1 kamil #include "sig.h"
38 1.1 kamil #include "term.h"
39 1.1 kamil #include "INTERN.h"
40 1.1 kamil #include "util.h"
41 1.1 kamil
42 1.1 kamil void
43 1.1 kamil util_init()
44 1.1 kamil {
45 1.1 kamil ;
46 1.1 kamil }
47 1.1 kamil
48 1.1 kamil void
49 1.1 kamil movc3(len,src,dest)
50 1.1 kamil #ifdef vax
51 1.1 kamil char *dest, *src;
52 1.1 kamil int len;
53 1.1 kamil {
54 1.1 kamil asm("movc3 4(ap),*8(ap),*12(ap)");
55 1.1 kamil }
56 1.1 kamil #else
57 1.1 kamil Reg1 char *dest;
58 1.1 kamil Reg2 char *src;
59 1.1 kamil Reg3 int len;
60 1.1 kamil {
61 1.1 kamil if (dest <= src) {
62 1.1 kamil for (; len; len--) {
63 1.1 kamil *dest++ = *src++;
64 1.1 kamil }
65 1.1 kamil }
66 1.1 kamil else {
67 1.1 kamil dest += len;
68 1.1 kamil src += len;
69 1.1 kamil for (; len; len--) {
70 1.1 kamil *--dest = *--src;
71 1.1 kamil }
72 1.1 kamil }
73 1.1 kamil }
74 1.1 kamil #endif
75 1.1 kamil
76 1.1 kamil void
77 1.1 kamil no_can_do(what)
78 1.1 kamil char *what;
79 1.1 kamil {
80 1.1 kamil fprintf(stderr,"Sorry, your terminal is too %s to play warp.\r\n",what);
81 1.1 kamil finalize(1);
82 1.1 kamil }
83 1.1 kamil
84 1.1 kamil int
85 1.1 kamil exdis(maxnum)
86 1.1 kamil int maxnum;
87 1.1 kamil {
88 1.1 kamil double temp, temp2;
89 1.1 kamil double exp();
90 1.1 kamil double log();
91 1.1 kamil
92 1.1 kamil temp = (double) maxnum;
93 1.1 kamil #ifndef lint
94 1.1 kamil temp2 = (double) myrand();
95 1.1 kamil #else
96 1.1 kamil temp2 = 0.0;
97 1.1 kamil #endif
98 1.1 kamil #if RANDBITS == 15
99 1.1 kamil return (int) exp(temp2 * log(temp)/0x7fff);
100 1.1 kamil #else
101 1.1 kamil #if RANDBITS == 16
102 1.1 kamil return (int) exp(temp2 * log(temp)/0xffff);
103 1.1 kamil #else
104 1.1 kamil return (int) exp(temp2 * log(temp)/0x7fffffff);
105 1.1 kamil #endif
106 1.1 kamil #endif
107 1.1 kamil }
108 1.1 kamil
109 1.1 kamil static char nomem[] = "warp: out of memory!\r\n";
110 1.1 kamil
111 1.1 kamil /* paranoid version of malloc */
112 1.1 kamil
113 1.1 kamil char *
114 1.1 kamil safemalloc(size)
115 1.1 kamil MEM_SIZE size;
116 1.1 kamil {
117 1.1 kamil char *ptr;
118 1.1 kamil char *malloc();
119 1.1 kamil
120 1.1 kamil ptr = malloc(size?size:1); /* malloc(0) is NASTY on our system */
121 1.1 kamil if (ptr != Nullch)
122 1.1 kamil return ptr;
123 1.1 kamil else {
124 1.1 kamil fputs(nomem,stdout);
125 1.1 kamil sig_catcher(0);
126 1.1 kamil }
127 1.1 kamil /*NOTREACHED*/
128 1.1 kamil }
129 1.1 kamil
130 1.1 kamil /* safe version of string copy */
131 1.1 kamil
132 1.1 kamil char *
133 1.1 kamil safecpy(to,from,len)
134 1.1 kamil char *to;
135 1.1 kamil Reg2 char *from;
136 1.1 kamil Reg1 int len;
137 1.1 kamil {
138 1.1 kamil Reg3 char *dest = to;
139 1.1 kamil
140 1.1 kamil if (from != Nullch)
141 1.1 kamil for (len--; len && (*dest++ = *from++); len--) ;
142 1.1 kamil *dest = '\0';
143 1.1 kamil return to;
144 1.1 kamil }
145 1.1 kamil
146 1.1 kamil /* copy a string up to some (non-backslashed) delimiter, if any */
147 1.1 kamil
148 1.1 kamil char *
149 1.1 kamil cpytill(to,from,delim)
150 1.1 kamil Reg2 char *to;
151 1.1 kamil Reg1 char *from;
152 1.1 kamil Reg3 int delim;
153 1.1 kamil {
154 1.1 kamil for (; *from; from++,to++) {
155 1.1 kamil if (*from == '\\' && from[1] == delim)
156 1.1 kamil from++;
157 1.1 kamil else if (*from == delim)
158 1.1 kamil break;
159 1.1 kamil *to = *from;
160 1.1 kamil }
161 1.1 kamil *to = '\0';
162 1.1 kamil return from;
163 1.1 kamil }
164 1.1 kamil
165 1.1 kamil /* return ptr to little string in big string, NULL if not found */
166 1.1 kamil
167 1.1 kamil char *
168 1.1 kamil instr(big, little)
169 1.1 kamil char *big, *little;
170 1.1 kamil
171 1.1 kamil {
172 1.1 kamil Reg3 char *t;
173 1.1 kamil Reg1 char *s;
174 1.1 kamil Reg2 char *x;
175 1.1 kamil
176 1.1 kamil for (t = big; *t; t++) {
177 1.1 kamil for (x=t,s=little; *s; x++,s++) {
178 1.1 kamil if (!*x)
179 1.1 kamil return Nullch;
180 1.1 kamil if (*s != *x)
181 1.1 kamil break;
182 1.1 kamil }
183 1.1 kamil if (!*s)
184 1.1 kamil return t;
185 1.1 kamil }
186 1.1 kamil return Nullch;
187 1.1 kamil }
188 1.1 kamil
189 1.1 kamil /* effective access */
190 1.1 kamil
191 1.1 kamil #ifdef SETUIDGID
192 1.1 kamil int
193 1.1 kamil eaccess(filename, mod)
194 1.1 kamil char *filename;
195 1.1 kamil int mod;
196 1.1 kamil {
197 1.1 kamil int protection, euid;
198 1.1 kamil
199 1.1 kamil mod &= 7; /* remove extraneous garbage */
200 1.1 kamil if (stat(filename, &filestat) < 0)
201 1.1 kamil return -1;
202 1.1 kamil euid = geteuid();
203 1.1 kamil if (euid == ROOTID)
204 1.1 kamil return 0;
205 1.1 kamil protection = 7 & (filestat.st_mode >>
206 1.1 kamil (filestat.st_uid == euid ? 6 :
207 1.1 kamil (filestat.st_gid == getegid() ? 3 : 0)
208 1.1 kamil ));
209 1.1 kamil if ((mod & protection) == mod)
210 1.1 kamil return 0;
211 1.1 kamil errno = EACCES;
212 1.1 kamil return -1;
213 1.1 kamil }
214 1.1 kamil #endif
215 1.1 kamil
216 1.1 kamil /*
217 1.1 kamil * Get working directory
218 1.1 kamil */
219 1.1 kamil
220 1.1 kamil #ifdef GETWD
221 1.1 kamil #define dot "."
222 1.1 kamil #define dotdot ".."
223 1.1 kamil
224 1.1 kamil static char *name;
225 1.1 kamil
226 1.1 kamil static DIR *dirp;
227 1.1 kamil static int off;
228 1.1 kamil static struct stat d, dd;
229 1.1 kamil static struct direct *dir;
230 1.1 kamil
231 1.1 kamil char *
232 1.1 kamil getwd(np)
233 1.1 kamil char *np;
234 1.1 kamil {
235 1.1 kamil long rdev, rino;
236 1.1 kamil
237 1.1 kamil *np++ = '/';
238 1.1 kamil *np = 0;
239 1.1 kamil name = np;
240 1.1 kamil off = -1;
241 1.1 kamil stat("/", &d);
242 1.1 kamil rdev = d.st_dev;
243 1.1 kamil rino = d.st_ino;
244 1.1 kamil for (;;) {
245 1.1 kamil stat(dot, &d);
246 1.1 kamil if (d.st_ino==rino && d.st_dev==rdev)
247 1.1 kamil goto done;
248 1.1 kamil if ((dirp = opendir(dotdot)) == Null(DIR *))
249 1.1 kamil prexit("getwd: cannot open ..\r\n");
250 1.1 kamil stat(dotdot, &dd);
251 1.1 kamil chdir(dotdot);
252 1.1 kamil if(d.st_dev == dd.st_dev) {
253 1.1 kamil if(d.st_ino == dd.st_ino)
254 1.1 kamil goto done;
255 1.1 kamil do
256 1.1 kamil if ((dir = readdir(dirp)) == Null(struct direct *))
257 1.1 kamil prexit("getwd: read error in ..\r\n");
258 1.1 kamil while (dir->d_ino != d.st_ino);
259 1.1 kamil }
260 1.1 kamil else do {
261 1.1 kamil if ((dir = readdir(dirp)) == Null(struct direct *))
262 1.1 kamil prexit("getwd: read error in ..\r\n");
263 1.1 kamil stat(dir->d_name, &dd);
264 1.1 kamil } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
265 1.1 kamil cat();
266 1.1 kamil closedir(dirp);
267 1.1 kamil }
268 1.1 kamil done:
269 1.1 kamil name--;
270 1.1 kamil if (chdir(name) < 0) {
271 1.1 kamil printf("getwd: can't cd back to %s\r\n",name);
272 1.1 kamil sig_catcher(0);
273 1.1 kamil }
274 1.1 kamil return (name);
275 1.1 kamil }
276 1.1 kamil
277 1.1 kamil void
278 1.1 kamil cat()
279 1.1 kamil {
280 1.1 kamil Reg1 int i;
281 1.1 kamil Reg2 int j;
282 1.1 kamil
283 1.1 kamil i = -1;
284 1.1 kamil while (dir->d_name[++i] != 0);
285 1.1 kamil if ((off+i+2) > 1024-1)
286 1.1 kamil return;
287 1.1 kamil for(j=off+1; j>=0; --j)
288 1.1 kamil name[j+i+1] = name[j];
289 1.1 kamil if (off >= 0)
290 1.1 kamil name[i] = '/';
291 1.1 kamil off=i+off+1;
292 1.1 kamil name[off] = 0;
293 1.1 kamil for(--i; i>=0; --i)
294 1.1 kamil name[i] = dir->d_name[i];
295 1.1 kamil }
296 1.1 kamil
297 1.1 kamil void
298 1.1 kamil prexit(cp)
299 1.1 kamil char *cp;
300 1.1 kamil {
301 1.1 kamil write(2, cp, strlen(cp));
302 1.1 kamil sig_catcher(0);
303 1.1 kamil }
304 1.1 kamil #else
305 1.1 kamil char *
306 1.1 kamil getwd(np) /* shorter but slower */
307 1.1 kamil char *np;
308 1.1 kamil {
309 1.1 kamil FILE *popen();
310 1.1 kamil FILE *pipefp = popen("/bin/pwd","r");
311 1.1 kamil
312 1.1 kamil if (pipefp == Nullfp) {
313 1.1 kamil printf("Can't run /bin/pwd\r\n");
314 1.1 kamil finalize(1);
315 1.1 kamil }
316 1.1 kamil Fgets(np,512,pipefp);
317 1.1 kamil np[strlen(np)-1] = '\0'; /* wipe out newline */
318 1.1 kamil pclose(pipefp);
319 1.1 kamil return np;
320 1.1 kamil }
321 1.1 kamil #endif
322 1.1 kamil
323 1.1 kamil /* copy a string to a safe spot */
324 1.1 kamil
325 1.1 kamil char *
326 1.1 kamil savestr(str)
327 char *str;
328 {
329 Reg1 char *newaddr = safemalloc((MEM_SIZE)(strlen(str)+1));
330
331 strcpy(newaddr,str);
332 return newaddr;
333 }
334
335 char *
336 getval(nam,def)
337 char *nam,*def;
338 {
339 char *val;
340
341 if ((val = getenv(nam)) == Nullch || !*val)
342 val = def;
343 return val;
344 }
345