1 /*-
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)subr.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 #include "whoami.h"
13 #include "0.h"
14
15 #ifndef PI1
16 /*
17 * Does the string fp end in '.' and the character c ?
18 */
dotted(fp,c)19 dotted(fp, c)
20 register char *fp;
21 char c;
22 {
23 register int i;
24
25 i = strlen(fp);
26 return (i > 1 && fp[i - 2] == '.' && fp[i - 1] == c);
27 }
28
29 /*
30 * Toggle the option c.
31 */
togopt(c)32 togopt(c)
33 char c;
34 {
35 register char *tp;
36
37 tp = &opt( c );
38 *tp = 1 - *tp;
39 }
40
41 /*
42 * Set the time vector "tvec" to the
43 * modification time stamp of a file.
44 */
gettime(filename)45 gettime( filename )
46 char *filename;
47 {
48 #include <sys/stat.h>
49 struct stat stb;
50
51 stat(filename, &stb);
52 tvec = stb.st_mtime;
53 }
54
55 /*
56 * Convert a "ctime" into a Pascal styple time line
57 */
58 char *
myctime(tv)59 myctime(tv)
60 int *tv;
61 {
62 register char *cp, *dp;
63 extern char *ctime();
64 char *cpp;
65 static char mycbuf[26];
66
67 cpp = ctime(tv);
68 dp = mycbuf;
69 cp = cpp;
70 cpp[16] = 0;
71 while (*dp++ = *cp++);
72 dp--;
73 cp = cpp+19;
74 cpp[24] = 0;
75 while (*dp++ = *cp++);
76 return (mycbuf);
77 }
78
79 /*
80 * Is "fp" in the command line list of names ?
81 */
inpflist(fp)82 inpflist(fp)
83 char *fp;
84 {
85 register i;
86 register char **pfp;
87
88 pfp = pflist;
89 for (i = pflstc; i > 0; i--)
90 if (pstrcmp(fp, *pfp++) == 0)
91 return (1);
92 return (0);
93 }
94 #endif
95
96 /*
97 * Boom!
98 */
Perror(file,error)99 Perror(file, error)
100 char *file, *error;
101 {
102
103 fprintf( stderr , "%s: %s\n" , file , error );
104 }
105
106 int *
pcalloc(num,size)107 pcalloc(num, size)
108 int num, size;
109 {
110 register int *p1, *p2, nbyte;
111
112 nbyte = (num*size+( ( sizeof ( int ) ) - 1 ) ) & ~( ( sizeof ( int ) ) - 1 );
113 if ((p1 = (int *) malloc((unsigned) nbyte)) == 0)
114 return (0);
115 p2 = p1;
116 nbyte /= sizeof ( int );
117 do {
118 *p2++ = 0;
119 } while (--nbyte);
120 return (p1);
121 }
122
123 /*
124 * Compare strings: s1>s2: >0 s1==s2: 0 s1<s2: <0
125 */
pstrcmp(s1,s2)126 pstrcmp(s1, s2)
127 register char *s1, *s2;
128 {
129
130 while (*s1 == *s2++)
131 if (*s1++=='\0')
132 return (0);
133 return (*s1 - *--s2);
134 }
135
136 /*
137 * Copy string s2 to s1.
138 * S1 must be large enough.
139 * Return s1.
140 */
141 char *
pstrcpy(s1,s2)142 pstrcpy(s1, s2)
143 register char *s1, *s2;
144 {
145 register char *os1;
146
147 os1 = s1;
148 while (*s1++ = *s2++)
149 continue;
150 return (os1);
151 }
152
153 /*
154 * Strlen is currently a freebie of perror
155 * Take the length of a string.
156 * Note that this does not include the trailing null!
157 strlen(cp)
158 register char *cp;
159 {
160 register int i;
161
162 for (i = 0; *cp != 0; cp++)
163 i++;
164 return (i);
165 }
166 */
copy(to,from,bytes)167 copy(to, from, bytes)
168 register char *to, *from;
169 register int bytes;
170 {
171
172 if (bytes != 0)
173 do
174 *to++ = *from++;
175 while (--bytes);
176 }
177
178 /*
179 * Is ch one of the characters in the string cp ?
180 */
any(cp,ch)181 any(cp, ch)
182 register char *cp;
183 char ch;
184 {
185
186 while (*cp)
187 if (*cp++ == ch)
188 return (1);
189 return (0);
190 }
191
opush(c)192 opush(c)
193 register CHAR c;
194 {
195
196 c -= 'A';
197 optstk[c] <<= 1;
198 optstk[c] |= opts[c];
199 opts[c] = 1;
200 #ifdef PI0
201 send(ROPUSH, c);
202 #endif
203 }
204
opop(c)205 opop(c)
206 register CHAR c;
207 {
208
209 c -= 'A';
210 opts[c] = optstk[c] & 1;
211 optstk[c] >>= 1;
212 #ifdef PI0
213 send(ROPOP, c);
214 #endif
215 }
216