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