|
|
1.1 root 1:
2: /* This file contains code for X-CHESS.
3: Copyright (C) 1986 Free Software Foundation, Inc.
4:
5: This file is part of X-CHESS.
6:
7: X-CHESS is distributed in the hope that it will be useful,
8: but WITHOUT ANY WARRANTY. No author or distributor
9: accepts responsibility to anyone for the consequences of using it
10: or for whether it serves any particular purpose or works at all,
11: unless he says so in writing. Refer to the X-CHESS General Public
12: License for full details.
13:
14: Everyone is granted permission to copy, modify and redistribute
15: X-CHESS, but only under the conditions described in the
16: X-CHESS General Public License. A copy of this license is
17: supposed to have been given to you along with X-CHESS so you
18: can know your rights and responsibilities. It should be in a
19: file named COPYING. Among other things, the copyright notice
20: and this notice must be preserved on all copies. */
21:
22:
23: /* RCS Info: $Revision: 1.1 $ on $Date: 86/11/01 17:08:40 $
24: * $Source: /users/faustus/xchess/RCS/std.c,v $
25: * Copyright (c) 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
26: *
27: * Utility routines.
28: */
29:
30: #include "std.h"
31:
32: #ifndef IBMPC
33: #include <sys/types.h>
34: #endif not IBMPC
35: #ifdef UNIX
36: #include <signal.h>
37: #include <pwd.h>
38: #endif UNIX
39: #ifdef BSD
40: #include <sys/time.h>
41: #include <sys/resource.h>
42: #endif BSD
43:
44: extern char **environ;
45:
46: bool
47: prefix(p, s)
48: register char *p, *s;
49: {
50: while (*p && (*p == *s))
51: p++, s++;
52: if (!*p)
53: return (true);
54: else
55: return (false);
56: }
57:
58: /* Create a copy of a string. */
59:
60: char *
61: copy(str)
62: char *str;
63: {
64: char *p, *tmalloc();
65:
66: p = tmalloc(strlen(str) + 1);
67: strcpy(p, str);
68: return(p);
69: }
70:
71: /* Determine whether sub is a substring of str. */
72:
73: bool
74: substring(sub, str)
75: register char *str, *sub;
76: {
77: register char *s;
78:
79: while(*str) {
80: if(*str == *sub) {
81: for(s = sub; *s; s++)
82: if(*s != *str++)
83: break;
84: if(*s == '\0')
85: return (true);
86: }
87: str++;
88: }
89: return (false);
90: }
91:
92: /* Malloc num bytes and initialize to zero. Fatal error if the space can't
93: * be malloc'd.
94: */
95:
96: char *
97: tmalloc(num)
98: register int num;
99: {
100: register char *s;
101: char *malloc();
102:
103: s = malloc((unsigned) num);
104: if (!s) {
105: fatal("malloc: can't allocate %d bytes", num);
106: }
107: bzero(s, num);
108: return(s);
109: }
110:
111: char *
112: trealloc(ptr, num)
113: char *ptr;
114: int num;
115: {
116: register char *s;
117: char *realloc();
118:
119: s = realloc(ptr, (unsigned) num);
120: if (!s) {
121: fatal("realloc: can't allocate %d bytes", num);
122: }
123: /* Well, this won't be zeroed... Too bad... */
124: return(s);
125: }
126:
127: /* Append one character to a string. Don't check for overflow. */
128:
129: void
130: appendc(s, c)
131: char *s, c;
132: {
133: while (*s)
134: s++;
135: *s++ = c;
136: *s = '\0';
137: return;
138: }
139:
140: int
141: scannum(str)
142: char *str;
143: {
144: int i = 0;
145:
146: while(isdigit(*str))
147: i = i * 10 + *(str++) - '0';
148: return(i);
149: }
150:
151: /* Case insensitive prefix. */
152:
153: bool
154: ciprefix(p, s)
155: register char *p, *s;
156: {
157: while (*p) {
158: if ((isupper(*p) ? tolower(*p) : *p) !=
159: (isupper(*s) ? tolower(*s) : *s))
160: return(false);
161: p++;
162: s++;
163: }
164: return (true);
165: }
166:
167: /* Case insensitive strcmp... */
168:
169: bool
170: cieq(p, s)
171: register char *p, *s;
172: {
173: while (*p) {
174: if ((isupper(*p) ? tolower(*p) : *p) !=
175: (isupper(*s) ? tolower(*s) : *s))
176: return(false);
177: p++;
178: s++;
179: }
180: return (!*s);
181: }
182:
183: #ifdef BSD
184:
185: /* Return the date. Return value is static data. */
186:
187: char *
188: datestring()
189: {
190: register char *tzn;
191: struct tm *tp;
192: static char tbuf[40];
193: char *ap;
194: struct timeval tv;
195: struct timezone tz;
196: char *timezone(), *asctime();
197: int i;
198: struct tm *localtime();
199:
200: (void) gettimeofday(&tv, &tz);
201: tp = localtime((time_t *) &tv.tv_sec);
202: ap = asctime(tp);
203: tzn = timezone(tz.tz_minuteswest, tp->tm_isdst);
204: sprintf(tbuf, "%.20s", ap);
205: if (tzn)
206: strcat(tbuf, tzn);
207: strcat(tbuf, ap + 19);
208: i = strlen(tbuf);
209: tbuf[i - 1] = '\0';
210: return (tbuf);
211: }
212:
213: #else BSD
214:
215: /* Give it a try... */
216:
217: char *
218: datestring()
219: {
220: long i;
221: static char buf[64];
222:
223: i = time(0);
224: strcpy(buf, ctime(&i));
225: buf[strlen(buf) - 1] = '\0'; /* Kill the nl. */
226: return (buf);
227: }
228:
229: #endif
230:
231: /* How many seconds have elapsed in running time. */
232:
233: int
234: seconds()
235: {
236: #ifdef BSD
237: struct rusage ruse;
238:
239: getrusage(RUSAGE_SELF, &ruse);
240: return (ruse.ru_utime.tv_sec);
241: #else BSD
242: #endif BSD
243: }
244:
245: /* A few things that may not exist on non-unix systems. */
246:
247: #ifndef BSD
248:
249: #ifndef index
250:
251: char *
252: index(s, c)
253: register char *s;
254: register char c;
255: {
256: while ((*s != c) && (*s != '\0'))
257: s++;
258: if (*s == '\0')
259: return ((char *) 0);
260: else
261: return (s);
262: }
263:
264: #endif not index
265:
266: #ifndef rindex
267:
268: char *
269: rindex(s, c)
270: register char *s;
271: register char c;
272: {
273: register char *t;
274:
275: for (t = s; *t != '\0'; t++);
276: while ((*t != c) && (t != s))
277: t--;
278: if (t == s)
279: return ((char *) 0);
280: else
281: return (t);
282: }
283:
284: #endif not rindex
285:
286: #ifndef bcopy
287:
288: void
289: bcopy(from, to, num)
290: register char *from, *to;
291: register int num;
292: {
293: while (num-- > 0)
294: *to++ = *from++;
295: return;
296: }
297:
298: #endif not bcopy
299:
300: #ifndef bzero
301:
302: void
303: bzero(ptr, num)
304: register char *ptr;
305: register int num;
306: {
307: while (num-- > 0)
308: *ptr++ = '\0';
309: return;
310: }
311:
312: #endif not bzero
313:
314: /* This might not be around... If not then forget about sorting... */
315:
316: void qsort() {}
317:
318: #endif BSD
319:
320: char *
321: gettok(s)
322: char **s;
323: {
324: char buf[BSIZE];
325: int i = 0;
326:
327: while (isspace(**s))
328: (*s)++;
329: if (!**s)
330: return (NULL);
331: while (**s && !isspace(**s))
332: buf[i++] = *(*s)++;
333: buf[i] = '\0';
334: while (isspace(**s))
335: (*s)++;
336: return (copy(buf));
337: }
338:
339: /* Die horribly. */
340:
341: /* VARARGS1 */
342: void
343: fatal(s, args)
344: char *s;
345: {
346: fputs("Internal Error: ", stderr);
347: _doprnt(s, &args, stderr);
348: putc('\n', stderr);
349:
350: kill(getpid(), SIGIOT);
351: /* NOTREACHED */
352: }
353:
354: void
355: setenv(name, value)
356: char *name, *value;
357: {
358: int i;
359: char **xx, *s;
360:
361: s = tmalloc(strlen(name) + 2);
362: sprintf(s, "%s=", name);
363:
364: /* Copy the old environment... */
365: for (i = 0; environ[i]; i++)
366: if (prefix(s, environ[i]))
367: break;
368: if (!environ[i]) {
369: xx = (char **) tmalloc((i + 2) * sizeof (char *));
370: for (i = 0; environ[i]; i++)
371: xx[i] = environ[i];
372: xx[i + 1] = NULL;
373: environ = xx;
374: } else
375: xx = environ;
376:
377: xx[i] = tmalloc(strlen(name) + strlen(value) + 2);
378: sprintf(xx[i], "%s=%s", name, value);
379: return;
380: }
381:
382: char *
383: getusername()
384: {
385: int i = getuid();
386: struct passwd *pw = getpwuid(i);
387:
388: return (pw ? pw->pw_name : NULL);
389: }
390:
391: char *
392: gethome()
393: {
394: int i = getuid();
395: struct passwd *pw = getpwuid(i);
396:
397: return (pw ? pw->pw_dir : "/strange");
398: }
399:
400: char *
401: tildexpand(s)
402: char *s;
403: {
404: struct passwd *pw;
405: char *n, buf[64];
406: int i;
407:
408: if (*s != '~')
409: return (copy(s));
410:
411: for (s++, i = 0; *s != '/'; s++, i++)
412: buf[i] = *s;
413: buf[i] = '\0';
414: if (!i)
415: pw = getpwuid(getuid());
416: else
417: pw = getpwnam(buf);
418: if (!pw)
419: return (s);
420: n = tmalloc(strlen(s) + strlen(pw->pw_dir) + 1);
421: strcpy(n, pw->pw_dir);
422: strcat(n, s);
423: return (n);
424: }
425:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.