diff options
Diffstat (limited to 'gnu/chess/Xchess/std.c')
| -rw-r--r-- | gnu/chess/Xchess/std.c | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/gnu/chess/Xchess/std.c b/gnu/chess/Xchess/std.c new file mode 100644 index 000000000000..f80f6914355d --- /dev/null +++ b/gnu/chess/Xchess/std.c @@ -0,0 +1,425 @@ + +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.1.1.1 $ on $Date: 1993/06/12 14:41:07 $ + * $Source: /a/cvs/386BSD/src/gnu/chess/Xchess/std.c,v $ + * Copyright (c) 1985 Wayne A. Christopher, U. C. Berkeley CAD Group + * + * Utility routines. + */ + +#include "std.h" + +#ifndef IBMPC +#include <sys/types.h> +#endif not IBMPC +#ifdef UNIX +#include <signal.h> +#include <pwd.h> +#endif UNIX +#ifdef BSD +#include <sys/time.h> +#include <sys/resource.h> +#endif BSD + +extern char **environ; + +bool +prefix(p, s) + register char *p, *s; +{ + while (*p && (*p == *s)) + p++, s++; + if (!*p) + return (true); + else + return (false); +} + +/* Create a copy of a string. */ + +char * +copy(str) + char *str; +{ + char *p, *tmalloc(); + + p = tmalloc(strlen(str) + 1); + strcpy(p, str); + return(p); +} + +/* Determine whether sub is a substring of str. */ + +bool +substring(sub, str) + register char *str, *sub; +{ + register char *s; + + while(*str) { + if(*str == *sub) { + for(s = sub; *s; s++) + if(*s != *str++) + break; + if(*s == '\0') + return (true); + } + str++; + } + return (false); +} + +/* Malloc num bytes and initialize to zero. Fatal error if the space can't + * be malloc'd. + */ + +char * +tmalloc(num) + register int num; +{ + register char *s; + char *malloc(); + + s = malloc((unsigned) num); + if (!s) { + fatal("malloc: can't allocate %d bytes", num); + } + bzero(s, num); + return(s); +} + +char * +trealloc(ptr, num) + char *ptr; + int num; +{ + register char *s; + char *realloc(); + + s = realloc(ptr, (unsigned) num); + if (!s) { + fatal("realloc: can't allocate %d bytes", num); + } + /* Well, this won't be zeroed... Too bad... */ + return(s); +} + +/* Append one character to a string. Don't check for overflow. */ + +void +appendc(s, c) + char *s, c; +{ + while (*s) + s++; + *s++ = c; + *s = '\0'; + return; +} + +int +scannum(str) + char *str; +{ + int i = 0; + + while(isdigit(*str)) + i = i * 10 + *(str++) - '0'; + return(i); +} + +/* Case insensitive prefix. */ + +bool +ciprefix(p, s) + register char *p, *s; +{ + while (*p) { + if ((isupper(*p) ? tolower(*p) : *p) != + (isupper(*s) ? tolower(*s) : *s)) + return(false); + p++; + s++; + } + return (true); +} + +/* Case insensitive strcmp... */ + +bool +cieq(p, s) + register char *p, *s; +{ + while (*p) { + if ((isupper(*p) ? tolower(*p) : *p) != + (isupper(*s) ? tolower(*s) : *s)) + return(false); + p++; + s++; + } + return (!*s); +} + +#ifdef BSD + +/* Return the date. Return value is static data. */ + +char * +datestring() +{ + register char *tzn; + struct tm *tp; + static char tbuf[40]; + char *ap; + struct timeval tv; + struct timezone tz; + char *timezone(), *asctime(); + int i; + struct tm *localtime(); + + (void) gettimeofday(&tv, &tz); + tp = localtime((time_t *) &tv.tv_sec); + ap = asctime(tp); + tzn = timezone(tz.tz_minuteswest, tp->tm_isdst); + sprintf(tbuf, "%.20s", ap); + if (tzn) + strcat(tbuf, tzn); + strcat(tbuf, ap + 19); + i = strlen(tbuf); + tbuf[i - 1] = '\0'; + return (tbuf); +} + +#else BSD + +/* Give it a try... */ + +char * +datestring() +{ + long i; + static char buf[64]; + + i = time(0); + strcpy(buf, ctime(&i)); + buf[strlen(buf) - 1] = '\0'; /* Kill the nl. */ + return (buf); +} + +#endif + +/* How many seconds have elapsed in running time. */ + +int +seconds() +{ +#ifdef BSD + struct rusage ruse; + + getrusage(RUSAGE_SELF, &ruse); + return (ruse.ru_utime.tv_sec); +#else BSD +#endif BSD +} + +/* A few things that may not exist on non-unix systems. */ + +#ifndef BSD + +#ifndef index + +char * +index(s, c) + register char *s; + register char c; +{ + while ((*s != c) && (*s != '\0')) + s++; + if (*s == '\0') + return ((char *) 0); + else + return (s); +} + +#endif not index + +#ifndef rindex + +char * +rindex(s, c) + register char *s; + register char c; +{ + register char *t; + + for (t = s; *t != '\0'; t++); + while ((*t != c) && (t != s)) + t--; + if (t == s) + return ((char *) 0); + else + return (t); +} + +#endif not rindex + +#ifndef bcopy + +void +bcopy(from, to, num) + register char *from, *to; + register int num; +{ + while (num-- > 0) + *to++ = *from++; + return; +} + +#endif not bcopy + +#ifndef bzero + +void +bzero(ptr, num) + register char *ptr; + register int num; +{ + while (num-- > 0) + *ptr++ = '\0'; + return; +} + +#endif not bzero + +/* This might not be around... If not then forget about sorting... */ + +void qsort() {} + +#endif BSD + +char * +gettok(s) + char **s; +{ + char buf[BSIZE]; + int i = 0; + + while (isspace(**s)) + (*s)++; + if (!**s) + return (NULL); + while (**s && !isspace(**s)) + buf[i++] = *(*s)++; + buf[i] = '\0'; + while (isspace(**s)) + (*s)++; + return (copy(buf)); +} + +/* Die horribly. */ + +/* VARARGS1 */ +void +fatal(s, args) + char *s; +{ + fputs("Internal Error: ", stderr); + _doprnt(s, &args, stderr); + putc('\n', stderr); + + kill(getpid(), SIGIOT); + /* NOTREACHED */ +} + +void +setenv(name, value) + char *name, *value; +{ + int i; + char **xx, *s; + + s = tmalloc(strlen(name) + 2); + sprintf(s, "%s=", name); + + /* Copy the old environment... */ + for (i = 0; environ[i]; i++) + if (prefix(s, environ[i])) + break; + if (!environ[i]) { + xx = (char **) tmalloc((i + 2) * sizeof (char *)); + for (i = 0; environ[i]; i++) + xx[i] = environ[i]; + xx[i + 1] = NULL; + environ = xx; + } else + xx = environ; + + xx[i] = tmalloc(strlen(name) + strlen(value) + 2); + sprintf(xx[i], "%s=%s", name, value); + return; +} + +char * +getusername() +{ + int i = getuid(); + struct passwd *pw = getpwuid(i); + + return (pw ? pw->pw_name : NULL); +} + +char * +gethome() +{ + int i = getuid(); + struct passwd *pw = getpwuid(i); + + return (pw ? pw->pw_dir : "/strange"); +} + +char * +tildexpand(s) + char *s; +{ + struct passwd *pw; + char *n, buf[64]; + int i; + + if (*s != '~') + return (copy(s)); + + for (s++, i = 0; *s != '/'; s++, i++) + buf[i] = *s; + buf[i] = '\0'; + if (!i) + pw = getpwuid(getuid()); + else + pw = getpwnam(buf); + if (!pw) + return (s); + n = tmalloc(strlen(s) + strlen(pw->pw_dir) + 1); + strcpy(n, pw->pw_dir); + strcat(n, s); + return (n); +} + |
