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