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