65 POSITION *FindBracket(WORD nexp, WORD *bracket)
73 WORD oldsorttype = AR.SortType, *t1, *t2, j, bsize, *term, *p, *pstop, *pp;
74 WORD *tstop, *cp, a[4], *bracketh;
77 switch ( e->status ) {
78 case UNHIDELEXPRESSION:
79 case UNHIDEGEXPRESSION:
80 case DROPHLEXPRESSION:
81 case DROPHGEXPRESSION:
82 case HIDDENLEXPRESSION:
83 case HIDDENGEXPRESSION:
90 if ( AT.bracketinfo ) bracketinfo = AT.bracketinfo;
91 else bracketinfo = e->bracketinfo;
92 hi = bracketinfo->indexfill; low = 0;
93 if ( hi <= 0 )
return(0);
100 bracketh = TermMalloc(
"FindBracket");
101 i = *bracket; p = bracket; pp = bracketh; NCOPY(pp,p,i)
102 pp -= 3; *pp++ = HAAKJE; *pp++ = 3; *pp++ = 0; *pp++ = 1; *pp++ = 1; *pp++ = 3;
106 AR.SortType = bracketinfo->SortType;
107 bi = bracketinfo->indexbuffer + hi - 1;
108 if ( *bracketh == 7 ) {
112 else if ( bracketinfo->
bracketbuffer[bi->bracket] == 7 ) i = 1;
113 else i = CompareTerms(bracketh,bracketinfo->
bracketbuffer+bi->bracket,0);
115 AR.SortType = oldsorttype;
117 TermFree(bracketh,
"FindBracket");
120 else if ( i == 0 ) med = hi-1;
125 if ( *bracketh == 7 ) {
129 else if ( bracketinfo->
bracketbuffer[bi->bracket] == 7 ) i = 1;
130 else i = CompareTerms(bracketh,bracketinfo->
bracketbuffer+bi->bracket,0);
131 if ( i == 0 ) {
break; }
134 AR.SortType = oldsorttype;
136 TermFree(bracketh,
"FindBracket");
142 if ( low == med )
break;
150 AN.theposition = AS.OldOnFile[nexp];
151 ADD2POS(AN.theposition,bi->start);
162 term = AT.WorkPointer;
175 t2 = AR.CompressPointer;
178 AR.SortType = oldsorttype;
180 TermFree(bracketh,
"FindBracket");
181 return(&AN.theposition);
189 p = (WORD *)((UBYTE *)(fi->PObuffer)
190 + BASEPOSITION(AS.OldOnFile[nexp])
191 + BASEPOSITION(bi->start));
192 pstop = (WORD *)((UBYTE *)(fi->PObuffer)
193 + BASEPOSITION(AS.OldOnFile[nexp])
194 + BASEPOSITION(bi->next));
195 while ( p < pstop ) {
201 if ( *p <= -bsize ) {
206 t2 = AR.CompressPointer;
210 t2++; while ( *t2 != HAAKJE ) t2 += t2[1];
212 a[1] = t2[0]; a[2] = t2[1]; a[3] = t2[2];
213 *t2++ = 1; *t2++ = 1; *t2++ = 3;
214 *AR.CompressPointer = t2 - AR.CompressPointer;
215 bsize = *AR.CompressPointer - 1;
216 if ( *bracketh == 7 ) {
217 if ( AR.CompressPointer[0] == 7 ) i = 0;
220 else if ( AR.CompressPointer[0] == 7 ) i = 1;
221 else i = CompareTerms(bracketh,AR.CompressPointer,0);
222 t2[-3] = a[1]; t2[-2] = a[2]; t2[-1] = a[3];
224 SETBASEPOSITION(AN.theposition,(pp-fi->PObuffer)*
sizeof(WORD));
231 WORD *oldworkpointer = AT.WorkPointer, *t3, *t4;
232 t2 = p + 1;
while ( *t2 != HAAKJE ) t2 += t2[1];
238 t3 = oldworkpointer; t4 = p;
239 while ( t4 < t2 ) *t3++ = *t4++;
240 *t3++ = 1; *t3++ = 1; *t3++ = 3;
241 *oldworkpointer = t3 - oldworkpointer;
242 bsize = *oldworkpointer - 1;
245 if ( *bracketh == 7 ) {
246 if ( t3[0] == 7 ) i = 0;
249 else if ( t3[0] == 7 ) i = 1;
251 i = CompareTerms(bracketh,t3,0);
253 AT.WorkPointer = oldworkpointer;
255 SETBASEPOSITION(AN.theposition,(p-fi->PObuffer)*
sizeof(WORD));
263 AR.SortType = oldsorttype;
265 TermFree(bracketh,
"FindBracket");
273 toppos = AS.OldOnFile[nexp];
274 ADD2POS(toppos,bi->next);
275 cp = AR.CompressPointer;
277 auxpos = AN.theposition;
278 GetOneTerm(BHEAD term,fi,&auxpos,0);
280 AR.SortType = oldsorttype;
284 tstop = term + *term;
285 tstop -= ABS(tstop[-1]);
287 while ( *t1 != HAAKJE && t1 < tstop ) t1 += t1[1];
289 if ( t1-term == *bracket-3 ) {
290 t1 = term + 1; t2 = bracket+1;
291 while ( i > 0 && *t1 == *t2 ) { t1++; t2++; i--; }
293 AR.CompressPointer = cp;
297 AR.CompressPointer = cp;
298 AN.theposition = auxpos;
302 if ( ISGEPOS(AN.theposition,toppos) ) {
303 AR.SortType = oldsorttype;
304 AR.CompressPointer = cp;
306 TermFree(bracketh,
"FindBracket");
312 AR.SortType = oldsorttype;
314 TermFree(bracketh,
"FindBracket");
315 return(&AN.theposition);
331 VOID PutBracketInIndex(PHEAD WORD *term,
POSITION *newpos)
339 WORD *t, *tstop, *t1, *t2, *oldt, oldsize, a[4];
340 if ( ( b = e->newbracketinfo ) == 0 )
return;
341 DIFPOS(thepos,*newpos,e->onfile);
342 tstop = term + *term;
343 tstop -= ABS(tstop[-1]);
345 while ( *t != HAAKJE && t < tstop ) t += t[1];
346 if ( t >= tstop )
return;
348 a[0] = t[0]; a[1] = t[1]; a[2] = t[2];
349 oldt = t; oldsize = *term; *t++ = 1; *t++ = 1; *t++ = 3;
367 bi->termsinbracket++;
381 for ( i = 1; i < *term - 3; i++ ) {
384 if ( i < *term - 3 ) {
388 *term = oldsize; oldt[0] = a[0]; oldt[1] = a[1]; oldt[2] = a[2];
389 MLOCK(ErrorMessageLock);
390 MesPrint(
"Error!!!! Illegal bracket sequence detected in PutBracketInIndex");
392 MesPrint(
"Worker = %w");
394 PrintTerm(term,
"term into index");
396 MUNLOCK(ErrorMessageLock);
406 if ( b->bracketfill+*term >= b->bracketbuffersize
407 && ( b->bracketbuffersize < AM.MaxBracketBufferSize
408 || ( e->vflags & ISFACTORIZED ) != 0 ) ) {
413 i = MaX(b->bracketbuffersize * 2, b->bracketfill+*term+1);
414 if ( i > AM.MaxBracketBufferSize && ( e->vflags & ISFACTORIZED ) == 0 )
415 i = AM.MaxBracketBufferSize;
416 if ( i > b->bracketfill+*term ) {
417 b->bracketbuffersize = i;
418 b->
bracketbuffer = (WORD *)Malloc1(b->bracketbuffersize*
sizeof(WORD),
419 "new bracket buffer");
423 if ( oldbracketbuffer ) M_free(oldbracketbuffer,"old bracket buffer");
426 if ( b->bracketfill+*term < b->bracketbuffersize ) {
427 if ( b->indexfill >= b->indexbuffersize ) {
432 b->indexbuffersize *= 2;
434 Malloc1(b->indexbuffersize*
sizeof(
BRACKETINDEX),
"new bracket index");
438 if ( oldindexbuffer ) M_free(oldindexbuffer,"old bracket index");
452 average = DIVPOS(thepos,b->indexfill+1);
453 if ( average <= 0 ) {
454 MLOCK(ErrorMessageLock);
455 MesPrint(
"Problems with bracket buffer. Increase MaxBracketBufferSize in form.set");
456 MesPrint(
"Current size is %l",AM.MaxBracketBufferSize*
sizeof(WORD));
457 MUNLOCK(ErrorMessageLock);
465 while ( b2+2 < bi ) {
466 if ( DIFBASE(b2->next,b1->start) > average ) {
469 i = *t1; NCOPY(t2,t1,i)
473 i = *t1; NCOPY(t2,t1,i)
479 b1->termsinbracket = 0;
485 b2->termsinbracket = 0;
491 i = *t1; NCOPY(t2,t1,i)
493 b1->termsinbracket += b2->termsinbracket;
499 b1->termsinbracket = 0;
504 b2->termsinbracket = 0;
511 i = *t1; NCOPY(t2,t1,i)
517 b1->termsinbracket = 0;
526 bi->bracket = b->bracketfill;
529 bi->termsinbracket = 1;
537 *term = oldsize; oldt[0] = a[0]; oldt[1] = a[1]; oldt[2] = a[2];
546 void ClearBracketIndex(WORD numexp)
550 b = Expressions[numexp].bracketinfo;
551 Expressions[numexp].bracketinfo = 0;
553 else if ( numexp == -1 ) {
560 b = Expressions[numexp].newbracketinfo;
561 Expressions[numexp].newbracketinfo = 0;
563 if ( b == 0 )
return;
564 b->indexfill = b->indexbuffersize = 0;
565 b->bracketfill = b->bracketbuffersize = 0;
568 M_free(b,
"BracketInfo");
578 VOID OpenBracketIndex(WORD nexpr)
584 e->newbracketinfo = bi;
590 bi->
bracketbuffer = (WORD *)Malloc1(i*
sizeof(WORD),
"Bracket Buffer");
591 bi->bracketbuffersize = i;
595 bi->indexbuffersize = i;
609 int PutInside(PHEAD WORD *term, WORD *code)
611 WORD *from, *to, *oldbuf, *tStop, *t, *tt, oldon, oldact, inc, argsize, *termout;
614 if ( code[1] == 4 && ( code[2] == 0 || code[2] == 1 ) ) {
618 from = term+*term; to = from+1+ARGHEAD+FUNHEAD; i = ii = *term;
619 to[0] = 1; to[1] = 1; to[2] = 3;
620 while ( --i >= 0 ) *--to = *--from;
622 *to++ = term[0]+4+ARGHEAD+FUNHEAD;
624 *to++ = ii+FUNHEAD+ARGHEAD;
638 termout = AT.WorkPointer;
639 oldbuf = AT.BrackBuf;
640 oldon = AR.BracketOn;
642 AR.BracketOn = -code[2];
643 AT.BrackBuf = code+4;
645 error = PutBracket(BHEAD term);
647 AT.BrackBuf = oldbuf;
648 AR.BracketOn = oldon;
649 if ( error ) return(error);
650 i = *termout; from = termout; to = term;
652 tStop = term +*term; tStop -= tStop[-1];
654 while ( t < tStop && *t != HAAKJE ) t += t[1];
656 inc = FUNHEAD+ARGHEAD-t[1]+1;
663 while ( from > tt ) *--to = *--from;
666 *t++ = argsize+FUNHEAD+ARGHEAD;
669 *t++ = argsize+ARGHEAD;
673 AT.WorkPointer = term+*term;
674 if ( Normalize(BHEAD term) ) error = 1;
BRACKETINDEX * indexbuffer