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