xref: /csrg-svn/usr.bin/pascal/src/subr.c (revision 62219)
148116Sbostic /*-
2*62219Sbostic  * Copyright (c) 1980, 1993
3*62219Sbostic  *	The Regents of the University of California.  All rights reserved.
448116Sbostic  *
548116Sbostic  * %sccs.include.redist.c%
622196Sdist  */
7777Speter 
814744Sthien #ifndef lint
9*62219Sbostic static char sccsid[] = "@(#)subr.c	8.1 (Berkeley) 06/06/93";
1048116Sbostic #endif /* not lint */
11777Speter 
12777Speter #include "whoami.h"
13777Speter #include "0.h"
14777Speter 
15777Speter #ifndef PI1
16777Speter /*
17777Speter  * Does the string fp end in '.' and the character c ?
18777Speter  */
dotted(fp,c)19777Speter dotted(fp, c)
20777Speter 	register char *fp;
21777Speter 	char c;
22777Speter {
23777Speter 	register int i;
24777Speter 
25777Speter 	i = strlen(fp);
26777Speter 	return (i > 1 && fp[i - 2] == '.' && fp[i - 1] == c);
27777Speter }
28777Speter 
29777Speter /*
30777Speter  * Toggle the option c.
31777Speter  */
togopt(c)32777Speter togopt(c)
33777Speter 	char c;
34777Speter {
35777Speter 	register char *tp;
36777Speter 
37777Speter 	tp = &opt( c );
38777Speter 	*tp = 1 - *tp;
39777Speter }
40777Speter 
41777Speter /*
42777Speter  * Set the time vector "tvec" to the
43777Speter  * modification time stamp of a file.
44777Speter  */
gettime(filename)45777Speter gettime( filename )
46777Speter     char *filename;
47777Speter {
486555Speter #include <sys/stat.h>
49777Speter 	struct stat stb;
50777Speter 
51777Speter 	stat(filename, &stb);
52777Speter 	tvec = stb.st_mtime;
53777Speter }
54777Speter 
55777Speter /*
56777Speter  * Convert a "ctime" into a Pascal styple time line
57777Speter  */
58777Speter char *
myctime(tv)59777Speter myctime(tv)
60777Speter 	int *tv;
61777Speter {
62777Speter 	register char *cp, *dp;
6314744Sthien 	extern char *ctime();
64777Speter 	char *cpp;
65777Speter 	static char mycbuf[26];
66777Speter 
67777Speter 	cpp = ctime(tv);
68777Speter 	dp = mycbuf;
69777Speter 	cp = cpp;
70777Speter 	cpp[16] = 0;
71777Speter 	while (*dp++ = *cp++);
72777Speter 	dp--;
73777Speter 	cp = cpp+19;
74777Speter 	cpp[24] = 0;
75777Speter 	while (*dp++ = *cp++);
76777Speter 	return (mycbuf);
77777Speter }
78777Speter 
79777Speter /*
80777Speter  * Is "fp" in the command line list of names ?
81777Speter  */
inpflist(fp)82777Speter inpflist(fp)
83777Speter 	char *fp;
84777Speter {
8514744Sthien 	register i;
8614744Sthien 	register char **pfp;
87777Speter 
88777Speter 	pfp = pflist;
89777Speter 	for (i = pflstc; i > 0; i--)
9014744Sthien 		if (pstrcmp(fp, *pfp++) == 0)
91777Speter 			return (1);
92777Speter 	return (0);
93777Speter }
94777Speter #endif
95777Speter 
96777Speter /*
97777Speter  * Boom!
98777Speter  */
Perror(file,error)99777Speter Perror(file, error)
100777Speter 	char *file, *error;
101777Speter {
102777Speter 
1031838Speter 	fprintf( stderr , "%s: %s\n" , file , error );
104777Speter }
105777Speter 
106777Speter int *
pcalloc(num,size)10714744Sthien pcalloc(num, size)
108777Speter 	int num, size;
109777Speter {
11014744Sthien 	register int *p1, *p2, nbyte;
111777Speter 
112777Speter 	nbyte = (num*size+( ( sizeof ( int ) ) - 1 ) ) & ~( ( sizeof ( int ) ) - 1 );
11314744Sthien 	if ((p1 = (int *) malloc((unsigned) nbyte)) == 0)
1141836Speter 		return (0);
11514744Sthien 	p2 =  p1;
116777Speter 	nbyte /= sizeof ( int );
117777Speter 	do {
118777Speter 		*p2++ = 0;
119777Speter 	} while (--nbyte);
120777Speter 	return (p1);
121777Speter }
122777Speter 
123777Speter /*
124777Speter  * Compare strings:  s1>s2: >0  s1==s2: 0  s1<s2: <0
125777Speter  */
pstrcmp(s1,s2)12614744Sthien pstrcmp(s1, s2)
127777Speter 	register char *s1, *s2;
128777Speter {
129777Speter 
130777Speter 	while (*s1 == *s2++)
131777Speter 		if (*s1++=='\0')
132777Speter 			return (0);
133777Speter 	return (*s1 - *--s2);
134777Speter }
135777Speter 
136777Speter /*
137777Speter  * Copy string s2 to s1.
138777Speter  * S1 must be large enough.
139777Speter  * Return s1.
140777Speter  */
14114744Sthien char *
pstrcpy(s1,s2)14214744Sthien pstrcpy(s1, s2)
143777Speter 	register char *s1, *s2;
144777Speter {
14514744Sthien 	register char *os1;
146777Speter 
147777Speter 	os1 = s1;
148777Speter 	while (*s1++ = *s2++)
149777Speter 		continue;
150777Speter 	return (os1);
151777Speter }
152777Speter 
153777Speter /*
154777Speter  * Strlen is currently a freebie of perror
155777Speter  * Take the length of a string.
156777Speter  * Note that this does not include the trailing null!
157777Speter strlen(cp)
158777Speter 	register char *cp;
159777Speter {
160777Speter 	register int i;
161777Speter 
162777Speter 	for (i = 0; *cp != 0; cp++)
163777Speter 		i++;
164777Speter 	return (i);
165777Speter }
166777Speter  */
copy(to,from,bytes)167777Speter copy(to, from, bytes)
168777Speter 	register char *to, *from;
169777Speter 	register int bytes;
170777Speter {
171777Speter 
172777Speter 	if (bytes != 0)
173777Speter 		do
174777Speter 			*to++ = *from++;
175777Speter 		while (--bytes);
176777Speter }
177777Speter 
178777Speter /*
179777Speter  * Is ch one of the characters in the string cp ?
180777Speter  */
any(cp,ch)181777Speter any(cp, ch)
182777Speter 	register char *cp;
183777Speter 	char ch;
184777Speter {
185777Speter 
186777Speter 	while (*cp)
187777Speter 		if (*cp++ == ch)
188777Speter 			return (1);
189777Speter 	return (0);
190777Speter }
191777Speter 
opush(c)192777Speter opush(c)
193777Speter 	register CHAR c;
194777Speter {
195777Speter 
196777Speter 	c -= 'A';
197777Speter 	optstk[c] <<= 1;
198777Speter 	optstk[c] |= opts[c];
199777Speter 	opts[c] = 1;
200777Speter #ifdef PI0
201777Speter 	send(ROPUSH, c);
202777Speter #endif
203777Speter }
204777Speter 
opop(c)205777Speter opop(c)
206777Speter 	register CHAR c;
207777Speter {
208777Speter 
209777Speter 	c -= 'A';
210777Speter 	opts[c] = optstk[c] & 1;
211777Speter 	optstk[c] >>= 1;
212777Speter #ifdef PI0
213777Speter 	send(ROPOP, c);
214777Speter #endif
215777Speter }
216