# 2.11BSD#431 - /usr/src/games/warp/util.c

##### Functions

    cat               X
    cpytill           X
    eaccess           X
    exdis             X
    getval            X
    getwd             X
    instr             X
    movc3             X
    no_can_do         X
    prexit            X
    safecpy           X
    safemalloc        X
    savestr           X
    util_init         X

##### Variables

    dest              X
    len               X
    src               X

##### Macros

    dot               X
    dotdot            X

       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 "ndir.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: }

#### Defined functions

cat defined in line 259; used 2 times

- in line 247
- in /usr/src/games/warp/util.h line 85

cpytill defined in line 130; used 5 times

- in /usr/src/games/warp/intrp.c line 219, 381, 399, 627
- in /usr/src/games/warp/util.h line 79

eaccess defined in line 174; used 1 times

- in /usr/src/games/warp/util.h line 82

exdis defined in line 66; used 10 times

- in /usr/src/games/warp/init.c line 108-110(2), 184, 197(2), 454(2), 487(2)
- in /usr/src/games/warp/util.h line 59

getval defined in line 317; used 5 times

- in /usr/src/games/warp/intrp.c line 81, 386, 483
- in /usr/src/games/warp/term.c line 312
- in /usr/src/games/warp/util.h line 88

getwd defined in line 287; used 2 times

- in /usr/src/games/warp/intrp.c line 139
- in /usr/src/games/warp/util.h line 84

instr defined in line 149; used 2 times

- in /usr/src/games/warp/intrp.c line 407
- in /usr/src/games/warp/util.h line 80

movc3 defined in line 30; used 5 times

- in /usr/src/games/warp/term.c line 219, 235, 253
- in /usr/src/games/warp/term.h line 51
- in /usr/src/games/warp/util.h line 57

no_can_do defined in line 58; used 3 times

- in /usr/src/games/warp/term.c line 291-293(2)
- in /usr/src/games/warp/util.h line 58

prexit defined in line 279; used 4 times

- in line 231, 239-244(2)
- in /usr/src/games/warp/util.h line 86

safecpy defined in line 114; used 1 times

- in /usr/src/games/warp/util.h line 78

safemalloc defined in line 95; used 4 times

- in line 311
- in /usr/src/games/warp/term.c line 197, 381
- in /usr/src/games/warp/util.h line 77

savestr defined in line 307; used 13 times

- in /usr/src/games/warp/intrp.c line 90, 97, 103, 120, 127, 133-140(3), 195, 202, 231
- in /usr/src/games/warp/term.c line 368
- in /usr/src/games/warp/util.h line 87

util_init defined in line 24; used 2 times

- in /usr/src/games/warp/util.h line 76
- in /usr/src/games/warp/warp.c line 298

#### Defined variables

d defined in line 210; used 11 times

- in line 223-228(6), 234-240(3), 246(2)

dd defined in line 210; used 6 times

- in line 232-235(3), 245-246(3)

dest defined in line 39; used 9 times

- in line 31-33(2), 43-52(4), 120-124(3)

dir defined in line 211; used 6 times

- in line 238-245(4), 266, 276

dirp defined in line 208; used 4 times

- in line 230, 238-248(3)

len defined in line 41; used 13 times

- in line 31-34(2), 44-51(6), 115-123(5)

name defined in line 206; used 10 times

- in line 221, 251-256(4), 270-276(5)

nomem defined in line 91; used 1 times

- in line 106

off defined in line 209; used 7 times

- in line 222, 267-274(6)

src defined in line 40; used 6 times

- in line 31-33(2), 43-52(4)

#### Defined macros

dot defined in line 203; used 1 times

- in line 227

dotdot defined in line 204; used 3 times

- in line 230-233(3)

Last modified: 1987-06-19 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1424 |