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