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