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