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];
78 switch ( e->status ) {
79 case UNHIDELEXPRESSION:
80 case UNHIDEGEXPRESSION:
81 case DROPHLEXPRESSION:
82 case DROPHGEXPRESSION:
83 case HIDDENLEXPRESSION:
84 case HIDDENGEXPRESSION:
91 if ( AT.bracketinfo ) bracketinfo = AT.bracketinfo;
92 else bracketinfo = e->bracketinfo;
93 hi = bracketinfo->indexfill; low = 0;
94 if ( hi <= 0 )
return(0);
98 if ( *bracket == 4 ) {
102 else if ( bracketinfo->
bracketbuffer[bi->bracket] == 4 ) i = 1;
103 else i = CompareTerms(BHEAD bracket,bracketinfo->
bracketbuffer+bi->bracket,0);
105 AR.SortType = oldsorttype;
109 else if ( i == 0 ) med = hi-1;
113 if ( *bracket == 4 ) {
117 else if ( bracketinfo->
bracketbuffer[bi->bracket] == 4 ) i = 1;
118 else i = CompareTerms(BHEAD bracket,bracketinfo->
bracketbuffer+bi->bracket,0);
119 if ( i == 0 ) {
break; }
122 AR.SortType = oldsorttype;
129 if ( low == med )
break;
137 AN.theposition = AS.OldOnFile[nexp];
138 ADD2POS(AN.theposition,bi->start);
149 term = AT.WorkPointer;
160 t2 = AR.CompressPointer;
163 AR.SortType = oldsorttype;
165 return(&AN.theposition);
173 p = (WORD *)((UBYTE *)(fi->PObuffer)
174 + BASEPOSITION(AS.OldOnFile[nexp])
175 + BASEPOSITION(bi->start));
176 pstop = (WORD *)((UBYTE *)(fi->PObuffer)
177 + BASEPOSITION(AS.OldOnFile[nexp])
178 + BASEPOSITION(bi->next));
179 while ( p < pstop ) {
185 if ( *p <= -bsize ) {
190 t2 = AR.CompressPointer;
194 t2++; while ( *t2 != HAAKJE ) t2 += t2[1];
195 a[1] = t2[0]; a[2] = t2[1]; a[3] = t2[2];
196 *t2++ = 1; *t2++ = 1; *t2++ = 3;
197 *AR.CompressPointer = t2 - AR.CompressPointer;
198 if ( *bracket == 4 ) {
199 if ( AR.CompressPointer[0] == 4 ) i = 0;
202 else if ( AR.CompressPointer[0] == 4 ) i = 1;
203 else i = CompareTerms(BHEAD bracket,AR.CompressPointer,0);
204 t2[-3] = a[1]; t2[-2] = a[2]; t2[-1] = a[3];
206 SETBASEPOSITION(AN.theposition,(pp-fi->PObuffer)*
sizeof(WORD));
213 WORD *oldworkpointer = AT.WorkPointer, *t3, *t4;
214 t2 = p + 1;
while ( *t2 != HAAKJE ) t2 += t2[1];
219 t3 = oldworkpointer; t4 = p;
220 while ( t4 < t2 ) *t3++ = *t4++;
221 *t3++ = 1; *t3++ = 1; *t3++ = 3;
222 *oldworkpointer = t3 - oldworkpointer;
225 if ( *bracket == 4 ) {
226 if ( t3[0] == 4 ) i = 0;
229 else if ( t3[0] == 4 ) i = 1;
231 i = CompareTerms(BHEAD bracket,t3,0);
233 AT.WorkPointer = oldworkpointer;
235 SETBASEPOSITION(AN.theposition,(p-fi->PObuffer)*
sizeof(WORD));
243 AR.SortType = oldsorttype;
248 toppos = AS.OldOnFile[nexp];
249 ADD2POS(toppos,bi->next);
250 cp = AR.CompressPointer;
252 auxpos = AN.theposition;
253 GetOneTerm(BHEAD term,fi,&auxpos,0);
255 AR.SortType = oldsorttype;
259 tstop = term + *term;
260 tstop -= ABS(tstop[-1]);
262 while ( *t1 != HAAKJE && t1 < tstop ) t1 += t1[1];
264 if ( t1-term == *bracket-3 ) {
265 t1 = term + 1; t2 = bracket+1;
266 while ( i > 0 && *t1 == *t2 ) { t1++; t2++; i--; }
268 AR.CompressPointer = cp;
272 AR.CompressPointer = cp;
273 AN.theposition = auxpos;
277 if ( ISGEPOS(AN.theposition,toppos) ) {
278 AR.SortType = oldsorttype;
279 AR.CompressPointer = cp;
286 AR.SortType = oldsorttype;
288 return(&AN.theposition);
312 WORD *t, *tstop, *t1, *t2, *oldt, oldsize, oldh, oldhs;
313 if ( ( b = e->newbracketinfo ) == 0 )
return;
314 DIFPOS(thepos,*newpos,e->onfile);
315 tstop = term + *term;
316 tstop -= ABS(tstop[-1]);
318 while ( *t != HAAKJE && t < tstop ) t += t[1];
319 if ( *t != HAAKJE )
return;
320 oldt = t; oldsize = *term; *t++ = 1; oldhs = *t; *t++ = 1;
321 oldh = *t; *t++ = 3; *term = t - term;
336 else i = CompareTerms(BHEAD term,b->
bracketbuffer+bi->bracket,0);
338 bi->termsinbracket++;
352 for ( i = 1; i < *term - 3; i++ ) {
355 if ( i < *term - 3 ) {
359 *term = oldsize; oldt[0] = HAAKJE; oldt[1] = oldhs; oldt[2] = oldh;
360 MLOCK(ErrorMessageLock);
361 MesPrint(
"Error!!!! Illegal bracket sequence detected in PutBracketInIndex");
363 MesPrint(
"Worker = %w");
365 PrintTerm(term,
"term into index");
367 MUNLOCK(ErrorMessageLock);
377 if ( b->bracketfill+*term >= b->bracketbuffersize
378 && ( b->bracketbuffersize < AM.MaxBracketBufferSize
379 || ( e->vflags & ISFACTORIZED ) != 0 ) ) {
384 i = b->bracketbuffersize * 2;
385 if ( i > AM.MaxBracketBufferSize && ( e->vflags & ISFACTORIZED ) == 0 )
386 i = AM.MaxBracketBufferSize;
387 if ( i > b->bracketfill+*term ) {
388 b->bracketbuffersize = i;
389 b->
bracketbuffer = (WORD *)Malloc1(b->bracketbuffersize*
sizeof(WORD),
390 "new bracket buffer");
394 if ( oldbracketbuffer ) M_free(oldbracketbuffer,"old bracket buffer");
397 if ( b->bracketfill+*term < b->bracketbuffersize ) {
398 if ( b->indexfill >= b->indexbuffersize ) {
403 b->indexbuffersize *= 2;
405 Malloc1(b->indexbuffersize*
sizeof(
BRACKETINDEX),
"new bracket index");
409 if ( oldindexbuffer ) M_free(oldindexbuffer,"old bracket index");
423 average = DIVPOS(thepos,b->indexfill+1);
424 if ( ( average <= 0 ) || ( (average*4) <= 0 ) ) {
425 MLOCK(ErrorMessageLock);
426 MesPrint(
"Problems with bracket buffer. Increase MaxBracketBufferSize in form.set");
427 MesPrint(
"Current size is %l",AM.MaxBracketBufferSize*
sizeof(WORD));
428 MUNLOCK(ErrorMessageLock);
436 while ( b2+2 < bi ) {
437 if ( DIFBASE(b2->next,b1->start) > average ) {
440 i = *t1; NCOPY(t2,t1,i)
444 i = *t1; NCOPY(t2,t1,i)
450 b1->termsinbracket = 0;
456 b2->termsinbracket = 0;
462 i = *t1; NCOPY(t2,t1,i)
464 b1->termsinbracket += b2->termsinbracket;
470 b1->termsinbracket = 0;
475 b2->termsinbracket = 0;
482 i = *t1; NCOPY(t2,t1,i)
488 b1->termsinbracket = 0;
497 bi->bracket = b->bracketfill;
500 bi->termsinbracket = 1;
508 *term = oldsize; oldt[0] = HAAKJE; oldt[1] = oldhs; oldt[2] = oldh;
517 void ClearBracketIndex(WORD numexp)
521 b = Expressions[numexp].bracketinfo;
522 Expressions[numexp].bracketinfo = 0;
524 else if ( numexp == -1 ) {
531 b = Expressions[numexp].newbracketinfo;
532 Expressions[numexp].newbracketinfo = 0;
534 if ( b == 0 )
return;
535 b->indexfill = b->indexbuffersize = 0;
536 b->bracketfill = b->bracketbuffersize = 0;
539 M_free(b,
"BracketInfo");
549 VOID OpenBracketIndex(WORD nexpr)
555 e->newbracketinfo = bi;
561 bi->
bracketbuffer = (WORD *)Malloc1(i*
sizeof(WORD),
"Bracket Buffer");
562 bi->bracketbuffersize = i;
566 bi->indexbuffersize = i;
580 int PutInside(
PHEAD WORD *term, WORD *code)
582 WORD *from, *to, *oldbuf, *tStop, *t, *tt, oldon, oldact, inc, argsize, *termout;
585 if ( code[1] == 4 && ( code[2] == 0 || code[2] == 1 ) ) {
589 from = term+*term; to = from+1+ARGHEAD+FUNHEAD; i = ii = *term;
590 to[0] = 1; to[1] = 1; to[2] = 3;
591 while ( --i >= 0 ) *--to = *--from;
593 *to++ = term[0]+4+ARGHEAD+FUNHEAD;
595 *to++ = ii+FUNHEAD+ARGHEAD;
609 termout = AT.WorkPointer;
610 oldbuf = AT.BrackBuf;
611 oldon = AR.BracketOn;
613 AR.BracketOn = -code[2];
614 AT.BrackBuf = code+4;
616 error = PutBracket(BHEAD term);
618 AT.BrackBuf = oldbuf;
619 AR.BracketOn = oldon;
620 if ( error ) return(error);
621 i = *termout; from = termout; to = term;
623 tStop = term +*term; tStop -= tStop[-1];
625 while ( t < tStop && *t != HAAKJE ) t += t[1];
627 inc = FUNHEAD+ARGHEAD-t[1]+1;
634 while ( from > tt ) *--to = *--from;
637 *t++ = argsize+FUNHEAD+ARGHEAD;
640 *t++ = argsize+ARGHEAD;
644 AT.WorkPointer = term+*term;
645 if ( Normalize(BHEAD term) ) error = 1;
BRACKETINDEX * indexbuffer