xref: /csrg-svn/usr.bin/pascal/src/subr.c (revision 1807)
1777Speter /* Copyright (c) 1979 Regents of the University of California */
2777Speter 
3*1807Speter static	char sccsid[] = "@(#)subr.c 1.2 11/13/80";
4777Speter 
5777Speter #include "whoami.h"
6777Speter #include "0.h"
7777Speter 
8777Speter #ifndef PI1
9777Speter /*
10777Speter  * Does the string fp end in '.' and the character c ?
11777Speter  */
12777Speter dotted(fp, c)
13777Speter 	register char *fp;
14777Speter 	char c;
15777Speter {
16777Speter 	register int i;
17777Speter 
18777Speter 	i = strlen(fp);
19777Speter 	return (i > 1 && fp[i - 2] == '.' && fp[i - 1] == c);
20777Speter }
21777Speter 
22777Speter /*
23777Speter  * Toggle the option c.
24777Speter  */
25777Speter togopt(c)
26777Speter 	char c;
27777Speter {
28777Speter 	register char *tp;
29777Speter 
30777Speter 	tp = &opt( c );
31777Speter 	*tp = 1 - *tp;
32777Speter }
33777Speter 
34777Speter /*
35777Speter  * Set the time vector "tvec" to the
36777Speter  * modification time stamp of a file.
37777Speter  */
38777Speter gettime( filename )
39777Speter     char *filename;
40777Speter {
41777Speter #include <stat.h>
42777Speter 	struct stat stb;
43777Speter 
44777Speter 	stat(filename, &stb);
45777Speter 	tvec = stb.st_mtime;
46777Speter }
47777Speter 
48777Speter /*
49777Speter  * Convert a "ctime" into a Pascal styple time line
50777Speter  */
51777Speter char *
52777Speter myctime(tv)
53777Speter 	int *tv;
54777Speter {
55777Speter 	register char *cp, *dp;
56777Speter 	char *cpp;
57777Speter 	register i;
58777Speter 	static char mycbuf[26];
59777Speter 
60777Speter 	cpp = ctime(tv);
61777Speter 	dp = mycbuf;
62777Speter 	cp = cpp;
63777Speter 	cpp[16] = 0;
64777Speter 	while (*dp++ = *cp++);
65777Speter 	dp--;
66777Speter 	cp = cpp+19;
67777Speter 	cpp[24] = 0;
68777Speter 	while (*dp++ = *cp++);
69777Speter 	return (mycbuf);
70777Speter }
71777Speter 
72777Speter /*
73777Speter  * Is "fp" in the command line list of names ?
74777Speter  */
75777Speter inpflist(fp)
76777Speter 	char *fp;
77777Speter {
78777Speter 	register i, *pfp;
79777Speter 
80777Speter 	pfp = pflist;
81777Speter 	for (i = pflstc; i > 0; i--)
82777Speter 		if (strcmp(fp, *pfp++) == 0)
83777Speter 			return (1);
84777Speter 	return (0);
85777Speter }
86777Speter #endif
87777Speter 
88777Speter extern	int errno;
89777Speter extern	char *sys_errlist[];
90777Speter 
91777Speter /*
92777Speter  * Boom!
93777Speter  */
94777Speter Perror(file, error)
95777Speter 	char *file, *error;
96777Speter {
97777Speter 
98*1807Speter 	write(2, file, strlen(file));
99*1807Speter 	write(2, ": ", 2);
100*1807Speter 	write(2, error, strlen(error));
101*1807Speter 	write(2, "\n", 1);
102*1807Speter /*
103777Speter 	errno = 0;
104777Speter 	sys_errlist[0] = error;
105777Speter 	perror(file);
106*1807Speter */
107777Speter }
108777Speter 
109777Speter int *
110777Speter calloc(num, size)
111777Speter 	int num, size;
112777Speter {
113777Speter 	register int p1, *p2, nbyte;
114777Speter 
115777Speter 	nbyte = (num*size+( ( sizeof ( int ) ) - 1 ) ) & ~( ( sizeof ( int ) ) - 1 );
116777Speter 	if ((p1 = malloc(nbyte)) == -1 || p1==0)
117777Speter 		return (-1);
118777Speter 	p2 = p1;
119777Speter 	nbyte /= sizeof ( int );
120777Speter 	do {
121777Speter 		*p2++ = 0;
122777Speter 	} while (--nbyte);
123777Speter 	return (p1);
124777Speter }
125777Speter 
126777Speter /*
127777Speter  * Compare strings:  s1>s2: >0  s1==s2: 0  s1<s2: <0
128777Speter  */
129777Speter strcmp(s1, s2)
130777Speter 	register char *s1, *s2;
131777Speter {
132777Speter 
133777Speter 	while (*s1 == *s2++)
134777Speter 		if (*s1++=='\0')
135777Speter 			return (0);
136777Speter 	return (*s1 - *--s2);
137777Speter }
138777Speter 
139777Speter /*
140777Speter  * Copy string s2 to s1.
141777Speter  * S1 must be large enough.
142777Speter  * Return s1.
143777Speter  */
144777Speter strcpy(s1, s2)
145777Speter 	register char *s1, *s2;
146777Speter {
147777Speter 	register 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