|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ingres.h> ! 3: # include <aux.h> ! 4: # include <tree.h> ! 5: # include <pv.h> ! 6: # include "parser.h" ! 7: # include <symbol.h> ! 8: # include <sccs.h> ! 9: # include <errors.h> ! 10: ! 11: SCCSID(@(#)tree.c 8.3 2/8/85) ! 12: ! 13: ! 14: /* ! 15: ** TREE ! 16: ** FUNCTION TO ADD NODE TO QUERY TREE ! 17: ** RETURN VALUE IS POINTER TO NODE JUST CREATED ! 18: */ ! 19: QTREE * ! 20: tree(lptr, rptr, typ, len, valu, attnum) ! 21: QTREE *lptr; ! 22: QTREE *rptr; ! 23: char typ; ! 24: int len; ! 25: register int valu; ! 26: register struct atstash *attnum; ! 27: { ! 28: register QTREE *tptr; ! 29: extern char Trfrmt; ! 30: extern char Trfrml; ! 31: extern char *need(); ! 32: extern QTREE *norm(); ! 33: extern int Err_current; ! 34: ! 35: # ifdef xPTR3 ! 36: tTfp(55, 0, "tree type(%d), len(%d), value(%d).\n", typ, len, valu); ! 37: # endif ! 38: ! 39: if (Err_current) ! 40: return (NULL); ! 41: ! 42: /* Following is a hack. Sorry about that John. */ ! 43: if (typ == AND) ! 44: len = sizeof (struct rootnode) - sizeof (short); ! 45: ! 46: tptr = (QTREE *) need(Qbuf, QT_HDR_SIZ + len); ! 47: tptr->left = lptr; ! 48: tptr->right = rptr; ! 49: tptr->sym.type = typ; ! 50: tptr->sym.len = len; ! 51: ! 52: switch (typ) ! 53: { ! 54: case VAR: ! 55: tptr->sym.value.sym_var.varno = valu & I1MASK; ! 56: tptr->sym.value.sym_var.attno = attnum->atbid; ! 57: tptr->sym.value.sym_var.varfrmt = attnum->atbfrmt; ! 58: tptr->sym.value.sym_var.varfrml = attnum->atbfrml; ! 59: tptr->sym.value.sym_var.valptr = NULL; ! 60: tptr->sym.value.sym_var.varstr = NULL; ! 61: break; ! 62: ! 63: case ROOT: ! 64: case AGHEAD: ! 65: tptr->sym.value.sym_root.rootuser = valu; ! 66: break; ! 67: ! 68: case TREE: ! 69: case BYHEAD: ! 70: case AND: ! 71: case OR: ! 72: case QLEND: ! 73: break; ! 74: ! 75: case UOP: ! 76: case BOP: ! 77: tptr->sym.value.sym_op.opno = valu; ! 78: format(tptr); ! 79: break; ! 80: ! 81: case COP: ! 82: if ((tptr->sym.value.sym_op.opno = getcop(valu)) == BADCOP) ! 83: { ! 84: /* bad const operator */ ! 85: par_error(BADCONSTOP, WARN, valu, 0); ! 86: return(NULL); ! 87: } ! 88: break; ! 89: ! 90: case AOP: ! 91: format(tptr->right); ! 92: tptr->sym.value.sym_op.agfrmt = Trfrmt; ! 93: tptr->sym.value.sym_op.agfrml = Trfrml; ! 94: ! 95: case RESDOM: ! 96: tptr->sym.value.sym_resdom.resno = valu; ! 97: format(tptr); ! 98: tptr->sym.value.sym_resdom.resfrmt = Trfrmt; ! 99: tptr->sym.value.sym_resdom.resfrml = Trfrml; ! 100: break; ! 101: ! 102: default: ! 103: /* INT, FLOAT, CHAR */ ! 104: bmove(valu, &tptr->sym.value, len & I1MASK); ! 105: break; ! 106: } ! 107: return (tptr); ! 108: } ! 109: ! 110: /* ! 111: ** WINDUP ! 112: ** assign resno's to resdoms of an agg fcn ! 113: */ ! 114: windup(ptr) ! 115: QTREE *ptr; ! 116: { ! 117: register int tot; ! 118: register int kk; ! 119: register QTREE *t; ! 120: ! 121: /* COUNT THE RESDOM'S OF THIS TARGET LIST */ ! 122: kk = 1; ! 123: for (t = ptr; t; t = t->left) ! 124: kk++; ! 125: tot = 1; ! 126: for (t=ptr; t;t = t->left) ! 127: t->sym.value.sym_resdom.resno = kk - tot++; ! 128: } ! 129: ! 130: /* ! 131: ** ADDRESDOM - makes a new entry for the target list ! 132: ** ! 133: ** Trname must contain the name of the resdom to ! 134: ** use for the header, create and Rsdmno for append, replace ! 135: ** ! 136: ** the parameters are pointers to the subtrees to be ! 137: ** suspended from the node ! 138: */ ! 139: QTREE * ! 140: addresdom(lptr, rptr) ! 141: QTREE *lptr, *rptr; ! 142: { ! 143: register QTREE *rtval; ! 144: register struct atstash *aptr; ! 145: char buf[10]; /* buffer type and length in ascii for dbu */ ! 146: ! 147: extern int Opflag; ! 148: extern int Rsdmno; ! 149: extern int Equel; ! 150: extern int Resrng; ! 151: extern char Trfrmt; ! 152: extern char Trfrml; ! 153: extern char *Trname; ! 154: extern PARRNG Parrng[]; ! 155: ! 156: extern QTREE *tree(); ! 157: extern struct atstash *attlookup(); ! 158: ! 159: int temp; ! 160: ! 161: switch (Opflag) ! 162: { ! 163: case mdSTOP: ! 164: rtval = NULL; ! 165: break; ! 166: case mdRETR: ! 167: case mdRET_UNI: ! 168: case mdVIEW: ! 169: Rsdmno++; ! 170: if (Rsdmno >= MAXDOM) ! 171: /* too many resdoms */ ! 172: par_error(RESXTRA, FATAL, 0); ! 173: rtval = tree(lptr, rptr, RESDOM, sizeof (struct resdomnode), Rsdmno); ! 174: if (!Equel || Resrng) ! 175: { ! 176: /* buffer info for header or CREATE */ ! 177: setp(PV_STR, Trname); ! 178: ! 179: buf[0] = Trfrmt & I1MASK; ! 180: smove(iocv(Trfrml & I1MASK), &buf[1]); ! 181: ! 182: setp(PV_STR, buf); ! 183: } ! 184: break; ! 185: ! 186: default: ! 187: /* ! 188: ** for append and replace, the result domain ! 189: ** number is determined by the location of ! 190: ** the attribute in the result relation ! 191: */ ! 192: if (sequal(Trname, "tid")) ! 193: /* attrib not found */ ! 194: par_error(NOATTRIN, WARN, Trname, ! 195: trim_relname(Parrng[Resrng].vardesc.reldum.relid), 0); ! 196: # ifdef DISTRIB ! 197: if (sequal(Trname, "sid")) ! 198: /* attrib not found */ ! 199: par_error(NOATTRIN, WARN, Trname, ! 200: trim_relname(Parrng[Resrng].vardesc.reldum.relid), 0); ! 201: # endif ! 202: aptr = attlookup(Resrng, Trname); ! 203: Rsdmno = aptr->atbid; ! 204: rtval = tree(lptr, rptr, RESDOM, sizeof (struct resdomnode), Rsdmno); ! 205: if (Opflag != mdPROT) /* INTEGRITY not possible here */ ! 206: attcheck(aptr); ! 207: break; ! 208: } ! 209: return (rtval); ! 210: } ! 211: /* ! 212: ** GETCOP ! 213: ** routine to lookup 'string' in constant operators table ! 214: ** constant table is declared in tables.y ! 215: ** structure is defined in ../parser.h ! 216: */ ! 217: getcop(string) ! 218: char *string; ! 219: { ! 220: register struct constop *cpt; ! 221: register char *sptr; ! 222: extern struct constop Coptab[]; ! 223: ! 224: sptr = string; ! 225: for (cpt = Coptab; cpt->copname; cpt++) ! 226: if (sequal(sptr, cpt->copname)) ! 227: return (cpt->copnum); ! 228: return (BADCOP); ! 229: } ! 230: ! 231: /* ! 232: ** SUBSTRING ! 233: ** creates structure to save delimiters of a substring ! 234: ** structure is defined in ../h/tree.h ! 235: */ ! 236: STRKEEPER ! 237: *substring(str,isname) ! 238: char *str; ! 239: int isname; ! 240: { ! 241: extern char *need(); ! 242: STRKEEPER *s; ! 243: ! 244: s = (STRKEEPER *) need(Qbuf,sizeof(STRKEEPER)); ! 245: s->number[0] = 1; ! 246: s->string[0] = str; ! 247: if (isname) ! 248: s->flag[0] = 1; ! 249: if (str == NULL) ! 250: s->flag[0] |= 2; ! 251: return(s); ! 252: } ! 253: ! 254: STRKEEPER ! 255: *endvals(interval,left,right) ! 256: STRKEEPER *interval; ! 257: int left,right; ! 258: { ! 259: if (left == '(') ! 260: interval->type[0] = OPEN; ! 261: else ! 262: interval->type[0] = CLOSED; ! 263: if (right == ')') ! 264: interval->type[1] = OPEN; ! 265: else ! 266: interval->type[1] = CLOSED; ! 267: return(interval); ! 268: } ! 269: ! 270: setnumber(interval,num) ! 271: STRKEEPER *interval; ! 272: int *num; ! 273: { ! 274: interval->number[0] = *num; ! 275: } ! 276: ! 277: ! 278: groupstrings(left,right) ! 279: STRKEEPER *left,*right; ! 280: { ! 281: left->string[1] = right->string[0]; ! 282: left->flag[1] = right->flag[0]; ! 283: left->number[1] = right->number[0]; ! 284: } ! 285: ! 286: ! 287: /* ! 288: ** CHECK_BNF -- check the legality of a simplified BNF defnition ! 289: ** ! 290: ** Parameters: ! 291: ** str-- the string to be checked ! 292: ** ! 293: ** Returns: ! 294: ** 0 - the string is legal ! 295: ** <0 - the string is not legal ! 296: ** -1 : bracket,brace not matched ! 297: ** -2 : hyphen misused ! 298: ** ! 299: ** Called by: ! 300: ** make_tuples ! 301: ** ! 302: ** Comments: ! 303: ** the string may not contain nested braces or brackets ! 304: ** these chars have special meaning and must be ! 305: ** backslashed: { } [ ] - \ ! 306: ** ! 307: */ ! 308: ! 309: check_bnf(str) ! 310: char *str; ! 311: { ! 312: char *temp; /* temp ptr to string */ ! 313: int len; /* length of string */ ! 314: char ch; /* ptr to one char of string */ ! 315: char nextch; ! 316: int inbrace=0; /* keeps track of braces */ ! 317: int inbrak=0; /* keeps track of brackets */ ! 318: ! 319: ! 320: len = strlen(str); ! 321: temp = str; ! 322: ! 323: while (len > 0) ! 324: { ! 325: len--; ! 326: ch = *temp++; ! 327: ! 328: switch (ch) ! 329: { ! 330: case LBRACKET: ! 331: if (!inbrace) ! 332: inbrak++; ! 333: else ! 334: return(-1); ! 335: break; ! 336: case RBRACKET: ! 337: inbrak--; ! 338: if (inbrak != 0) ! 339: return(-1); ! 340: break; ! 341: case LBRACE: ! 342: if (!inbrak) ! 343: inbrace++; ! 344: else ! 345: return(-1); ! 346: break; ! 347: case RBRACE: ! 348: inbrace--; ! 349: if (inbrace != 0) ! 350: return(-1); ! 351: break; ! 352: case '-': ! 353: return(-2); ! 354: break; ! 355: case '\\': ! 356: *temp++; ! 357: break; ! 358: default: ! 359: nextch = *temp; ! 360: if (nextch == '-') ! 361: { ! 362: *temp++; ! 363: len--; ! 364: if (!len) ! 365: return(-2); ! 366: ch = *temp; ! 367: switch(ch) ! 368: { ! 369: case LBRACKET: ! 370: case RBRACKET: ! 371: case LBRACE: ! 372: case RBRACE: ! 373: case '-': ! 374: return(-2); ! 375: break; ! 376: case '\\': ! 377: *temp++; ! 378: break; ! 379: default: ! 380: break; ! 381: } ! 382: } ! 383: } ! 384: } ! 385: if ((inbrace) || (inbrak)) ! 386: return(-1); ! 387: return(0); ! 388: } ! 389: ! 390: ! 391: /* ! 392: ** MAKE_TUPLES -- create the tuples for the 'rdelim' relation ! 393: ** as specified by a user-defined delimitor ! 394: ** ! 395: ** Paramaters: ! 396: ** desc--descriptor for the relation ! 397: ** group--group name for the delimitor ! 398: ** delim--name of the delimitor ! 399: ** str-bnf string specifying the delimitor ! 400: ** ! 401: ** Returns: ! 402: ** 0 if successful ! 403: ** <0 if not successful ! 404: ** -1,-2: BNF expression not legal ! 405: ** ! 406: */ ! 407: make_tuples(desc,group,delim,str) ! 408: DESC *desc; ! 409: char *group; ! 410: char *delim; ! 411: char *str; ! 412: { ! 413: int err; /* error status of bnf string */ ! 414: char *map; /* pointer to next string to make into bitmap */ ! 415: int len; /* len of str */ ! 416: int mlen; /* len of substring to make into bitmap */ ! 417: int order; /* order of bitmap */ ! 418: int type; /* type of interval ONE or ZEROMORE */ ! 419: char ch; /* pointer to current char */ ! 420: ! 421: err = check_bnf(str); ! 422: if (err < 0) ! 423: return(err); ! 424: ! 425: len = strlen(str); ! 426: order = 0; ! 427: ! 428: while (len > 0) ! 429: { ! 430: order++; ! 431: map = str; ! 432: mlen = 0; ! 433: ! 434: ch = *str++; ! 435: len--; ! 436: ! 437: switch (ch) ! 438: { ! 439: case LBRACKET: ! 440: type = ONE; ! 441: map = str; ! 442: while ((ch = *str++) != RBRACKET) ! 443: { ! 444: mlen++; ! 445: len--; ! 446: if (ch == '\\') ! 447: { ! 448: ch = *str++; ! 449: mlen++; ! 450: len--; ! 451: } ! 452: } ! 453: len--; ! 454: break; ! 455: ! 456: case LBRACE: ! 457: type = ZEROMORE; ! 458: map = str; ! 459: while ((ch = *str++) != RBRACE) ! 460: { ! 461: mlen++; ! 462: len--; ! 463: if (ch == '\\') ! 464: { ! 465: ch = *str++; ! 466: mlen++; ! 467: len--; ! 468: } ! 469: } ! 470: len--; ! 471: break; ! 472: ! 473: default: ! 474: type = ONE; ! 475: if (ch == '\\') ! 476: { ! 477: map = str; ! 478: ch = *str++; ! 479: len--; ! 480: mlen = 1; ! 481: } ! 482: if (*str == '-') ! 483: { ! 484: *str++; ! 485: len--; ! 486: mlen++; ! 487: *str++; ! 488: len--; ! 489: mlen++; ! 490: } ! 491: else ! 492: mlen = 1; ! 493: break; ! 494: } ! 495: ! 496: create_tup(desc,order,group,delim,type,map,mlen); ! 497: } ! 498: return(0); ! 499: } ! 500: ! 501: ! 502: ! 503: /* ! 504: ** CREATE_TUP-- create a tuple in the 'rdelim' relation ! 505: ** ! 506: ** Parameters: ! 507: ** desc - descriptor for the relation ! 508: ** order - order field for tuple ! 509: ** group - group field for tuple ! 510: ** delim - delim field for tuple ! 511: ** type - type field for tuple ! 512: ** str - string to be converted into bitmap ! 513: ** strlen - length of str ! 514: ** ! 515: ** Called by: ! 516: ** make_tuples ! 517: */ ! 518: create_tup(desc,order,group,delim,type,str,strlen) ! 519: DESC *desc; ! 520: int order; ! 521: char *group; ! 522: char *delim; ! 523: int type; ! 524: char *str; ! 525: int strlen; ! 526: { ! 527: DELIM_TUP *tuple; ! 528: char bitmap[BITMAPLEN]; ! 529: TID *tid; ! 530: char *malloc(); ! 531: char *make_dmap(); ! 532: char b[BITMAPLEN]; ! 533: int i; ! 534: ! 535: ! 536: tuple = (DELIM_TUP *) malloc (sizeof(DELIM_TUP)); ! 537: tuple->order = order; ! 538: strcpy(tuple->group,group); ! 539: strcpy(tuple->delim,delim); ! 540: tuple->type = type; ! 541: ! 542: make_dmap(str,strlen,b); ! 543: for ( i= 0; i< BITMAPLEN; i++) ! 544: tuple->bitmap[i] = b[i]; ! 545: ! 546: insert(desc,&tid,tuple,1); ! 547: } ! 548: ! 549: ! 550: /* ! 551: ** MAKE_DMAP -- given a BNF string, make the corresponding bitmap ! 552: ** ! 553: ** Parameters: ! 554: ** str - BNF string ! 555: ** len - length of string ! 556: ** ! 557: ** Called by: ! 558: ** create_tup ! 559: ** ! 560: ** Returns: ! 561: ** pointer to the bitmap of 16 chars ! 562: ** ! 563: ** Comments: ! 564: ** The bitmap is formed of 16 chars. The total bits ! 565: ** (128) represents the characters of the ASCII set. ! 566: ** If the BNF string indicates a character, the bit ! 567: ** corresponding to that char is set in the bitmap. ! 568: ** All other bits are reset. ! 569: */ ! 570: char * ! 571: make_dmap(str,len,b) ! 572: char *str; ! 573: int len; ! 574: char *b; ! 575: { ! 576: char ch; ! 577: char nextch; ! 578: int i; ! 579: ! 580: # ifdef xPTR3 ! 581: tTfp(42,0,"DMAP: str = %s, len = %d\n",str,len); ! 582: # endif ! 583: for (i = 0; i < ACHARS; i++) ! 584: reset(b,i); ! 585: ! 586: while (len > 0) ! 587: { ! 588: ch = *str++; ! 589: len--; ! 590: if (ch == '\\') ! 591: { ! 592: ch = *str++; ! 593: len--; ! 594: } ! 595: if ( (len > 0) && (*str == '-')) ! 596: { ! 597: *str++; ! 598: len--; ! 599: nextch = *str++; ! 600: len--; ! 601: for (i = ch; i <= nextch; i++) ! 602: { ! 603: set(b,i); ! 604: } ! 605: } ! 606: else ! 607: { ! 608: set(b,ch); ! 609: } ! 610: } ! 611: return(b); ! 612: } ! 613: ! 614: /* ! 615: ** SET,RESET -- bitmap setting routines ! 616: ** ! 617: ** Parameters: ! 618: ** map: the array of chars which forms the bitmap ! 619: ** n: the bit to set or reset ! 620: ** ! 621: ** Called by: ! 622: ** make_bitmap ! 623: ** ! 624: */ ! 625: set(map,n) ! 626: char *map; ! 627: int n; ! 628: { ! 629: map[n/BITS] |= (1<<(n%BITS)); ! 630: } ! 631: ! 632: reset(map,n) ! 633: char *map; ! 634: int n; ! 635: { ! 636: map[n/BITS] &= ((1<<(n%BITS)) ^ MAXFIELD); ! 637: } ! 638: ! 639: test(map,n) ! 640: char *map; ! 641: int n; ! 642: { ! 643: return ((map[n/BITS] & (1<<(n%BITS))) != 0); ! 644: } ! 645: ! 646: /* ! 647: ** MAKE_LIST -- puts the delimitors to be used in the delim queue ! 648: ** ! 649: ** Parameters: ! 650: ** desc - descriptor for the relation ! 651: ** group - group of delims to use ! 652: ** ! 653: ** Returns: ! 654: ** 0 if ok ! 655: ** -1 if no delims could be found in the specified group ! 656: ** ! 657: ** Comments: ! 658: ** given a group name, adds all delimitors in that ! 659: ** group to the head of the delim queue, which is ! 660: ** pointed to by Delimhead. ! 661: ** if the queue is empty, the predefined delimitors ! 662: ** 'w' and 'c' will be added to the list ! 663: */ ! 664: make_list(desc,group) ! 665: DESC *desc; ! 666: char *group; ! 667: { ! 668: DELIM_TUP tuple; ! 669: TID lotid, hitid; ! 670: extern DELIMLIST *Delimhead; ! 671: DELIMLIST *d; ! 672: DMAP *map, *m; ! 673: char delim[12]; ! 674: int start = 1; ! 675: extern char *malloc(); ! 676: int i; ! 677: int notfound = 1; ! 678: ! 679: # ifdef xPTR3 ! 680: tTfp(42,0,"Make_list: group = %s\n", group); ! 681: # endif ! 682: if (!strcmp (group,"system")) ! 683: { ! 684: predef_delims(); ! 685: return(0); ! 686: } ! 687: if (find(desc,LRANGEKEY, &lotid, &hitid, group) < 0) ! 688: return(-1); ! 689: find(desc,HRANGEKEY, &lotid, &hitid, group); ! 690: while (!get(desc, &lotid, &hitid, &tuple, 1)) ! 691: { ! 692: if (strcmp(tuple.group, group)) ! 693: { ! 694: continue; ! 695: } ! 696: notfound = FALSE; ! 697: /* check if it is a new delimitor */ ! 698: if (strcmp(tuple.delim, delim)) ! 699: start = 1; ! 700: ! 701: /* start a new delimitor node */ ! 702: if (start) ! 703: { ! 704: d = (DELIMLIST *) malloc( sizeof(DELIMLIST)); ! 705: strcpy(delim, tuple.delim); ! 706: strcpy(d->group,tuple.group); ! 707: strcpy(d->delim,delim); ! 708: d->back = Delimhead; ! 709: Delimhead = d; ! 710: ! 711: map = (DMAP *) malloc(sizeof(DMAP)); ! 712: map->order = tuple.order; ! 713: map->type = tuple.type; ! 714: for ( i = 0; i < BITMAPLEN; i++) ! 715: map->bits[i] = tuple.bitmap[i]; ! 716: map->next = NULL; ! 717: d->maptr = map; ! 718: m = map; ! 719: start = 0; ! 720: ! 721: } ! 722: else /* add another bitmap to the delimitor node */ ! 723: { ! 724: map = (DMAP *) malloc(sizeof(DMAP)); ! 725: map->order = tuple.order; ! 726: map->type = tuple.type; ! 727: for ( i = 0; i < BITMAPLEN; i++) ! 728: map->bits[i] = tuple.bitmap[i]; ! 729: map->next = NULL; ! 730: m->next = map; ! 731: m = m->next; ! 732: ! 733: } ! 734: ! 735: } ! 736: /*prlist(Delimhead); */ ! 737: if (notfound) ! 738: return(-1); ! 739: return(0); ! 740: } ! 741: ! 742: /* ! 743: ** PREDEF_DELIMS - add the predefined delims to the queue ! 744: ** ! 745: ** Called by: ! 746: ** make_list ! 747: ** ! 748: ** Side Effects: ! 749: ** the delim queue pointed to by Delimhead ! 750: ** is initialized with the delims 'w' and 'c'. ! 751: ** ! 752: */ ! 753: predef_delims() ! 754: { ! 755: DELIMLIST *d; ! 756: DMAP *m, *m2; ! 757: int i; ! 758: ! 759: d = (DELIMLIST * ) malloc(sizeof(DELIMLIST)); ! 760: strcpy(d->group, "system"); ! 761: strcpy(d->delim, "c"); ! 762: d->back = NULL; ! 763: ! 764: m = (DMAP *) malloc(sizeof (DMAP)); ! 765: m->order = 1; ! 766: m->type = 0; ! 767: for (i = ' '; i <= '~'; i++) ! 768: set(m->bits, i); ! 769: m->next = NULL; ! 770: d->maptr = m; ! 771: Delimhead = d; ! 772: ! 773: ! 774: d = (DELIMLIST * ) malloc(sizeof(DELIMLIST)); ! 775: strcpy(d->group, "system"); ! 776: strcpy(d->delim, "w"); ! 777: d->back = NULL; ! 778: m = (DMAP *) malloc(sizeof (DMAP)); ! 779: m->order = 1; ! 780: m->type = 0; ! 781: for (i = 'A'; i <= 'Z'; i++) ! 782: set(m->bits, i); ! 783: for (i = 'a'; i <= 'z'; i++) ! 784: set(m->bits, i); ! 785: d->maptr = m; ! 786: ! 787: m2 = (DMAP *) malloc(sizeof(DMAP)); ! 788: m2->order = 2; ! 789: m2->type = 1; ! 790: for (i = 'A'; i <= 'Z'; i++) ! 791: set(m2->bits, i); ! 792: for (i = 'a'; i <= 'z'; i++) ! 793: set(m2->bits, i); ! 794: m->next = m2; ! 795: m2->next = NULL; ! 796: ! 797: d->back = Delimhead; ! 798: Delimhead = d; ! 799: } ! 800: ! 801: ! 802: ! 803: ! 804: ! 805: /* ! 806: ** PRLIST -- print contents of delimiter queue ! 807: */ ! 808: prlist(d) ! 809: struct delimlist *d; ! 810: { ! 811: struct delimlist *q; ! 812: DMAP *m; ! 813: int i; ! 814: ! 815: printf("DELIM QUEUE:\n"); ! 816: q = d; ! 817: while (q != NULL) ! 818: { ! 819: printf("-------------------------------------------------------\n"); ! 820: printf("NODE: group= %s, delim = %s \n", q->group, q->delim); ! 821: m = q->maptr; ! 822: while (m != NULL) ! 823: { ! 824: printf("maps:\n"); ! 825: printf("order = %d, type = %d \n", m->order, m->type); ! 826: for (i = 0; i < ACHARS; i++) ! 827: printf("%d ", test(m->bits,i)); ! 828: printf("\n"); ! 829: m = m->next; ! 830: } ! 831: q = q->back; ! 832: printf("-------------------------------------------------------\n"); ! 833: } ! 834: ! 835: return(0); ! 836: ! 837: } ! 838: ! 839: /* ! 840: ** SHRINK_LIST -- remove the delims in specified group from list ! 841: ** ! 842: ** Parameters: ! 843: ** group - name of the group to remove ! 844: ** ! 845: */ ! 846: shrink_list(group) ! 847: char *group; ! 848: { ! 849: struct delimlist *p, *q; ! 850: extern struct delimlist *Delimhead; ! 851: ! 852: /* may not delete sytem delims */ ! 853: if (!strcmp(group, "system")) ! 854: return(-1); ! 855: ! 856: p = Delimhead; ! 857: ! 858: while ((p != NULL) && (strcmp(p->group, group))) ! 859: { ! 860: q = p; ! 861: p = p->back; ! 862: } ! 863: if (p == NULL) ! 864: { ! 865: return(-1); /* error group not found */ ! 866: } ! 867: ! 868: while(!strcmp(p->group, group)) ! 869: { ! 870: if (p == Delimhead) ! 871: Delimhead = p->back; ! 872: else ! 873: q->back = p->back; ! 874: ! 875: if (p->back == NULL) ! 876: { ! 877: return(0); ! 878: } ! 879: ! 880: p = p-> back; ! 881: } ! 882: ! 883: /* prlist(Delimhead); */ ! 884: return(0); ! 885: } ! 886: ! 887: /* ! 888: ** DESTROY_DELIM -- remove the group of delims from the relation 'rdelim' ! 889: ** ! 890: ** Parameters: ! 891: ** group - the group of delims to remove ! 892: ** ! 893: ** Called By: ! 894: ** grammar.y ! 895: ** ! 896: ** Returns: ! 897: ** 0 if delims were successfully removed ! 898: ** -1 if delims were not found in relation ! 899: */ ! 900: destroy_delim(desc, group) ! 901: DESC *desc; ! 902: char *group; ! 903: { ! 904: DELIM_TUP tuple; ! 905: TID lotid,hitid; ! 906: int notfound = 1; ! 907: ! 908: if (find(desc,LRANGEKEY, &lotid, &hitid, group) < 0) ! 909: return(-1); ! 910: find(desc,HRANGEKEY, &lotid, &hitid, group); ! 911: ! 912: while (!get(desc, &lotid, &hitid, &tuple, 1)) ! 913: { ! 914: if (!strcmp(tuple.group, group)) ! 915: { ! 916: notfound = 0; ! 917: delete(desc,&lotid); ! 918: } ! 919: } ! 920: if (notfound) ! 921: return(-1); ! 922: return(0); ! 923: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.