xref: /netbsd/games/warp/util.c (revision c8c17207)
137c3bdbeSkamil /* Header: util.c,v 7.0.1.2 86/10/20 12:07:46 lwall Exp */
2c503d12fSkamil 
337c3bdbeSkamil /* Log:	util.c,v
4c503d12fSkamil  * Revision 7.0.1.2  86/10/20  12:07:46  lwall
5c503d12fSkamil  * Made all exits reset tty.
6c503d12fSkamil  *
7c503d12fSkamil  * Revision 7.0.1.1  86/10/16  10:54:02  lwall
8c503d12fSkamil  * Added Damage.  Fixed random bugs.
9c503d12fSkamil  *
10c503d12fSkamil  * Revision 7.0  86/10/08  15:14:31  lwall
11c503d12fSkamil  * Split into separate files.  Added amoebas and pirates.
12c503d12fSkamil  *
13c503d12fSkamil  */
14c503d12fSkamil 
15c503d12fSkamil #include "EXTERN.h"
16c503d12fSkamil #include "warp.h"
17c503d12fSkamil #include "sys/dir.h"
18c503d12fSkamil #include "object.h"
19c503d12fSkamil #include "sig.h"
20c503d12fSkamil #include "term.h"
21c503d12fSkamil #include "INTERN.h"
22c503d12fSkamil #include "util.h"
23c503d12fSkamil 
24c503d12fSkamil void
25*c8c17207Schristos util_init(void)
26c503d12fSkamil {
27c503d12fSkamil     ;
28c503d12fSkamil }
29c503d12fSkamil 
30c503d12fSkamil void
31*c8c17207Schristos movc3(int len, char *src, char *dest)
32c503d12fSkamil #ifdef vax
33c503d12fSkamil {
34c503d12fSkamil     asm("movc3 4(ap),*8(ap),*12(ap)");
35c503d12fSkamil }
36c503d12fSkamil #else
37c503d12fSkamil {
38c503d12fSkamil     if (dest <= src) {
39c503d12fSkamil 	for (; len; len--) {
40c503d12fSkamil 	    *dest++ = *src++;
41c503d12fSkamil 	}
42c503d12fSkamil     }
43c503d12fSkamil     else {
44c503d12fSkamil 	dest += len;
45c503d12fSkamil 	src += len;
46c503d12fSkamil 	for (; len; len--) {
47c503d12fSkamil 	    *--dest = *--src;
48c503d12fSkamil 	}
49c503d12fSkamil     }
50c503d12fSkamil }
51c503d12fSkamil #endif
52c503d12fSkamil 
53c503d12fSkamil void
54*c8c17207Schristos no_can_do(const char *what)
55c503d12fSkamil {
56c503d12fSkamil     fprintf(stderr,"Sorry, your terminal is too %s to play warp.\r\n",what);
57c503d12fSkamil     finalize(1);
58c503d12fSkamil }
59c503d12fSkamil 
60c503d12fSkamil int
61*c8c17207Schristos exdis(int maxnum)
62c503d12fSkamil {
63c503d12fSkamil     double temp, temp2;
64c503d12fSkamil 
65c503d12fSkamil     temp = (double) maxnum;
66c503d12fSkamil #ifndef lint
67c503d12fSkamil     temp2 = (double) myrand();
68c503d12fSkamil #else
69c503d12fSkamil     temp2 = 0.0;
70c503d12fSkamil #endif
71c503d12fSkamil #if RANDBITS == 15
72c503d12fSkamil     return (int) exp(temp2 * log(temp)/0x7fff);
73c503d12fSkamil #else
74c503d12fSkamil #if RANDBITS == 16
75c503d12fSkamil     return (int) exp(temp2 * log(temp)/0xffff);
76c503d12fSkamil #else
77c503d12fSkamil     return (int) exp(temp2 * log(temp)/0x7fffffff);
78c503d12fSkamil #endif
79c503d12fSkamil #endif
80c503d12fSkamil }
81c503d12fSkamil 
82c503d12fSkamil static char nomem[] = "warp: out of memory!\r\n";
83c503d12fSkamil 
84c503d12fSkamil /* paranoid version of malloc */
85c503d12fSkamil 
86*c8c17207Schristos void *
87*c8c17207Schristos safemalloc(size_t size)
88c503d12fSkamil {
89c503d12fSkamil     char *ptr;
90c503d12fSkamil 
91c503d12fSkamil     ptr = malloc(size?size:1);	/* malloc(0) is NASTY on our system */
92*c8c17207Schristos     if (ptr != NULL)
93c503d12fSkamil 	return ptr;
94c503d12fSkamil     else {
95c503d12fSkamil 	fputs(nomem,stdout);
96c503d12fSkamil 	sig_catcher(0);
97c503d12fSkamil     }
98c503d12fSkamil     /*NOTREACHED*/
99*c8c17207Schristos     return NULL;
100c503d12fSkamil }
101c503d12fSkamil 
102c503d12fSkamil /* safe version of string copy */
103c503d12fSkamil 
104c503d12fSkamil char *
105*c8c17207Schristos safecpy(char *to, const char *from, size_t len)
106c503d12fSkamil {
107*c8c17207Schristos     char *dest = to;
108c503d12fSkamil 
109*c8c17207Schristos     if (from != NULL)
110*c8c17207Schristos 	for (len--; len && (*dest++ = *from++); len--)
111*c8c17207Schristos 	    continue;
112c503d12fSkamil     *dest = '\0';
113c503d12fSkamil     return to;
114c503d12fSkamil }
115c503d12fSkamil 
116c503d12fSkamil /* copy a string up to some (non-backslashed) delimiter, if any */
117c503d12fSkamil 
118c503d12fSkamil char *
119*c8c17207Schristos cpytill(char *to, const char *from, int delim)
120c503d12fSkamil {
121c503d12fSkamil     for (; *from; from++,to++) {
122c503d12fSkamil 	if (*from == '\\' && from[1] == delim)
123c503d12fSkamil 	    from++;
124c503d12fSkamil 	else if (*from == delim)
125c503d12fSkamil 	    break;
126c503d12fSkamil 	*to = *from;
127c503d12fSkamil     }
128c503d12fSkamil     *to = '\0';
129*c8c17207Schristos     return __UNCONST(from);
130c503d12fSkamil }
131c503d12fSkamil 
132c503d12fSkamil /* return ptr to little string in big string, NULL if not found */
133c503d12fSkamil 
134c503d12fSkamil char *
135*c8c17207Schristos instr(const char *big, const char *little)
136c503d12fSkamil 
137c503d12fSkamil {
138*c8c17207Schristos     const char *t;
139*c8c17207Schristos     const char *s;
140*c8c17207Schristos     const char *x;
141c503d12fSkamil 
142c503d12fSkamil     for (t = big; *t; t++) {
143c503d12fSkamil 	for (x=t,s=little; *s; x++,s++) {
144c503d12fSkamil 	    if (!*x)
145*c8c17207Schristos 		return NULL;
146c503d12fSkamil 	    if (*s != *x)
147c503d12fSkamil 		break;
148c503d12fSkamil 	}
149c503d12fSkamil 	if (!*s)
150*c8c17207Schristos 	    return __UNCONST(t);
151c503d12fSkamil     }
152*c8c17207Schristos     return NULL;
153c503d12fSkamil }
154c503d12fSkamil 
155c503d12fSkamil /* effective access */
156c503d12fSkamil 
157c503d12fSkamil #ifdef SETUIDGID
158c503d12fSkamil int
159*c8c17207Schristos eaccess(const char *filename, mode_t mod)
160c503d12fSkamil {
161*c8c17207Schristos     mode_t protection;
162*c8c17207Schristos     uid_t euid;
163c503d12fSkamil 
164c503d12fSkamil     mod &= 7;				/* remove extraneous garbage */
165c503d12fSkamil     if (stat(filename, &filestat) < 0)
166c503d12fSkamil 	return -1;
167c503d12fSkamil     euid = geteuid();
168c503d12fSkamil     if (euid == ROOTID)
169c503d12fSkamil 	return 0;
170c503d12fSkamil     protection = 7 & (filestat.st_mode >>
171c503d12fSkamil       (filestat.st_uid == euid ? 6 :
172c503d12fSkamil         (filestat.st_gid == getegid() ? 3 : 0)
173c503d12fSkamil       ));
174c503d12fSkamil     if ((mod & protection) == mod)
175c503d12fSkamil 	return 0;
176c503d12fSkamil     errno = EACCES;
177c503d12fSkamil     return -1;
178c503d12fSkamil }
179c503d12fSkamil #endif
180c503d12fSkamil 
181c503d12fSkamil void
182*c8c17207Schristos prexit(const char *cp)
183c503d12fSkamil {
184c503d12fSkamil 	write(2, cp, strlen(cp));
185c503d12fSkamil 	sig_catcher(0);
186c503d12fSkamil }
187c503d12fSkamil 
188c503d12fSkamil /* copy a string to a safe spot */
189c503d12fSkamil 
190c503d12fSkamil char *
191*c8c17207Schristos savestr(const char *str)
192c503d12fSkamil {
193*c8c17207Schristos     char *newaddr = safemalloc((size_t)(strlen(str)+1));
194c503d12fSkamil 
195c503d12fSkamil     strcpy(newaddr, str);
196c503d12fSkamil     return newaddr;
197c503d12fSkamil }
198c503d12fSkamil 
199c503d12fSkamil char *
200*c8c17207Schristos getval(const char *nam, const char *def)
201c503d12fSkamil {
202*c8c17207Schristos     const char *val;
203c503d12fSkamil 
204*c8c17207Schristos     if ((val = getenv(nam)) == NULL || !*val)
205c503d12fSkamil 	val = def;
206*c8c17207Schristos     return __UNCONST(val);
207c503d12fSkamil }
208