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