|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <tree.h>
4: # include "parser.h"
5: # include <catalog.h>
6: # include <pv.h>
7: # include <symbol.h>
8: # include <sccs.h>
9:
10: SCCSID(@(#)par_util.c 7.2 5/31/83)
11:
12: /*
13: ** PAR_UTIL -- parser utility functions
14: **
15: ** These functions are generally unrelated except that they are
16: ** needed to operate the parser and are too small to be considered
17: ** seperate modules.
18: **
19: ** Defined Constants:
20: **
21: ** Defines:
22: ** timeofday -- convert arguments to minutes since midnight
23: ** tlprepend -- attach two target list components
24: ** header -- prints the header for a retrieve to terminal
25: ** patmat -- converts pattern matching characters in a string
26: ** permcom -- adds a command to the permit command vector
27: **
28: ** Requires:
29: ** nothing
30: **
31: ** Required By:
32: ** y.tab.c -- the grammar
33: **
34: ** Files:
35: ** none
36: **
37: ** Compilation Flags:
38: ** none
39: **
40: ** Trace Flags:
41: ** PAR_UTIL.C ~~ 62, 63
42: **
43: ** History:
44: ** 20 Dec 1978 -- written (rick)
45: */
46:
47:
48:
49:
50:
51:
52:
53:
54: /*
55: ** TIMEOFDAY -- convert 2 integers to minutes since midnight
56: **
57: ** Converts the hours and minutes parameters to minutes since midnight
58: ** performing some error (bounds) checking on the time.
59: **
60: ** To answer the question about what is midnight, both 0:00 and 24:00
61: ** are handled, but not the same way. The former is zero minutes from
62: ** midnight and the latter is 1440 minutes from midnight. (1440 is
63: ** 24 hrs times 60 minutes, or 1 minute past the end of the day.)
64: **
65: ** Parameters:
66: ** hrs -- an integer pointer to the hour
67: ** mins -- an integer pointer to the minutes
68: **
69: ** Returns:
70: ** integer time since midnight
71: **
72: ** Side Effects:
73: ** may detect an error and call par_error which never returns.
74: **
75: ** Requires:
76: ** that the pointers be on integer boundaries
77: **
78: ** Called By:
79: ** y.tab.c -- the grammar
80: **
81: ** Trace Flags:
82: ** none
83: **
84: ** Diagnostics:
85: ** BADHOURS -- No such hour
86: ** BADMINS -- No such minute
87: ** BAD24TIME -- only 24:00 allowed
88: **
89: ** Syserrs:
90: ** none
91: **
92: ** History:
93: ** 20 Dec 1978 -- written (rick)
94: */
95: timeofday(hrs, mins)
96: int *hrs;
97: int *mins;
98: {
99: register int h;
100: register int m;
101: register int rtval;
102:
103: h = *hrs;
104: m = *mins;
105: if (h > 24 || h < 0)
106: /* no such hour */
107: par_error(BADHOURS, WARN, iocv(h), 0);
108: if (m > 59 || h < 0)
109: /* no such minute */
110: par_error(BADMINS, WARN, iocv(m), 0);
111: if (h == 24)
112: {
113: h = 1440;
114: if (m != 0)
115: /* can only use 24:00 */
116: par_error(BAD24TIME, WARN, iocv(m), 0);
117: }
118: rtval = (h * 60) + m;
119: return (rtval);
120: }
121:
122:
123: /*
124: ** TLPREPEND -- combine two target list components
125: **
126: ** Attach two target list components to each other.
127: ** Neither component need be a single element. The
128: ** 'a' component will be attached at the extreme left
129: ** of the 'b' component.
130: **
131: ** Parameters:
132: ** a -- tl component to attach
133: ** b -- tl base for attaching
134: **
135: ** Returns:
136: ** nothing
137: **
138: ** Side Effects:
139: ** this routine is a side effect. It attaches a to b
140: ** and when it returns a is attached to b but the pointer
141: ** to b never changes (neither does the pointer to a)
142: **
143: ** Requires:
144: ** nothing
145: **
146: ** Called By:
147: ** y.tab.c -- the grammar
148: **
149: ** Trace Flags:
150: ** tlprepend ~~ 62.4
151: **
152: ** Diagnostics:
153: ** none
154: **
155: ** Syserrs:
156: ** none
157: **
158: ** History:
159: ** 20 Dec 1978 -- written (rick)
160: */
161:
162: QTREE *
163: tlprepend(a, b)
164: QTREE *a;
165: QTREE *b;
166: {
167: register QTREE *q;
168:
169: # ifdef xPTR1
170: tTfp(62, 4, "tlprepend\n");
171: # endif
172:
173: /* scan to the left end of b */
174: for (q = b; q->left != NULL; q = q->left)
175: ; /* no action */
176:
177: /* attach a to the end of b */
178: q->left = a;
179: return (b);
180: }
181:
182:
183:
184:
185: /*
186: ** HEADER.C -- print header for retrieve to terminal
187: **
188: ** "setp" to reconstruct the field names and types and passing
189: ** them to the normal printhdr etc.
190: **
191: ** Defines:
192: ** header()
193: **
194: ** Requires:
195: ** printhdr - utility lib
196: ** beginhdr - utility lib
197: ** printeol - utility lib
198: ** printeh - utility lib
199: ** atoi - utility lib
200: ** Dc - vble, number of params in list
201: ** Dv - vble, list of parameters
202: **
203: ** Trace Flags:
204: ** none
205: **
206: ** History:
207: ** written (ancient history) (rick)
208: */
209: header(pv)
210: PARM *pv;
211: {
212: int len;
213:
214: beginhdr();
215:
216: for (; pv->pv_type != PV_EOF; pv += 2)
217: {
218: len = atoi(&pv[1].pv_val.pv_str[1]);
219:
220: printhdr(pv[1].pv_val.pv_str[0] & I1MASK, len, pv->pv_val.pv_str);
221: }
222: printeol();
223: printeh();
224: }
225:
226:
227:
228:
229:
230:
231: /*
232: ** PATMAT -- converts pattern matching characters in a string
233: **
234: ** Searches a string up to a null byte for one of the pattern
235: ** matching characters '*', '?', '[', and ']'. It then converts
236: ** these characters to their internal control character equivalents.
237: **
238: ** Parameters:
239: ** str -- the string to search
240: **
241: ** Returns:
242: ** 0 -- no pattern matching in string
243: ** 1 -- at least one pattern matching character
244: **
245: ** Side Effects:
246: ** none
247: **
248: ** Requires:
249: ** symbol.h
250: **
251: ** Called By:
252: ** y.tab.c -- grammar
253: **
254: ** Trace Flags:
255: ** none
256: **
257: ** Diagnostics:
258: ** none
259: **
260: ** Syserrs:
261: ** none
262: **
263: ** History:
264: ** written (ancient history) (rick)
265: */
266:
267:
268: /*
269: ** PATMAT
270: ** hunts through a string and converts the pattern matching
271: ** characters and replaces with the corresponding cntrl chars
272: */
273: patmat(str)
274: char *str;
275: {
276: register char *p, *q;
277: register int flag;
278:
279: flag = 0;
280: q = str;
281: for (p = str; *p; p++)
282: {
283: if (*p == '\\')
284: {
285: *q++ = *++p;
286: continue;
287: }
288: switch (*p)
289: {
290: case '*':
291: *q++ = PAT_ANY;
292: flag = 1;
293: continue;
294:
295: case '?':
296: *q++ = PAT_ONE;
297: flag = 1;
298: continue;
299:
300: case '[':
301: *q++ = PAT_LBRAC;
302: flag = 1;
303: continue;
304:
305: case ']':
306: *q++ = PAT_RBRAC;
307: flag = 1;
308: continue;
309: }
310: *q++ = *p;
311: }
312: *q = '\0';
313: return (flag);
314: }
315: /*
316: ** PERMCOM -- map command allowed into protection catalog bits
317: **
318: ** translates the QMODE type symbols into the appropriate counterparts
319: ** for the permit statement allowed command vector. The manifest
320: ** constants are designed to be inclusive or'd together to form a
321: ** composite bit map of OK actions.
322: **
323: ** Parameters:
324: ** a -- the QMODE type symbol for the command to add
325: **
326: ** Returns:
327: ** none
328: **
329: ** Side Effects:
330: ** changes the variable Permcomd to reflect the additional permission
331: **
332: ** Requires:
333: ** Permcomd must be define globally
334: ** catalog.h for the proper constants
335: **
336: ** Called By:
337: ** y.tab.c -- the grammar
338: **
339: ** Trace Flags:
340: ** none
341: **
342: ** Diagnostics:
343: ** none
344: **
345: ** Syserrs:
346: ** bad QMODE(%d) -- a bad symbol has been passed for mapping
347: **
348: ** History:
349: ** 28 Dec 1978 -- written (rick)
350: */
351:
352: permcom(a)
353: int a;
354: {
355: extern int Permcomd;
356: switch (a)
357: {
358: case mdRETR:
359: Permcomd |= PRO_RETR;
360: break;
361:
362: case mdAPP:
363: Permcomd |= PRO_APP;
364: break;
365:
366: case mdREPL:
367: Permcomd |= PRO_REPL;
368: break;
369:
370: case mdDEL:
371: Permcomd |= PRO_DEL;
372: break;
373:
374: case -1:
375: Permcomd |= 0177777; /* all bits set */
376: break;
377:
378: default:
379: syserr("permcom: bad QMODE(%d)", a);
380: }
381: }
382:
383: char *
384: makestr(str)
385: register char *str;
386: {
387: register char *result;
388: register int len;
389:
390: len = length(str) + 1;
391:
392: result = (char *) need(Qbuf, len);
393:
394: bmove(str, result, len);
395:
396: return (result);
397: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.