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

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

Webmaster