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