Annotation of libwww/Library/src/HTBTree.c, revision 2.22

2.12      frystyk     1: /*                                                                   HTBTree.c
                      2: **     BINARY TREE FOR SORTING THINGS
2.10      secret      3: **
2.15      frystyk     4: **     (c) COPYRIGHT MIT 1995.
2.12      frystyk     5: **     Please first read the full copyright statement in the file COPYRIGH.
                      6: **
                      7: ** Authors:
                      8: **     Arthur Secret
                      9: **
                     10: **     4 March 94: Bug fixed in the balancing procedure
2.10      secret     11: **
1.1       timbl      12: */
                     13: 
2.14      frystyk    14: /* Library include files */
2.21      frystyk    15: #include "sysdep.h"
1.1       timbl      16: #include "HTUtils.h"
                     17: #include "HTBTree.h"
                     18: 
2.7       secret     19: #define MAXIMUM(a,b) ((a)>(b)?(a):(b))
1.1       timbl      20: 
2.18      frystyk    21: struct _HTBTree_element {
                     22:     void                       *object;        /* User object */
                     23:     struct _HTBTree_element    *up;
                     24:     struct _HTBTree_element    *left;
                     25:     int                                left_depth;
                     26:     struct _HTBTree_element    *right;
                     27:     int                                right_depth;
                     28: };
                     29: 
                     30: struct _HTBTree {
                     31:     HTComparer *               compare;
                     32:     struct _HTBTree_element *  top;   
                     33: };
1.1       timbl      34: 
2.18      frystyk    35: PUBLIC void * HTBTree_object (HTBTElement * element)
                     36: {
                     37:     return element ? element->object : NULL;
                     38: }
1.1       timbl      39: 
2.18      frystyk    40: PUBLIC HTBTree * HTBTree_new (HTComparer * comp)
1.1       timbl      41:     /*********************************************************
                     42:     ** This function returns an HTBTree with memory allocated 
                     43:     ** for it when given a mean to compare things
                     44:     */
                     45: {
2.19      frystyk    46:     HTBTree * tree;
                     47:     if ((tree = (HTBTree  *) HT_CALLOC(1, sizeof(HTBTree))) == NULL)
                     48:         HT_OUTOFMEM("HTBTree_new");
1.1       timbl      49:     tree->compare = comp;
                     50:     tree->top = NULL;
                     51:     return tree;
                     52: }
                     53: 
                     54: 
                     55: 
                     56: 
2.22    ! frystyk    57: PRIVATE void HTBTElement_free (HTBTElement*  element)
2.7       secret     58:     /**********************************************************
2.21      frystyk    59:     ** This void will HT_FREE the memory allocated for one element
2.7       secret     60:     */
                     61: {
2.9       secret     62:     if (element) {
2.22    ! frystyk    63:         if (element->left != NULL)    HTBTElement_free(element->left);
        !            64:        if (element->right != NULL)    HTBTElement_free(element->right);
2.19      frystyk    65:        HT_FREE(element);
2.9       secret     66:     }
2.7       secret     67: }
1.1       timbl      68: 
2.22    ! frystyk    69: PUBLIC void HTBTree_free (HTBTree*  tree)
1.1       timbl      70:     /**************************************************************
2.21      frystyk    71:     ** This void will HT_FREE the memory allocated for the whole tree
1.1       timbl      72:     */
                     73: {
2.22    ! frystyk    74:     HTBTElement_free(tree->top);
2.19      frystyk    75:     HT_FREE(tree);
1.1       timbl      76: }
                     77: 
                     78: 
                     79: 
                     80: 
2.22    ! frystyk    81: PRIVATE void HTBTElementAndObject_free (HTBTElement*  element)
2.6       timbl      82:     /**********************************************************
2.21      frystyk    83:     ** This void will HT_FREE the memory allocated for one element
2.6       timbl      84:     */
                     85: {
2.9       secret     86:     if (element) {     /* Just in case nothing was in the tree anyway */
2.22    ! frystyk    87:         if (element->left != NULL)    HTBTElementAndObject_free(element->left);
2.9       secret     88:        if (element->right != NULL)    
2.22    ! frystyk    89:            HTBTElementAndObject_free(element->right);
2.19      frystyk    90:        HT_FREE(element->object);
                     91:        HT_FREE(element);
2.9       secret     92:     }
2.7       secret     93: }
                     94: 
2.22    ! frystyk    95: PUBLIC void HTBTreeAndObject_free (HTBTree*  tree)
2.7       secret     96:     /**************************************************************
2.21      frystyk    97:     ** This void will HT_FREE the memory allocated for the whole tree
2.7       secret     98:     */
                     99: {
2.22    ! frystyk   100:     HTBTElementAndObject_free(tree->top);
2.19      frystyk   101:     HT_FREE(tree);
2.6       timbl     102: }
                    103: 
2.18      frystyk   104: /*
                    105: ** This void is the core of HTBTree.c . It will
                    106: **       1/ add a new element to the tree at the right place
                    107: **          so that the tree remains sorted
                    108: **       2/ balance the tree to be as fast as possible when reading it
                    109: */
                    110: PUBLIC void HTBTree_add (HTBTree * tree, void * object)
1.1       timbl     111: {
2.6       timbl     112:     HTBTElement * father_of_element;
                    113:     HTBTElement * added_element;
                    114:     HTBTElement * forefather_of_element;
                    115:     HTBTElement * father_of_forefather;
2.10      secret    116:     BOOL father_found,top_found;
                    117:     int depth,depth2,corrections;
2.6       timbl     118:         /* father_of_element is a pointer to the structure that is the father of the
                    119:         ** new object "object".
                    120:         ** added_element is a pointer to the structure that contains or will contain 
1.1       timbl     121:         ** the new object "object".
2.6       timbl     122:         ** father_of_forefather and forefather_of_element are pointers that are used
                    123:         ** to modify the depths of upper elements, when needed.
1.1       timbl     124:         **
2.7       secret    125:         ** father_found indicates by a value NO when the future father of "object" 
                    126:         ** is found.
2.6       timbl     127:         ** top_found indicates by a value NO when, in case of a difference of depths
1.1       timbl     128:         **  < 2, the top of the tree is encountered and forbids any further try to
                    129:         ** balance the tree.
2.10      secret    130:         ** corrections is an integer used to avoid infinite loops in cases
1.1       timbl     131:         ** such as:
                    132:         **
                    133:         **             3                        3
                    134:         **          4                              4
                    135:         **           5                            5
                    136:         **
                    137:         ** 3 is used here to show that it need not be the top of the tree.
                    138:         */
                    139: 
                    140:     /*
                    141:     ** 1/ Adding of the element to the binary tree
                    142:     */
                    143: 
                    144:     if (tree->top == NULL)
                    145:     {
2.19      frystyk   146:         if ((tree->top = (HTBTElement  *) HT_MALLOC(sizeof(HTBTElement))) == NULL)
                    147:             HT_OUTOFMEM("HTBTree_add");
1.1       timbl     148:         tree->top->up = NULL;
                    149:         tree->top->object = object;
                    150:         tree->top->left = NULL;
                    151:         tree->top->left_depth = 0;
                    152:         tree->top->right = NULL;
                    153:         tree->top->right_depth = 0;
                    154:     }
                    155:     else
                    156:     {   
2.6       timbl     157:         father_found = YES;
                    158:         father_of_element = tree->top;
                    159:         added_element = NULL;
                    160:         father_of_forefather = NULL;
                    161:         forefather_of_element = NULL;      
                    162:         while (father_found)
1.1       timbl     163:         {
2.6       timbl     164:             if (tree->compare(object,father_of_element->object)<0)
1.1       timbl     165:            {
2.6       timbl     166:                 if (father_of_element->left != NULL)
                    167:                     father_of_element = father_of_element->left;
1.1       timbl     168:                 else 
                    169:                {
2.6       timbl     170:                     father_found = NO;
2.19      frystyk   171:                     if ((father_of_element->left = (HTBTElement  *) HT_MALLOC(sizeof(HTBTElement))) == NULL)
                    172:                         HT_OUTOFMEM("HTBTree_add");
2.6       timbl     173:                     added_element = father_of_element->left;
                    174:                     added_element->up = father_of_element;
                    175:                     added_element->object = object;
                    176:                     added_element->left = NULL;
                    177:                     added_element->left_depth = 0;
                    178:                     added_element->right = NULL;
                    179:                     added_element->right_depth = 0;
1.1       timbl     180:                 }
                    181:            }
2.8       secret    182:             if (tree->compare(object,father_of_element->object)>=0)
1.1       timbl     183:             {
2.6       timbl     184:                 if (father_of_element->right != NULL) 
                    185:                     father_of_element = father_of_element->right;
1.1       timbl     186:                 else 
                    187:                 {  
2.6       timbl     188:                     father_found = NO;
2.19      frystyk   189:                     if ((father_of_element->right = (HTBTElement  *) HT_MALLOC(sizeof(HTBTElement))) == NULL)
                    190:                         HT_OUTOFMEM("father_of_element->right ");
2.6       timbl     191:                     added_element = father_of_element->right;
                    192:                     added_element->up = father_of_element;
                    193:                     added_element->object = object;
                    194:                     added_element->left = NULL;
                    195:                     added_element->left_depth = 0;
                    196:                     added_element->right = NULL;
                    197:                     added_element->right_depth = 0;       
1.1       timbl     198:                }
                    199:             }
                    200:        }
                    201:             /*
                    202:             ** Changing of all depths that need to be changed
                    203:             */
2.6       timbl     204:         father_of_forefather = father_of_element;
                    205:         forefather_of_element = added_element;
1.1       timbl     206:         do
                    207:         {
2.6       timbl     208:             if (father_of_forefather->left == forefather_of_element)
1.1       timbl     209:             {
2.6       timbl     210:                 depth = father_of_forefather->left_depth;
                    211:                 father_of_forefather->left_depth = 1 
2.7       secret    212:                             + MAXIMUM(forefather_of_element->right_depth,
2.6       timbl     213:                                   forefather_of_element->left_depth);
                    214:                 depth2 = father_of_forefather->left_depth;
1.1       timbl     215:             }
                    216:             else
                    217:            {
2.6       timbl     218:                 depth = father_of_forefather->right_depth;
                    219:                 father_of_forefather->right_depth = 1
2.7       secret    220:                             + MAXIMUM(forefather_of_element->right_depth,
2.6       timbl     221:                                   forefather_of_element->left_depth);
                    222:                 depth2 = father_of_forefather->right_depth;
1.1       timbl     223:             }
2.6       timbl     224:             forefather_of_element = father_of_forefather;
                    225:             father_of_forefather = father_of_forefather->up;
                    226:         } while ((depth != depth2) && (father_of_forefather != NULL));
1.1       timbl     227:         
                    228: 
2.10      secret    229: 
1.1       timbl     230:             /*
                    231:             ** 2/ Balancing the binary tree, if necessary
2.11      secret    232:            ** Bugs in this part have been fixed in March 94  -  AS
1.1       timbl     233:             */
2.6       timbl     234:         top_found = YES;
2.10      secret    235:         corrections = 0;
                    236:         while ((top_found) && (corrections < 7))
1.1       timbl     237:         {
2.6       timbl     238:             if ((abs(father_of_element->left_depth
                    239:                       - father_of_element->right_depth)) < 2)
1.1       timbl     240:            {
2.6       timbl     241:                 if (father_of_element->up != NULL) 
                    242:                     father_of_element = father_of_element->up;
                    243:                 else top_found = NO;
1.1       timbl     244:            }
                    245:             else
                    246:            {                /* We start the process of balancing */
                    247: 
2.10      secret    248:                 corrections = corrections + 1;
1.1       timbl     249:                     /* 
2.10      secret    250:                     ** corrections is an integer used to avoid infinite 
1.1       timbl     251:                     ** loops in cases such as:
                    252:                     **
                    253:                     **             3                        3
                    254:                     **          4                              4
                    255:                     **           5                            5
                    256:                     **
                    257:                     ** 3 is used to show that it need not be the top of the tree
2.10      secret    258:                    ** But let's avoid these two exceptions anyhow 
2.11      secret    259:                    ** with the two following conditions (March 94 - AS)
1.1       timbl     260:                     */
                    261: 
2.10      secret    262:                if ((father_of_element->left == NULL) 
                    263:                    && (father_of_element->right->right == NULL) 
                    264:                    && (father_of_element->right->left->left == NULL) 
                    265:                    && (father_of_element->right->left->right == NULL)) 
                    266:                    corrections = 7;
                    267: 
                    268:                if ((father_of_element->right == NULL) 
                    269:                    && (father_of_element->left->left == NULL) 
                    270:                    && (father_of_element->left->right->right == NULL) 
                    271:                    && (father_of_element->left->right->left == NULL))
                    272:                    corrections = 7;
                    273:  
1.1       timbl     274: 
2.6       timbl     275:                 if (father_of_element->left_depth > father_of_element->right_depth)
1.1       timbl     276:                {
2.6       timbl     277:                     added_element = father_of_element->left;
                    278:                     father_of_element->left_depth = added_element->right_depth;
                    279:                     added_element->right_depth = 1
2.7       secret    280:                                     + MAXIMUM(father_of_element->right_depth,
2.6       timbl     281:                                           father_of_element->left_depth);
                    282:                     if (father_of_element->up != NULL)
1.1       timbl     283:                    {
2.11      secret    284:                        /* Bug fixed in March 94  */
2.10      secret    285:                        BOOL first_time;
                    286: 
2.6       timbl     287:                         father_of_forefather = father_of_element->up;
                    288:                         forefather_of_element = added_element;
2.10      secret    289:                        first_time = YES;
1.1       timbl     290:                         do 
                    291:                         {
2.6       timbl     292:                             if (father_of_forefather->left
                    293:                                  == forefather_of_element->up)
2.10      secret    294:                               {
                    295:                                  depth = father_of_forefather->left_depth;
                    296:                                  if (first_time)
                    297:                                  {
                    298:                                      father_of_forefather->left_depth = 1
                    299:                                          + MAXIMUM(forefather_of_element->left_depth,
                    300:                                                  forefather_of_element->right_depth);
                    301:                                        first_time = NO;
                    302:                                   }
                    303:                                   else
                    304:                                       father_of_forefather->left_depth = 1
                    305:                                           + MAXIMUM(forefather_of_element->up->left_depth,
                    306:                                              forefather_of_element->up->right_depth);
                    307: 
2.6       timbl     308:                                 depth2 = father_of_forefather->left_depth;
1.1       timbl     309:                            }
                    310:                             else
                    311:                            {
2.6       timbl     312:                                 depth = father_of_forefather->right_depth;
2.10      secret    313:                                if (first_time)
                    314:                                {
                    315:                                    father_of_forefather->right_depth = 1
                    316:                                      + MAXIMUM(forefather_of_element->left_depth,
                    317:                                               forefather_of_element->right_depth);
                    318:                                    first_time = NO;
                    319:                                }                               
                    320:                                else
                    321:                                    father_of_forefather->right_depth = 1
                    322:                                      + MAXIMUM(forefather_of_element->up->left_depth,
                    323:                                           forefather_of_element->up->right_depth);
2.6       timbl     324:                                 depth2 = father_of_forefather->right_depth;
1.1       timbl     325:                            }
2.10      secret    326:                             forefather_of_element = forefather_of_element->up;
2.6       timbl     327:                             father_of_forefather = father_of_forefather->up;
2.7       secret    328:                        } while ((depth != depth2) && 
                    329:                                 (father_of_forefather != NULL));
2.6       timbl     330:                         father_of_forefather = father_of_element->up;
                    331:                         if (father_of_forefather->left == father_of_element)
1.1       timbl     332:                        {
                    333:                             /*
                    334:                             **                   3                       3
                    335:                             **               4                       5
                    336:                             ** When tree   5   6        becomes    7    4
                    337:                             **            7 8                          8 6
                    338:                             **
                    339:                             ** 3 is used to show that it may not be the top of the
                    340:                             ** tree.
                    341:                             */ 
2.6       timbl     342:                             father_of_forefather->left = added_element;
                    343:                             father_of_element->left = added_element->right;
                    344:                             added_element->right = father_of_element;
1.1       timbl     345:                         }
2.6       timbl     346:                         if (father_of_forefather->right == father_of_element)
1.1       timbl     347:                        {
                    348:                             /*
                    349:                             **          3                       3
                    350:                             **               4                       5
                    351:                             ** When tree   5   6        becomes    7    4
                    352:                             **            7 8                          8 6
                    353:                             **
                    354:                             ** 3 is used to show that it may not be the top of the
                    355:                             ** tree
                    356:                             */
2.6       timbl     357:                             father_of_forefather->right = added_element;
                    358:                             father_of_element->left = added_element->right;
                    359:                             added_element->right = father_of_element;
1.1       timbl     360:                         }
2.6       timbl     361:                         added_element->up = father_of_forefather;
1.1       timbl     362:                    }
                    363:                     else
                    364:                    {
                    365:                         /*
                    366:                         **
                    367:                         **               1                       2
                    368:                         ** When tree   2   3        becomes    4    1
                    369:                         **            4 5                          5 3
                    370:                         **
                    371:                         ** 1 is used to show that it is the top of the tree    
                    372:                         */
2.6       timbl     373:                         added_element->up = NULL;
                    374:                         father_of_element->left = added_element->right;
                    375:                         added_element->right = father_of_element;
1.1       timbl     376:                    }
2.6       timbl     377:                     father_of_element->up = added_element;
                    378:                     if (father_of_element->left != NULL)
                    379:                         father_of_element->left->up = father_of_element;
1.1       timbl     380:                }
                    381:                 else
                    382:                {
2.6       timbl     383:                     added_element = father_of_element->right;
                    384:                     father_of_element->right_depth = added_element->left_depth;
                    385:                     added_element->left_depth = 1 + 
2.7       secret    386:                             MAXIMUM(father_of_element->right_depth,
2.6       timbl     387:                                 father_of_element->left_depth);
                    388:                     if (father_of_element->up != NULL)
2.11      secret    389:                        /* Bug fixed in March 94  */
1.1       timbl     390:                    {
2.10      secret    391:                        BOOL first_time;
                    392: 
2.6       timbl     393:                         father_of_forefather = father_of_element->up;
                    394:                         forefather_of_element = added_element;
2.10      secret    395:                        first_time = YES;
1.1       timbl     396:                         do 
                    397:                         {
2.10      secret    398:                             if (father_of_forefather->left 
                    399:                                == forefather_of_element->up)
1.1       timbl     400:                             {
2.6       timbl     401:                                 depth = father_of_forefather->left_depth;
2.10      secret    402:                                 if (first_time)
                    403:                                {
                    404:                                    father_of_forefather->left_depth = 1
                    405:                                       + MAXIMUM(forefather_of_element->left_depth,
                    406:                                               forefather_of_element->right_depth);
                    407:                                    first_time = NO;
                    408:                                }
                    409:                                 else
                    410:                                    father_of_forefather->left_depth = 1
                    411:                                      + MAXIMUM(forefather_of_element->up->left_depth,
                    412:                                          forefather_of_element->up->right_depth);
                    413:                                depth2 = father_of_forefather->left_depth;
1.1       timbl     414:                            }
                    415:                             else
                    416:                            {
2.6       timbl     417:                                 depth = father_of_forefather->right_depth;
2.10      secret    418:                                if (first_time)
                    419:                                {
                    420:                                    father_of_forefather->right_depth = 1
                    421:                                       + MAXIMUM(forefather_of_element->left_depth,
                    422:                                               forefather_of_element->right_depth);
                    423:                                    first_time = NO;
                    424:                                }
                    425:                                else
                    426:                                    father_of_forefather->right_depth = 1
                    427:                                      + MAXIMUM(forefather_of_element->up->left_depth,
                    428:                                           forefather_of_element->up->right_depth);
2.6       timbl     429:                                 depth2 = father_of_forefather->right_depth;
1.1       timbl     430:                            }
2.6       timbl     431:                             father_of_forefather = father_of_forefather->up;
2.10      secret    432:                             forefather_of_element = forefather_of_element->up;
2.7       secret    433:                        } while ((depth != depth2) && 
                    434:                                 (father_of_forefather != NULL));
2.6       timbl     435:                         father_of_forefather = father_of_element->up;
                    436:                         if (father_of_forefather->left == father_of_element)
1.1       timbl     437:                        {
                    438:                             /*
                    439:                             **                    3                       3
                    440:                             **               4                       6
                    441:                             ** When tree   5   6        becomes    4    8
                    442:                             **                7 8                 5 7
                    443:                             **
                    444:                             ** 3 is used to show that it may not be the top of the
                    445:                             ** tree.
                    446:                             */
2.6       timbl     447:                             father_of_forefather->left = added_element;
                    448:                             father_of_element->right = added_element->left;
                    449:                             added_element->left = father_of_element;
1.1       timbl     450:                         }
2.6       timbl     451:                         if (father_of_forefather->right == father_of_element)
1.1       timbl     452:                        {
                    453:                             /*
                    454:                             **           3                      3
                    455:                             **               4                       6
                    456:                             ** When tree   5   6        becomes    4    8
                    457:                             **                7 8                 5 7
                    458:                             **
                    459:                             ** 3 is used to show that it may not be the top of the
                    460:                             ** tree
                    461:                             */
2.6       timbl     462:                             father_of_forefather->right = added_element;
                    463:                             father_of_element->right = added_element->left;
                    464:                             added_element->left = father_of_element;
1.1       timbl     465:                         }
2.6       timbl     466:                         added_element->up = father_of_forefather;
1.1       timbl     467:                    }
                    468:                     else
                    469:                     {
                    470:                         /*
                    471:                         **
                    472:                         **               1                       3
                    473:                         ** When tree   2   3        becomes    1    5
                    474:                         **                4 5                 2 4
                    475:                         **
                    476:                         ** 1 is used to show that it is the top of the tree.
                    477:                         */
2.6       timbl     478:                         added_element->up = NULL;
                    479:                         father_of_element->right = added_element->left;
                    480:                         added_element->left = father_of_element;
1.1       timbl     481:                    }
2.6       timbl     482:                     father_of_element->up = added_element;
2.8       secret    483:                     if (father_of_element->right != NULL)
                    484:                        father_of_element->right->up = father_of_element;
1.1       timbl     485:                }
                    486:            }
                    487:         }
2.6       timbl     488:         while (father_of_element->up != NULL)
1.1       timbl     489:        {
2.6       timbl     490:             father_of_element = father_of_element->up;
1.1       timbl     491:         }
2.6       timbl     492:         tree->top = father_of_element;
1.1       timbl     493:     }
                    494: }
                    495: 
2.18      frystyk   496: /*
                    497: ** this function returns a pointer to the leftmost element if ele is NULL,
                    498: ** and to the next object to the right otherways.
                    499: ** If no elements left, returns a pointer to NULL.
                    500: */
                    501: PUBLIC HTBTElement * HTBTree_next(HTBTree * tree, HTBTElement * element)
1.1       timbl     502: {
2.6       timbl     503:     HTBTElement * father_of_element;
                    504:     HTBTElement * father_of_forefather;
2.18      frystyk   505:     if (!element) {
2.6       timbl     506:         father_of_element = tree->top;
                    507:         if (father_of_element != NULL)
                    508:             while (father_of_element->left != NULL)
                    509:                 father_of_element = father_of_element->left;
1.1       timbl     510:     }
                    511:     else
                    512:     {
2.18      frystyk   513:         father_of_element = element;
2.6       timbl     514:         if (father_of_element->right != NULL)
1.1       timbl     515:        {
2.6       timbl     516:             father_of_element = father_of_element->right;
                    517:             while (father_of_element->left != NULL)
                    518:                 father_of_element = father_of_element->left;
1.1       timbl     519:        }
                    520:         else
                    521:        {
2.6       timbl     522:             father_of_forefather = father_of_element->up;
2.7       secret    523:                while (father_of_forefather && 
                    524:                       (father_of_forefather->right == father_of_element))
                    525:                {
                    526:                     father_of_element = father_of_forefather;
                    527:                    father_of_forefather = father_of_element->up;
                    528:                }
2.6       timbl     529:             father_of_element = father_of_forefather;
1.1       timbl     530:        }
                    531:     }
2.21      frystyk   532: #if 0
2.6       timbl     533:     /* The option -DBTREE_TRACE will give much more information
                    534:     ** about the way the process is running, for debugging matters
                    535:     */
                    536:     if (father_of_element != NULL)
                    537:     {
2.20      eric      538:         HTTrace("\nObject = %s\t",(char *)father_of_element->object);
2.6       timbl     539:         if (father_of_element->up != NULL)
2.20      eric      540:             HTTrace("Objet du pere = %s\n",
2.7       secret    541:                   (char *)father_of_element->up->object);
2.20      eric      542:         else HTTrace("Pas de Pere\n");
2.6       timbl     543:         if (father_of_element->left != NULL)
2.20      eric      544:             HTTrace("Objet du fils gauche = %s\t",
2.7       secret    545:                   (char *)father_of_element->left->object); 
2.20      eric      546:         else HTTrace("Pas de fils gauche\t");
2.6       timbl     547:         if (father_of_element->right != NULL)
2.20      eric      548:             HTTrace("Objet du fils droit = %s\n",
2.7       secret    549:                   (char *)father_of_element->right->object);
2.20      eric      550:         else HTTrace("Pas de fils droit\n");
                    551:         HTTrace("Profondeur gauche = %i\t",father_of_element->left_depth);
                    552:         HTTrace("Profondeur droite = %i\n",father_of_element->right_depth);
                    553:         HTTrace("      **************\n");
2.6       timbl     554:     }
                    555: #endif
                    556:     return father_of_element;
1.1       timbl     557: }
                    558: 
                    559: 
2.21      frystyk   560: #if 0
1.1       timbl     561: main ()
                    562:     /******************************************************
                    563:     ** This is just a test to show how to handle HTBTree.c
                    564:     */
                    565: {
                    566:     HTBTree * tree;
2.6       timbl     567:     HTBTElement * next_element;
1.1       timbl     568:     
2.8       secret    569:     tree = HTBTree_new((HTComparer)strcasecmp);
                    570:     HTBTree_add(tree,"hypertext");
                    571:     HTBTree_add(tree,"Addressing");
                    572:     HTBTree_add(tree,"X11");
                    573:     HTBTree_add(tree,"Tools");
                    574:     HTBTree_add(tree,"Proposal.wn");
                    575:     HTBTree_add(tree,"Protocols");
                    576:     HTBTree_add(tree,"NeXT");
                    577:     HTBTree_add(tree,"Daemon");
                    578:     HTBTree_add(tree,"Test");
                    579:     HTBTree_add(tree,"Administration");
                    580:     HTBTree_add(tree,"LineMode");
                    581:     HTBTree_add(tree,"DesignIssues");
                    582:     HTBTree_add(tree,"MarkUp");
                    583:     HTBTree_add(tree,"Macintosh");
                    584:     HTBTree_add(tree,"Proposal.rtf.wn");
                    585:     HTBTree_add(tree,"FIND");
                    586:     HTBTree_add(tree,"Paper");
                    587:     HTBTree_add(tree,"Tcl");
                    588:     HTBTree_add(tree,"Talks");
                    589:     HTBTree_add(tree,"Architecture");
                    590:     HTBTree_add(tree,"VMSHelp");
                    591:     HTBTree_add(tree,"Provider");
                    592:     HTBTree_add(tree,"Archive");
                    593:     HTBTree_add(tree,"SLAC");
                    594:     HTBTree_add(tree,"Project");
                    595:     HTBTree_add(tree,"News");
                    596:     HTBTree_add(tree,"Viola");
                    597:     HTBTree_add(tree,"Users");
                    598:     HTBTree_add(tree,"FAQ");
                    599:     HTBTree_add(tree,"WorkingNotes");
                    600:     HTBTree_add(tree,"Windows");
                    601:     HTBTree_add(tree,"FineWWW");
                    602:     HTBTree_add(tree,"Frame");
                    603:     HTBTree_add(tree,"XMosaic");
                    604:     HTBTree_add(tree,"People");
                    605:     HTBTree_add(tree,"All");
                    606:     HTBTree_add(tree,"Curses");
                    607:     HTBTree_add(tree,"Erwise");
                    608:     HTBTree_add(tree,"Carl");
                    609:     HTBTree_add(tree,"MidasWWW");
                    610:     HTBTree_add(tree,"XPM");
                    611:     HTBTree_add(tree,"MailRobot");
                    612:     HTBTree_add(tree,"Illustrations");
                    613:     HTBTree_add(tree,"VMClient");
                    614:     HTBTree_add(tree,"XPA");
                    615:     HTBTree_add(tree,"Clients.html");
                    616:     HTBTree_add(tree,"Library");
                    617:     HTBTree_add(tree,"CERNLIB_Distribution");
                    618:     HTBTree_add(tree,"libHTML");
                    619:     HTBTree_add(tree,"WindowsPC");
                    620:     HTBTree_add(tree,"tkWWW");
                    621:     HTBTree_add(tree,"tk2.3");
                    622:     HTBTree_add(tree,"CVS-RCS");
                    623:     HTBTree_add(tree,"DecnetSockets");
                    624:     HTBTree_add(tree,"SGMLStream");
                    625:     HTBTree_add(tree,"NextStep");
                    626:     HTBTree_add(tree,"CVSRepository_old");
                    627:     HTBTree_add(tree,"ArthurSecret");
                    628:     HTBTree_add(tree,"CVSROOT");
                    629:     HTBTree_add(tree,"HytelnetGate");
                    630:     HTBTree_add(tree,"cern.www.new.src");
                    631:     HTBTree_add(tree,"Conditions");
                    632:     HTBTree_add(tree,"HTMLGate");
                    633:     HTBTree_add(tree,"Makefile");
                    634:     HTBTree_add(tree,"Newsgroups.html");
                    635:     HTBTree_add(tree,"People.html");
                    636:     HTBTree_add(tree,"Bugs.html");
                    637:     HTBTree_add(tree,"Summary.html");
                    638:     HTBTree_add(tree,"zDesignIssues.wn");
                    639:     HTBTree_add(tree,"HT.draw");
                    640:     HTBTree_add(tree,"HTandCERN.wn");
                    641:     HTBTree_add(tree,"Ideas.wn");
                    642:     HTBTree_add(tree,"MarkUp.wn");
                    643:     HTBTree_add(tree,"Proposal.html");
                    644:     HTBTree_add(tree,"SearchPanel.draw");
                    645:     HTBTree_add(tree,"Comments.wn");
                    646:     HTBTree_add(tree,"Xanadu.html");
                    647:     HTBTree_add(tree,"Storinglinks.html");
                    648:     HTBTree_add(tree,"TheW3Book.html");
                    649:     HTBTree_add(tree,"Talk_Feb-91.html");
                    650:     HTBTree_add(tree,"JFosterEntry.txt");
                    651:     HTBTree_add(tree,"Summary.txt");
                    652:     HTBTree_add(tree,"Bibliography.html");
                    653:     HTBTree_add(tree,"HTandCern.txt");
                    654:     HTBTree_add(tree,"Talk.draw");
                    655:     HTBTree_add(tree,"zDesignNotes.html");
                    656:     HTBTree_add(tree,"Link.html");
                    657:     HTBTree_add(tree,"Status.html");
                    658:     HTBTree_add(tree,"http.txt");
                    659:     HTBTree_add(tree,"People.html~");
                    660:     HTBTree_add(tree,"TAGS");
                    661:     HTBTree_add(tree,"summary.txt");
                    662:     HTBTree_add(tree,"Technical.html");
                    663:     HTBTree_add(tree,"Terms.html");
                    664:     HTBTree_add(tree,"JANETAccess.html");
                    665:     HTBTree_add(tree,"People.txt");
                    666:     HTBTree_add(tree,"README.txt");
                    667:     HTBTree_add(tree,"CodingStandards.html");
                    668:     HTBTree_add(tree,"Copyright.txt");
                    669:     HTBTree_add(tree,"Status_old.html");
                    670:     HTBTree_add(tree,"patches~");
                    671:     HTBTree_add(tree,"RelatedProducts.html");
                    672:     HTBTree_add(tree,"Implementation");
                    673:     HTBTree_add(tree,"History.html");
                    674:     HTBTree_add(tree,"Makefile.bak");
                    675:     HTBTree_add(tree,"Makefile.old");
                    676:     HTBTree_add(tree,"Policy.html");
                    677:     HTBTree_add(tree,"WhatIs.html");
                    678:     HTBTree_add(tree,"TheProject.html");
                    679:     HTBTree_add(tree,"Notation.html");
                    680:     HTBTree_add(tree,"Helping.html");
                    681:     HTBTree_add(tree,"Cyber-WWW.sit.Hqx");
                    682:     HTBTree_add(tree,"Glossary.html");
                    683:     HTBTree_add(tree,"maketags.html");
                    684:     HTBTree_add(tree,"IntroCS.html");
                    685:     HTBTree_add(tree,"Contrib");
                    686:     HTBTree_add(tree,"Help.html");
                    687:     HTBTree_add(tree,"CodeManagExec");
                    688:     HTBTree_add(tree,"HT-0.1draz");
                    689:     HTBTree_add(tree,"Cello");
                    690:     HTBTree_add(tree,"TOPUB");
                    691:     HTBTree_add(tree,"BUILD");
                    692:     HTBTree_add(tree,"BUILDALL");
                    693:     HTBTree_add(tree,"Lynx");
                    694:     HTBTree_add(tree,"ArthurLibrary");
                    695:     HTBTree_add(tree,"RashtyClient");
                    696:     HTBTree_add(tree,"#History.html#");
                    697:     HTBTree_add(tree,"PerlServers");
                    698:     HTBTree_add(tree,"modules");
                    699:     HTBTree_add(tree,"NCSA_httpd");
                    700:     HTBTree_add(tree,"MAIL2HTML");
                    701:     HTBTree_add(tree,"core");
                    702:     HTBTree_add(tree,"EmacsWWW");
2.20      eric      703:     HTTrace("\nTreeTopObject=%s\n\n",tree->top->object);
2.6       timbl     704:     next_element = HTBTree_next(tree,NULL);
                    705:     while (next_element != NULL)
1.1       timbl     706:     {
2.20      eric      707:         HTTrace("The next element is %s\n",next_element->object);
2.6       timbl     708:         next_element = HTBTree_next(tree,next_element);
1.1       timbl     709:     }
2.22    ! frystyk   710:     HTBTree_free (tree);
1.1       timbl     711: }
                    712: #endif

Webmaster