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