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