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