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