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