FORM v5.0.1-33-gdf7fc94
comtool.c
Go to the documentation of this file.
1
5/* #[ License : */
6/*
7 * Copyright (C) 1984-2026 J.A.M. Vermaseren
8 * When using this file you are requested to refer to the publication
9 * J.A.M.Vermaseren "New features of FORM" math-ph/0010025
10 * This is considered a matter of courtesy as the development was paid
11 * for by FOM the Dutch physics granting agency and we would like to
12 * be able to track its scientific use to convince FOM of its value
13 * for the community.
14 *
15 * This file is part of FORM.
16 *
17 * FORM is free software: you can redistribute it and/or modify it under the
18 * terms of the GNU General Public License as published by the Free Software
19 * Foundation, either version 3 of the License, or (at your option) any later
20 * version.
21 *
22 * FORM is distributed in the hope that it will be useful, but WITHOUT ANY
23 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
24 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
25 * details.
26 *
27 * You should have received a copy of the GNU General Public License along
28 * with FORM. If not, see <http://www.gnu.org/licenses/>.
29 */
30/* #] License : */
31/*
32 #[ Includes :
33*/
34
35#include "form3.h"
36
37/*
38 #] Includes :
39 #[ inicbufs :
40*/
41
47int inicbufs(void)
48{
49 int i, num = AC.cbufList.num;
50 CBUF *C = cbuf;
51 for ( i = 0; i < num; i++, C++ ) {
52 if ( C->Buffer == 0 ) break;
53 }
54 if ( i >= num ) C = (CBUF *)FromList(&AC.cbufList);
55 else num = i;
56 C->BufferSize = 2000;
57 C->Buffer = (WORD *)Malloc1(C->BufferSize*sizeof(WORD),"compiler buffer-1");
58 C->Pointer = C->Buffer;
59 C->Top = C->Buffer + C->BufferSize;
60 C->maxlhs = 10;
61 C->lhs = (WORD **)Malloc1(C->maxlhs*sizeof(WORD *),"compiler buffer-2");
62 C->numlhs = 0;
63 C->mnumlhs = 0;
64 C->maxrhs = 25;
65 C->rhs = (WORD **)Malloc1(C->maxrhs*(sizeof(WORD *)+2*sizeof(LONG)+2*sizeof(WORD)),"compiler buffer-3");
66 C->CanCommu = (LONG *)(C->rhs+C->maxrhs);
67 C->NumTerms = C->CanCommu+C->maxrhs;
68 C->numdum = (WORD *)(C->NumTerms+C->maxrhs);
69 C->dimension = C->numdum + C->maxrhs;
70 C->numrhs = 0;
71 C->mnumrhs = 0;
72 C->rhs[0] = C->rhs[1] = C->Pointer;
73 C->boomlijst = 0;
74 RedoTree(C,C->maxrhs);
75 ClearTree(num);
76 return(num);
77}
78
79/*
80 #] inicbufs :
81 #[ finishcbuf :
82*/
83
89void finishcbuf(WORD num)
90{
91 CBUF *C = cbuf+num;
92 if ( C->Buffer ) M_free(C->Buffer,"compiler buffer-1");
93 if ( C->rhs ) M_free(C->rhs,"compiler buffer-3");
94 if ( C->lhs ) M_free(C->lhs,"compiler buffer-2");
95 if ( C->boomlijst ) M_free(C->boomlijst,"boomlijst");
96 C->Top = C->Pointer = C->Buffer = 0;
97 C->rhs = C->lhs = 0;
98 C->CanCommu = 0;
99 C->NumTerms = 0;
100 C->BufferSize = 0;
101 C->boomlijst = 0;
102 C->numlhs = C->numrhs = C->maxlhs = C->maxrhs = C->mnumlhs =
103 C->mnumrhs = C->numtree = C->rootnum = C->MaxTreeSize = 0;
104}
105
106/*
107 #] finishcbuf :
108 #[ clearcbuf :
109*/
110
116void clearcbuf(WORD num)
117{
118 CBUF *C = cbuf+num;
119 if ( C->boomlijst ) M_free(C->boomlijst,"boomlijst");
120 C->Pointer = C->Buffer;
121 C->numrhs = C->numlhs = 0;
122 C->mnumlhs = 0;
123 C->boomlijst = 0;
124 C->mnumrhs = 0;
125 C->rhs[0] = C->rhs[1] = C->Pointer;
126 C->numtree = C->rootnum = C->MaxTreeSize = 0;
127 RedoTree(C,C->maxrhs);
128 ClearTree(num);
129}
130
131/*
132 #] clearcbuf :
133 #[ DoubleCbuffer :
134*/
135
143WORD *DoubleCbuffer(int num, WORD *w,int par)
144{
145 CBUF *C = cbuf + num;
146 LONG newsize = C->BufferSize*2;
147 WORD *newbuffer = (WORD *)Malloc1(newsize*sizeof(WORD),"compiler buffer-4");
148 WORD *w1, *w2;
149 LONG offset, j, i;
150 DUMMYUSE(par)
151
152 w1 = C->Buffer; w2 = newbuffer;
153 i = w - w1;
154 j = i & 7;
155 while ( --j >= 0 ) *w2++ = *w1++;
156 i >>= 3;
157 while ( --i >= 0 ) {
158 *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++;
159 *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++; *w2++ = *w1++;
160 }
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;
164 w1 = C->Buffer;
165 C->Pointer += offset;
166 C->Top = newbuffer + newsize;
167 C->BufferSize = newsize;
168 C->Buffer = newbuffer;
169 M_free(w1,"DoubleCbuffer");
170 return(w2);
171}
172
173/*
174 #] DoubleCbuffer :
175 #[ AddLHS :
176*/
177
184WORD *AddLHS(int num)
185{
186 CBUF *C = cbuf + num;
187 C->numlhs++;
188 if ( C->numlhs >= (C->maxlhs-2) ) {
189 WORD ***ppp = &(C->lhs); /* to avoid compiler warning */
190 if ( DoubleList((void ***)ppp,&(C->maxlhs),sizeof(WORD *),
191 "statement lists") ) Terminate(-1);
192 }
193 C->lhs[C->numlhs] = C->Pointer;
194 C->lhs[C->numlhs+1] = 0;
195 return(C->Pointer);
196}
197
198/*
199 #] AddLHS :
200 #[ AddRHS :
201*/
202
210WORD *AddRHS(int num, int type)
211{
212 LONG fullsize, *lold, newsize;
213 int i;
214 WORD **old, *wold;
215 CBUF *C;
216restart:;
217 C = cbuf + num;
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;
225/*
226 We add a compiler buffer, change a few settings and continue.
227*/
228 if ( T->buffersfill >= T->bufferssize ) {
229 int new1 = 2*T->bufferssize;
230 WORD *nbufs = (WORD *)Malloc1(new1*sizeof(WORD),"Table compile buffers");
231 for ( i = 0; i < T->buffersfill; i++ )
232 nbufs[i] = T->buffers[i];
233 for ( ; i < new1; i++ ) nbufs[i] = 0;
234 M_free(T->buffers,"Table compile buffers");
235 T->buffers = nbufs;
236 T->bufferssize = new1;
237 }
238 T->buffers[T->buffersfill++] = T->bufnum = inicbufs();
239 AC.cbufnum = num = T->bufnum;
240 goto restart;
241 }
242 else {
243 MesPrint("@Compiler buffer overflow. Try to make modules smaller");
244 Terminate(-1);
245 }
246 }
247 old = C->rhs;
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];
251 lold = C->CanCommu; C->CanCommu = (LONG *)(C->rhs+newsize);
252 for ( i = 0; i < C->maxrhs; i++ ) C->CanCommu[i] = lold[i];
253 lold = C->NumTerms; C->NumTerms = (LONG *)(C->rhs+2*newsize);
254 for ( i = 0; i < C->maxrhs; i++ ) C->NumTerms[i] = lold[i];
255 wold = C->numdum; C->numdum = (WORD *)(C->NumTerms+newsize);
256 for ( i = 0; i < C->maxrhs; i++ ) C->numdum[i] = wold[i];
257 wold = C->dimension; C->dimension = (WORD *)(C->numdum+newsize);
258 for ( i = 0; i < C->maxrhs; i++ ) C->dimension[i] = wold[i];
259 if ( old ) M_free(old,"subexpression lists");
260 C->maxrhs = newsize;
261 if ( type == 0 ) RedoTree(C,C->maxrhs);
262 }
263 C->numrhs++;
264 C->CanCommu[C->numrhs] = 0;
265 C->NumTerms[C->numrhs] = 0;
266 C->numdum[C->numrhs] = 0;
267 C->dimension[C->numrhs] = 0;
268 C->rhs[C->numrhs] = C->Pointer;
269 return(C->Pointer);
270}
271
272/*
273 #] AddRHS :
274 #[ AddNtoL :
275*/
276
284int AddNtoL(int n, WORD *array)
285{
286 int i;
287 CBUF *C = cbuf+AC.cbufnum;
288#ifdef COMPBUFDEBUG
289 MesPrint("LH: %a",n,array);
290#endif
291 AddLHS(AC.cbufnum);
292 while ( C->Pointer+n >= C->Top ) DoubleCbuffer(AC.cbufnum,C->Pointer,1);
293 for ( i = 0; i < n; i++ ) *(C->Pointer)++ = *array++;
294 return(0);
295}
296
297/*
298 #] AddNtoL :
299 #[ AddNtoC :
300
301 Commentary: added the bufnum on 14-sep-2010 to make the whole a bit
302 more flexible (JV). Still to do with AddNtoL.
303*/
304
313int AddNtoC(int bufnum, int n, WORD *array,int par)
314{
315 int i;
316 WORD *w;
317 CBUF *C = cbuf+bufnum;
318#ifdef COMPBUFDEBUG
319 MesPrint("RH: %a",n,array);
320#endif
321 while ( C->Pointer+n+1 >= C->Top ) DoubleCbuffer(bufnum,C->Pointer,50+par);
322 w = C->Pointer;
323 for ( i = 0; i < n; i++ ) *w++ = *array++;
324 C->Pointer = w;
325 return(0);
326}
327
328/*
329 #] AddNtoC :
330 #[ InsTree :
331
332 Routines for balanced tree searching and insertion.
333 Compared to Knuth we have a parent link. This minimizes the
334 number of compares. That is better for anything that is more
335 complicated than just single numbers.
336 There are no provisions for removing elements from the tree.
337 The routines are:
338 void RedoTree(size) Re-allocates the tree space. There will
339 be MaxTreeSize = size elements.
340 void ClearTree() Prunes the tree down to the root element.
341 int InsTree(int,int)Searches for the requested element. If not found it
342 will allocate a new element, balance the tree if
343 necessary and return the called number.
344 If it was in the tree, it returns the tree 'value'.
345
346 Commentary: added the bufnum on 14-sep-2010 to make the whole a bit
347 more flexible (JV).
348*/
349static COMPTREE comptreezero = {0,0,0,0,0,0};
350
351int InsTree(int bufnum, int h)
352{
353 CBUF *C = cbuf + bufnum;
354 COMPTREE *boomlijst = C->boomlijst, *q = boomlijst + C->rootnum, *p, *s;
355 WORD *v1, *v2, *v3;
356 int ip, iq, is;
357
358 if ( C->numtree + 1 >= C->MaxTreeSize ) {
359 if ( C->MaxTreeSize == 0 ) {
360 COMPTREE *root;
361 C->MaxTreeSize = 125;
362 C->boomlijst = (COMPTREE *)Malloc1((C->MaxTreeSize+1)*sizeof(COMPTREE),
363 "ClearInsTree");
364 root = C->boomlijst;
365 C->numtree = 0;
366 C->rootnum = 0;
367 root->left = -1;
368 root->right = -1;
369 root->parent = -1;
370 root->blnce = 0;
371 root->value = -1;
372 root->usage = 0;
373 for ( ip = 1; ip < C->MaxTreeSize; ip++ ) { C->boomlijst[ip] = comptreezero; }
374 }
375 else {
376 is = C->MaxTreeSize * 2;
377 s = (COMPTREE *)Malloc1((is+1)*sizeof(COMPTREE),"InsTree");
378 for ( ip = 0; ip < C->MaxTreeSize; ip++ ) { s[ip] = C->boomlijst[ip]; }
379 for ( ip = C->MaxTreeSize; ip <= is; ip++ ) { s[ip] = comptreezero; }
380 if ( C->boomlijst ) M_free(C->boomlijst,"InsTree");
381 C->boomlijst = s;
382 C->MaxTreeSize = is;
383 }
384 boomlijst = C->boomlijst;
385 q = boomlijst + C->rootnum;
386 }
387
388 if ( q->right == -1 ) { /* First element */
389 C->numtree++;
390 s = boomlijst+C->numtree;
391 q->right = C->numtree;
392 s->parent = C->rootnum;
393 s->left = s->right = -1;
394 s->blnce = 0;
395 s->value = h;
396 s->usage = 1;
397 return(h);
398 }
399 ip = q->right;
400 while ( ip >= 0 ) {
401 p = boomlijst + ip;
402 v1 = C->rhs[p->value]; v2 = v3 = C->rhs[h];
403 while ( *v3 ) v3 += *v3; /* find the 0 that indicates end-of-expr */
404 while ( *v1 == *v2 && v2 < v3 ) { v1++; v2++; }
405 if ( *v1 > *v2 ) {
406 iq = p->right;
407 if ( iq >= 0 ) { ip = iq; }
408 else {
409 C->numtree++;
410 is = C->numtree;
411 p->right = is;
412 s = boomlijst + is;
413 s->parent = ip; s->left = s->right = -1;
414 s->blnce = 0; s->value = h; s->usage = 1;
415 p->blnce++;
416 if ( p->blnce == 0 ) return(h);
417 goto balance;
418 }
419 }
420 else if ( *v1 < *v2 ) {
421 iq = p->left;
422 if ( iq >= 0 ) { ip = iq; }
423 else {
424 C->numtree++;
425 is = C->numtree;
426 s = boomlijst+is;
427 p->left = is;
428 s->parent = ip; s->left = s->right = -1;
429 s->blnce = 0; s->value = h; s->usage = 1;
430 p->blnce--;
431 if ( p->blnce == 0 ) return(h);
432 goto balance;
433 }
434 }
435 else {
436 p->usage++;
437 return(p->value);
438 }
439 }
440/* INTERNAL_ERROR_EXCL_START */
441 MesPrint("!>We vallen uit de boom!");
442 Terminate(-1);
443/* INTERNAL_ERROR_EXCL_STOP */
444 return(h);
445balance:;
446 for (;;) {
447 p = boomlijst + ip;
448 iq = p->parent;
449 if ( iq == C->rootnum ) break;
450 q = boomlijst + iq;
451 if ( ip == q->left ) q->blnce--;
452 else q->blnce++;
453 if ( q->blnce == 0 ) break;
454 if ( q->blnce == -2 ) {
455 if ( p->blnce == -1 ) { /* single rotation */
456 q->left = p->right;
457 p->right = iq;
458 p->parent = q->parent;
459 q->parent = ip;
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;
464 }
465 else { /* double rotation */
466 s = boomlijst + is;
467 q->left = s->right;
468 p->right = s->left;
469 s->right = iq;
470 s->left = ip;
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;
474 q->parent = is;
475 p->parent = is;
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; }
482 }
483 break;
484 }
485 else if ( q->blnce == 2 ) {
486 if ( p->blnce == 1 ) { /* single rotation */
487 q->right = p->left;
488 p->left = iq;
489 p->parent = q->parent;
490 q->parent = ip;
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;
495 }
496 else { /* double rotation */
497 s = boomlijst + is;
498 q->right = s->left;
499 p->left = s->right;
500 s->left = iq;
501 s->right = ip;
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;
505 q->parent = is;
506 p->parent = is;
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; }
512 }
513 break;
514 }
515 is = ip; ip = iq;
516 }
517 return(h);
518}
519
520/*
521 #] InsTree :
522 #[ FindTree :
523
524 Routines for balanced tree searching.
525 Is like InsTree but without the insertions.
526 Returns -1 if the element is not in the tree.
527 The advantage of this routine over InsTree is that this routine
528 can be run in parallel.
529*/
530
531int FindTree(int bufnum, WORD *subexpr)
532{
533 CBUF *C = cbuf + bufnum;
534 COMPTREE *boomlijst = C->boomlijst, *q = boomlijst + C->rootnum, *p;
535 WORD *v1, *v2, *v3;
536 int ip, iq;
537
538 ip = q->right;
539 while ( ip >= 0 ) {
540 p = boomlijst + ip;
541 v1 = C->rhs[p->value]; v2 = v3 = subexpr;
542 while ( *v3 ) v3 += *v3; /* find the 0 that indicates end-of-expr */
543 while ( *v1 == *v2 && v2 < v3 ) { v1++; v2++; }
544 if ( *v1 > *v2 ) {
545 iq = p->right;
546 if ( iq >= 0 ) { ip = iq; }
547 else { return(-1); }
548 }
549 else if ( *v1 < *v2 ) {
550 iq = p->left;
551 if ( iq >= 0 ) { ip = iq; }
552 else { return(-1); }
553 }
554 else {
555 p->usage++;
556 return(p->value);
557 }
558 }
559 return(-1);
560}
561
562/*
563 #] FindTree :
564 #[ RedoTree :
565*/
566
567void RedoTree(CBUF *C, int size)
568{
569 COMPTREE *newboomlijst;
570 int i;
571 newboomlijst = (COMPTREE *)Malloc1((size+1)*sizeof(COMPTREE),"newboomlijst");
572 if ( C->boomlijst ) {
573 if ( C->MaxTreeSize > size ) C->MaxTreeSize = size;
574 for ( i = 0; i < C->MaxTreeSize; i++ ) newboomlijst[i] = C->boomlijst[i];
575 M_free(C->boomlijst,"boomlijst");
576 }
577 C->boomlijst = newboomlijst;
578 C->MaxTreeSize = size;
579}
580
581/*
582 #] RedoTree :
583 #[ ClearTree :
584*/
585
586void ClearTree(int i)
587{
588 CBUF *C = cbuf + i;
589 COMPTREE *root = C->boomlijst;
590 if ( root ) {
591 C->numtree = 0;
592 C->rootnum = 0;
593 root->left = -1;
594 root->right = -1;
595 root->parent = -1;
596 root->blnce = 0;
597 root->value = -1;
598 root->usage = 0;
599 }
600}
601
602/*
603 #] ClearTree :
604 #[ IniFbuffer :
605*/
612int IniFbuffer(WORD bufnum)
613{
614 CBUF *C = cbuf + bufnum;
615 COMPTREE *root;
616 int i;
617 LONG fullsize;
618 C->maxrhs = AM.fbuffersize;
619 C->MaxTreeSize = AM.fbuffersize;
620
621 /*
622 * Note that bufnum is a return value of inicbufs(). So C has been already
623 * initialized. (TU 20 Dec 2011)
624 */
625 if ( C->boomlijst ) M_free(C->boomlijst, "IniFbuffer-tree");
626 if ( C->rhs ) M_free(C->rhs, "IniFbuffer-rhs");
627
628 C->boomlijst = (COMPTREE *)Malloc1((C->MaxTreeSize+1)*sizeof(COMPTREE),"IniFbuffer-tree");
629 root = C->boomlijst;
630 C->numtree = 0;
631 C->rootnum = 0;
632 root->left = -1;
633 root->right = -1;
634 root->parent = -1;
635 root->blnce = 0;
636 root->value = -1;
637 root->usage = 0;
638 for ( i = 1; i < C->MaxTreeSize; i++ ) { C->boomlijst[i] = comptreezero; }
639
640 fullsize = (C->maxrhs+1) * (sizeof(WORD *) + 2*sizeof(LONG) + 2*sizeof(WORD));
641 C->rhs = (WORD **)Malloc1(fullsize,"IniFbuffer-rhs");
642 C->CanCommu = (LONG *)(C->rhs+C->maxrhs);
643 C->NumTerms = (LONG *)(C->rhs+2*C->maxrhs);
644 C->numdum = (WORD *)(C->NumTerms+C->maxrhs);
645 C->dimension = (WORD *)(C->numdum+C->maxrhs);
646
647 return(0);
648}
649
650/*
651 #] IniFbuffer :
652 #[ numcommute :
653
654 Returns the number of non-commuting terms in the expression
655*/
656
657LONG numcommute(WORD *terms, LONG *numterms)
658{
659 LONG num = 0;
660 WORD *t, *m;
661 *numterms = 0;
662 while ( *terms ) {
663 *numterms += 1;
664 t = terms + 1;
665 GETSTOP(terms,m);
666 while ( t < m ) {
667 if ( *t >= FUNCTION ) {
668 if ( functions[*t-FUNCTION].commute ) { num++; break; }
669 }
670 t += t[1];
671 }
672 terms = terms + *terms;
673 }
674 return(num);
675}
676
677/*
678 #] numcommute :
679*/
int AddNtoL(int n, WORD *array)
Definition comtool.c:284
WORD * AddRHS(int num, int type)
Definition comtool.c:210
int inicbufs(void)
Definition comtool.c:47
void finishcbuf(WORD num)
Definition comtool.c:89
WORD * DoubleCbuffer(int num, WORD *w, int par)
Definition comtool.c:143
int IniFbuffer(WORD bufnum)
Definition comtool.c:612
int AddNtoC(int bufnum, int n, WORD *array, int par)
Definition comtool.c:313
void clearcbuf(WORD num)
Definition comtool.c:116
WORD * AddLHS(int num)
Definition comtool.c:184
LONG BufferSize
Definition structs.h:981
WORD * numdum
Definition structs.h:978
LONG * NumTerms
Definition structs.h:977
WORD * Top
Definition structs.h:972
COMPTREE * boomlijst
Definition structs.h:980
WORD * dimension
Definition structs.h:979
WORD ** rhs
Definition structs.h:975
WORD ** lhs
Definition structs.h:974
WORD * Buffer
Definition structs.h:971
WORD * Pointer
Definition structs.h:973
LONG * CanCommu
Definition structs.h:976
WORD * buffers
Definition structs.h:357
WORD buffersfill
Definition structs.h:372
WORD bufferssize
Definition structs.h:371
WORD bufnum
Definition structs.h:370
struct tree COMPTREE
int blnce
Definition structs.h:293
int right
Definition structs.h:291
int parent
Definition structs.h:289
int value
Definition structs.h:292
int left
Definition structs.h:290
int usage
Definition structs.h:294