123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- /* 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 $ on $Date: 86/11/01 17:08:40 $
- * $Source: /users/faustus/xchess/RCS/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);
- }
|