Home | History | Annotate | Line # | Download | only in warp
      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