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