49 int i, num = AC.cbufList.num;
51 for ( i = 0; i < num; i++, C++ ) {
52 if ( C->
Buffer == 0 )
break;
54 if ( i >= num ) C = (
CBUF *)FromList(&AC.cbufList);
61 C->
lhs = (WORD **)Malloc1(C->maxlhs*
sizeof(WORD *),
"compiler buffer-2");
65 C->
rhs = (WORD **)Malloc1(C->maxrhs*(
sizeof(WORD *)+2*
sizeof(LONG)+2*
sizeof(WORD)),
"compiler buffer-3");
74 RedoTree(C,C->maxrhs);
93 if ( C->
rhs ) M_free(C->
rhs,
"compiler buffer-3");
94 if ( C->
lhs ) M_free(C->
lhs,
"compiler buffer-2");
102 C->numlhs = C->numrhs = C->maxlhs = C->maxrhs = C->mnumlhs =
103 C->mnumrhs = C->numtree = C->rootnum = C->MaxTreeSize = 0;
121 C->numrhs = C->numlhs = 0;
126 C->numtree = C->rootnum = C->MaxTreeSize = 0;
127 RedoTree(C,C->maxrhs);
145 CBUF *C = cbuf + num;
147 WORD *newbuffer = (WORD *)Malloc1(newsize*
sizeof(WORD),
"compiler buffer-4");
152 w1 = C->
Buffer; w2 = newbuffer;
155 while ( --j >= 0 ) *w2++ = *w1++;
158 *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++;
159 *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++;
161 offset = newbuffer - C->
Buffer;
162 for ( i = 0; i <= C->numlhs; i++ ) C->
lhs[i] += offset;
163 for ( i = 1; i <= C->numrhs; i++ ) C->
rhs[i] += offset;
166 C->
Top = newbuffer + newsize;
169 M_free(w1,
"DoubleCbuffer");
186 CBUF *C = cbuf + num;
188 if ( C->numlhs >= (C->maxlhs-2) ) {
189 WORD ***ppp = &(C->
lhs);
190 if ( DoubleList((
void ***)ppp,&(C->maxlhs),
sizeof(WORD *),
191 "statement lists") ) Terminate(-1);
194 C->
lhs[C->numlhs+1] = 0;
212 LONG fullsize, *lold, newsize;
218 if ( C->numrhs >= (C->maxrhs-2) ) {
219 if ( C->maxrhs == 0 ) newsize = 100;
220 else newsize = C->maxrhs * 2;
221 if ( newsize > MAXCOMBUFRHS ) newsize = MAXCOMBUFRHS;
222 if ( newsize == C->maxrhs ) {
223 if ( AC.tablefilling ) {
224 TABLES T = functions[AC.tablefilling].tabl;
230 WORD *nbufs = (WORD *)Malloc1(new1*
sizeof(WORD),
"Table compile buffers");
233 for ( ; i < new1; i++ ) nbufs[i] = 0;
234 M_free(T->
buffers,
"Table compile buffers");
239 AC.cbufnum = num = T->
bufnum;
243 MesPrint(
"@Compiler buffer overflow. Try to make modules smaller");
248 fullsize = newsize * (
sizeof(WORD *) + 2*
sizeof(LONG) + 2*
sizeof(WORD));
249 C->
rhs = (WORD **)Malloc1(fullsize,
"subexpression lists");
250 for ( i = 0; i < C->maxrhs; i++ ) C->
rhs[i] = old[i];
252 for ( i = 0; i < C->maxrhs; i++ ) C->
CanCommu[i] = lold[i];
254 for ( i = 0; i < C->maxrhs; i++ ) C->
NumTerms[i] = lold[i];
256 for ( i = 0; i < C->maxrhs; i++ ) C->
numdum[i] = wold[i];
258 for ( i = 0; i < C->maxrhs; i++ ) C->
dimension[i] = wold[i];
259 if ( old ) M_free(old,
"subexpression lists");
261 if ( type == 0 ) RedoTree(C,C->maxrhs);
287 CBUF *C = cbuf+AC.cbufnum;
289 MesPrint(
"LH: %a",n,array);
293 for ( i = 0; i < n; i++ ) *(C->
Pointer)++ = *array++;
313int AddNtoC(
int bufnum,
int n, WORD *array,
int par)
317 CBUF *C = cbuf+bufnum;
319 MesPrint(
"RH: %a",n,array);
323 for ( i = 0; i < n; i++ ) *w++ = *array++;
349static COMPTREE comptreezero = {0,0,0,0,0,0};
351int InsTree(
int bufnum,
int h)
353 CBUF *C = cbuf + bufnum;
358 if ( C->numtree + 1 >= C->MaxTreeSize ) {
359 if ( C->MaxTreeSize == 0 ) {
361 C->MaxTreeSize = 125;
373 for ( ip = 1; ip < C->MaxTreeSize; ip++ ) { C->
boomlijst[ip] = comptreezero; }
376 is = C->MaxTreeSize * 2;
378 for ( ip = 0; ip < C->MaxTreeSize; ip++ ) { s[ip] = C->
boomlijst[ip]; }
379 for ( ip = C->MaxTreeSize; ip <= is; ip++ ) { s[ip] = comptreezero; }
385 q = boomlijst + C->rootnum;
388 if ( q->right == -1 ) {
390 s = boomlijst+C->numtree;
391 q->right = C->numtree;
392 s->parent = C->rootnum;
393 s->left = s->right = -1;
402 v1 = C->
rhs[p->value]; v2 = v3 = C->
rhs[h];
403 while ( *v3 ) v3 += *v3;
404 while ( *v1 == *v2 && v2 < v3 ) { v1++; v2++; }
407 if ( iq >= 0 ) { ip = iq; }
413 s->
parent = ip; s->left = s->right = -1;
414 s->blnce = 0; s->value = h; s->usage = 1;
416 if ( p->blnce == 0 )
return(h);
420 else if ( *v1 < *v2 ) {
422 if ( iq >= 0 ) { ip = iq; }
428 s->parent = ip; s->left = s->right = -1;
429 s->blnce = 0; s->value = h; s->usage = 1;
431 if ( p->blnce == 0 )
return(h);
441 MesPrint(
"!>We vallen uit de boom!");
449 if ( iq == C->rootnum )
break;
451 if ( ip == q->left ) q->
blnce--;
453 if ( q->blnce == 0 )
break;
454 if ( q->blnce == -2 ) {
455 if ( p->blnce == -1 ) {
458 p->parent = q->parent;
460 if ( boomlijst[p->parent].left == iq ) boomlijst[p->parent].
left = ip;
461 else boomlijst[p->parent].
right = ip;
462 if ( q->left >= 0 ) boomlijst[q->left].
parent = iq;
463 q->blnce = p->blnce = 0;
471 if ( p->right >= 0 ) boomlijst[p->right].
parent = ip;
472 if ( q->left >= 0 ) boomlijst[q->left].
parent = iq;
473 s->parent = q->parent;
476 if ( boomlijst[s->parent].left == iq )
477 boomlijst[s->parent].
left = is;
478 else boomlijst[s->parent].
right = is;
479 if ( s->blnce > 0 ) { q->blnce = s->blnce = 0; p->blnce = -1; }
480 else if ( s->blnce < 0 ) { p->blnce = s->blnce = 0; q->blnce = 1; }
481 else { p->blnce = s->blnce = q->blnce = 0; }
485 else if ( q->blnce == 2 ) {
486 if ( p->blnce == 1 ) {
489 p->parent = q->parent;
491 if ( boomlijst[p->parent].left == iq ) boomlijst[p->parent].
left = ip;
492 else boomlijst[p->parent].
right = ip;
493 if ( q->right >= 0 ) boomlijst[q->right].
parent = iq;
494 q->blnce = p->blnce = 0;
502 if ( p->left >= 0 ) boomlijst[p->left].
parent = ip;
503 if ( q->right >= 0 ) boomlijst[q->right].
parent = iq;
504 s->parent = q->parent;
507 if ( boomlijst[s->parent].left == iq ) boomlijst[s->parent].
left = is;
508 else boomlijst[s->parent].
right = is;
509 if ( s->blnce < 0 ) { q->blnce = s->blnce = 0; p->blnce = 1; }
510 else if ( s->blnce > 0 ) { p->blnce = s->blnce = 0; q->blnce = -1; }
511 else { p->blnce = s->blnce = q->blnce = 0; }
531int FindTree(
int bufnum, WORD *subexpr)
533 CBUF *C = cbuf + bufnum;
541 v1 = C->
rhs[p->value]; v2 = v3 = subexpr;
542 while ( *v3 ) v3 += *v3;
543 while ( *v1 == *v2 && v2 < v3 ) { v1++; v2++; }
546 if ( iq >= 0 ) { ip = iq; }
549 else if ( *v1 < *v2 ) {
551 if ( iq >= 0 ) { ip = iq; }
567void RedoTree(
CBUF *C,
int size)
571 newboomlijst = (
COMPTREE *)Malloc1((size+1)*
sizeof(
COMPTREE),
"newboomlijst");
573 if ( C->MaxTreeSize > size ) C->MaxTreeSize = size;
574 for ( i = 0; i < C->MaxTreeSize; i++ ) newboomlijst[i] = C->
boomlijst[i];
578 C->MaxTreeSize = size;
614 CBUF *C = cbuf + bufnum;
618 C->maxrhs = AM.fbuffersize;
619 C->MaxTreeSize = AM.fbuffersize;
626 if ( C->
rhs ) M_free(C->
rhs,
"IniFbuffer-rhs");
638 for ( i = 1; i < C->MaxTreeSize; i++ ) { C->
boomlijst[i] = comptreezero; }
640 fullsize = (C->maxrhs+1) * (
sizeof(WORD *) + 2*
sizeof(LONG) + 2*
sizeof(WORD));
641 C->
rhs = (WORD **)Malloc1(fullsize,
"IniFbuffer-rhs");
657LONG numcommute(WORD *terms, LONG *numterms)
667 if ( *t >= FUNCTION ) {
668 if ( functions[*t-FUNCTION].commute ) { num++;
break; }
672 terms = terms + *terms;