|
|
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.