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