1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <time.h>
6 #if HAVE_UNISTD_H
7 #   include <unistd.h>
8 #endif
9 #if HAVE_FCNTL_H
10 #   include <fcntl.h>
11 #endif
12 #include "deco.h"
13 
14 #define SYSTEMID "/etc/systemid"
15 
16 #define DELIM ','
17 
18 #define STOREINT(p,nn) {\
19 	register char *cp = p;\
20 	register n = nn;\
21 	*cp++ = n/10%10 + '0';\
22 	*cp = n%10 + '0';\
23 	}
24 
25 static char pattern [] = "00-Mon-1900 00:00:00";
26 
timestr(long tim)27 char *timestr (long tim)
28 {
29 	struct tm *t = localtime (&tim);
30 	register char *p = pattern;
31 
32 	STOREINT (p, t->tm_mday);
33 	if (*p == '0')
34 		*p = ' ';
35 
36 
37 	strncpy (p+3, "JanFebMarAprMayJunJulAugSepOctNovDec"+t->tm_mon*3, 3);
38 	STOREINT (p+9, t->tm_year);
39 	if (t->tm_year < 100) {
40 		p[7] = '1';
41 		p[8] = '9';
42 	} else {
43 		p[7] = '2';
44 		p[8] = '0';
45 	}
46 	STOREINT (p+12, t->tm_hour);
47 	STOREINT (p+15, t->tm_min);
48 	STOREINT (p+18, t->tm_sec);
49 	return (p);
50 }
51 
getmachine()52 char *getmachine ()
53 {
54 	static char buf [64];
55 	register f;
56 	register char *p;
57 
58 #if HAVE_GETHOSTNAME
59 	if (gethostname (buf, sizeof (buf) - 1) >= 0)
60 		return (buf);
61 #endif
62 	if ((f = open (SYSTEMID, 0)) >= 0) {
63 		read (f, buf, sizeof (buf) - 1);
64 		close (f);
65 		for (p=buf; *p; ++p)
66 			if (*p<' ' || *p>'~') {
67 				*p = 0;
68 				break;
69 			}
70 		return (buf);
71 	}
72 	return (0);
73 }
74 
extension(const char * p)75 const char *extension (const char *p)
76 {
77 	const char *s;
78 
79 	if (p[0]=='.' && p[1]=='.' && p[2]==0)
80 		return (p+2);
81 	s = 0;
82 	while (*++p)
83 		if (*p == '.')
84 			s = p;
85 	return (s ? s : p);
86 }
87 
ltoac(long l)88 char *ltoac (long l)
89 {
90 	char num [15];
91 	static char buf [15];
92 	register char *p, *q;
93 	register n;
94 
95 	sprintf (num, "%ld", l);
96 	for (p=num; *p; ++p);           /* find end of num */
97 	q = buf + sizeof (buf) - 1;     /* set q to the end of buf */
98 	*q-- = 0;
99 	for (n=0; p>num; ++n) {
100 		if (n && n%3 == 0)
101 			*q-- = DELIM;
102 		*q-- = *--p;
103 	}
104 	return (q+1);
105 }
106 
basename(char * p)107 char *basename (char *p)
108 {
109 	register char *s, *e;
110 	static char buf [32];
111 
112 	/* convert "zzz/name" to "name" */
113 	for (s=p; *s; ++s)
114 		if (*s == '/')
115 			p = s+1;
116 	if (! *p)
117 		return ("");
118 
119 	/* convert "name.ext" to "name" */
120 	for (e=s, s=p+1; *s; ++s)
121 		if (*s == '.')
122 			e = s;
123 	strncpy (buf, p, e-p);
124 	buf [e-p] = 0;
125 	return (buf);
126 }
127 
strtail(char * p,int delim,int maxlen)128 char *strtail (char *p, int delim, int maxlen)
129 {
130 	register char *s;
131 
132 	/* return tail of string */
133 	for (s=p; *s; ++s);
134 	s -= maxlen;
135 	if (s <= p)
136 		return (p);
137 	for (; *s; ++s)
138 		if (*s == delim)
139 			return (s+1);
140 	return (s - maxlen);
141 }
142 
strbcmp(char * s,char * b)143 int strbcmp (char *s, char *b)
144 {
145 	/* compare string s with string b */
146 	/* return 1 if s == b or s == b+' '+x */
147 
148 	while (*b && *b == *s)
149 		++b, ++s;
150 	if (*b || (*s && *s != ' '))
151 		return (0);
152 	return (1);
153 }
154 
outerr(char * s,...)155 void outerr (char *s, ...)
156 {
157 	char buf [100];
158 	register char *p;
159 	va_list ap;
160 
161 	va_start (ap, s);
162 	vsprintf (buf, s, ap);
163 	va_end (ap);
164 	for (p=buf; *p; ++p)
165 		if (*p == '\033')
166 			*p = '[';
167 	write (2, buf, (unsigned) (p - buf));
168 }
169 
170 /*
171  * int match (char *name, char *pattern)
172  *
173  * Match name with pattern. Returns 1 on success.
174  * Pattern may contain wild symbols:
175  *
176  * ^       - at beginning of string - any string not matched
177  * *       - any string
178  * ?       - any symbol
179  * [a-z]   - symbol in range
180  * [^a-z]  - symbol out of range
181  * [!a-z]  - symbol out of range
182  */
match(unsigned char * name,unsigned char * pat)183 int match (unsigned char *name, unsigned char *pat)
184 {
185 	int ok, negate_range, matched;
186 
187 	if (*pat == '^') {
188 		matched = 0;
189 		++pat;
190 	} else
191 		matched = 1;
192 	for (;;) {
193 		switch (*pat++) {
194 		case '*':
195 			if (! *pat)
196 				return (matched);
197 			for (; *name; ++name)
198 				if (match (name, pat))
199 					return (matched);
200 			return (! matched);
201 		case '?':
202 			if (! *name++)
203 				return (! matched);
204 			break;
205 		case 0:
206 			if (*name)
207 				return (! matched);
208 			return (matched);
209 		default:
210 			if (*name++ != pat[-1])
211 				return (! matched);
212 			break;
213 		case '[':
214 			ok = 0;
215 			negate_range = (*pat == '^' || *pat == '!');
216 			if (negate_range)
217 				++pat;
218 			while (*pat++ != ']')
219 				if (*pat == '-') {
220 					if (pat[-1] <= *name && *name <= pat[1])
221 						ok = 1;
222 					pat += 2;
223 				} else if (pat[-1] == *name)
224 					ok = 1;
225 			if (ok == negate_range)
226 				return (! matched);
227 			++name;
228 			break;
229 		}
230 	}
231 }
232 
mdup(char * s)233 char *mdup (char *s)
234 {
235 	char *p;
236 
237 	p = malloc (strlen (s) + 1);
238 	strcpy (p, s);
239 	return (p);
240 }
241