65POSITION *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;
108 if ( *bracketh == 7 ) {
112 else if ( bracketinfo->
bracketbuffer[bi->bracket] == 7 ) i = 1;
113 else i = CompareTerms(BHEAD 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(BHEAD 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(BHEAD 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(BHEAD 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);
331void 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;
365 else i = CompareTerms(BHEAD term,b->
bracketbuffer+bi->bracket,0);
367 bi->termsinbracket++;
381 for ( i = 1; i < *term - 3; i++ ) {
384 if ( i < *term - 3 ) {
389 *term = oldsize; oldt[0] = a[0]; oldt[1] = a[1]; oldt[2] = a[2];
390 MLOCK(ErrorMessageLock);
391 MesPrint(
"!>Error! Illegal bracket sequence detected in PutBracketInIndex");
393 MesPrint(
"Worker = %w");
395 PrintTerm(term,
"term into index");
397 MUNLOCK(ErrorMessageLock);
408 if ( b->bracketfill+*term >= b->bracketbuffersize
409 && ( b->bracketbuffersize < AM.MaxBracketBufferSize
410 || ( e->vflags & ISFACTORIZED ) != 0 ) ) {
415 i = MaX(b->bracketbuffersize * 2, b->bracketfill+*term+1);
416 if ( i > AM.MaxBracketBufferSize && ( e->vflags & ISFACTORIZED ) == 0 )
417 i = AM.MaxBracketBufferSize;
418 if ( i > b->bracketfill+*term ) {
419 b->bracketbuffersize = i;
420 b->
bracketbuffer = (WORD *)Malloc1(b->bracketbuffersize*
sizeof(WORD),
421 "new bracket buffer");
425 if ( oldbracketbuffer ) M_free(oldbracketbuffer,
"old bracket buffer");
428 if ( b->bracketfill+*term < b->bracketbuffersize ) {
429 if ( b->indexfill >= b->indexbuffersize ) {
434 b->indexbuffersize *= 2;
436 Malloc1(b->indexbuffersize*
sizeof(
BRACKETINDEX),
"new bracket index");
440 if ( oldindexbuffer ) M_free(oldindexbuffer,
"old bracket index");
454 average = DIVPOS(thepos,b->indexfill+1);
455 if ( average <= 0 ) {
456 MLOCK(ErrorMessageLock);
457 MesPrint(
"Problems with bracket buffer. Increase MaxBracketBufferSize in form.set");
458 MesPrint(
"Current size is %l",AM.MaxBracketBufferSize*
sizeof(WORD));
459 MUNLOCK(ErrorMessageLock);
467 while ( b2+2 < bi ) {
468 if ( DIFBASE(b2->next,b1->start) > average ) {
471 i = *t1; NCOPY(t2,t1,i)
475 i = *t1; NCOPY(t2,t1,i)
481 b1->termsinbracket = 0;
487 b2->termsinbracket = 0;
493 i = *t1; NCOPY(t2,t1,i)
495 b1->termsinbracket += b2->termsinbracket;
501 b1->termsinbracket = 0;
506 b2->termsinbracket = 0;
513 i = *t1; NCOPY(t2,t1,i)
519 b1->termsinbracket = 0;
528 bi->bracket = b->bracketfill;
531 bi->termsinbracket = 1;
539 *term = oldsize; oldt[0] = a[0]; oldt[1] = a[1]; oldt[2] = a[2];
548void ClearBracketIndex(WORD numexp)
552 b = Expressions[numexp].bracketinfo;
553 Expressions[numexp].bracketinfo = 0;
555 else if ( numexp == -1 ) {
562 b = Expressions[numexp].newbracketinfo;
563 Expressions[numexp].newbracketinfo = 0;
565 if ( b == 0 )
return;
566 b->indexfill = b->indexbuffersize = 0;
567 b->bracketfill = b->bracketbuffersize = 0;
570 M_free(b,
"BracketInfo");
580void OpenBracketIndex(WORD nexpr)
586 e->newbracketinfo = bi;
592 bi->
bracketbuffer = (WORD *)Malloc1(i*
sizeof(WORD),
"Bracket Buffer");
593 bi->bracketbuffersize = i;
597 bi->indexbuffersize = i;
611int PutInside(PHEAD WORD *term, WORD *code)
613 WORD *from, *to, *oldbuf, *tStop, *t, *tt, oldon, oldact, inc, argsize, *termout;
616 if ( code[1] == 4 && ( code[2] == 0 || code[2] == 1 ) ) {
620 from = term+*term; to = from+1+ARGHEAD+FUNHEAD; i = ii = *term;
621 to[0] = 1; to[1] = 1; to[2] = 3;
622 while ( --i >= 0 ) *--to = *--from;
624 *to++ = term[0]+4+ARGHEAD+FUNHEAD;
626 *to++ = ii+FUNHEAD+ARGHEAD;
640 termout = AT.WorkPointer;
641 oldbuf = AT.BrackBuf;
642 oldon = AR.BracketOn;
644 AR.BracketOn = -code[2];
645 AT.BrackBuf = code+4;
647 error = PutBracket(BHEAD term);
649 AT.BrackBuf = oldbuf;
650 AR.BracketOn = oldon;
651 if ( error )
return(error);
652 i = *termout; from = termout; to = term;
654 tStop = term +*term; tStop -= tStop[-1];
656 while ( t < tStop && *t != HAAKJE ) t += t[1];
658 inc = FUNHEAD+ARGHEAD-t[1]+1;
665 while ( from > tt ) *--to = *--from;
668 *t++ = argsize+FUNHEAD+ARGHEAD;
671 *t++ = argsize+ARGHEAD;
675 AT.WorkPointer = term+*term;
676 if ( Normalize(BHEAD term) ) error = 1;
BRACKETINDEX * indexbuffer