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

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

Webmaster