Annotation of libwww/Library/src/HTBTree.c, revision 2.15
2.12 frystyk 1: /* HTBTree.c
2: ** BINARY TREE FOR SORTING THINGS
2.10 secret 3: **
2.15 ! frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.12 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
6: **
7: ** Authors:
8: ** Arthur Secret
9: **
10: ** 4 March 94: Bug fixed in the balancing procedure
2.10 secret 11: **
1.1 timbl 12: */
13:
2.14 frystyk 14: /* Library include files */
15: #include "tcp.h"
1.1 timbl 16: #include "HTUtils.h"
17: #include "HTBTree.h"
18:
2.7 secret 19: #define MAXIMUM(a,b) ((a)>(b)?(a):(b))
1.1 timbl 20:
21:
22:
23:
24:
25: PUBLIC HTBTree * HTBTree_new ARGS1(HTComparer, comp)
26: /*********************************************************
27: ** This function returns an HTBTree with memory allocated
28: ** for it when given a mean to compare things
29: */
30: {
31: HTBTree * tree = (HTBTree *)malloc(sizeof(HTBTree));
32: if (tree==NULL) outofmem(__FILE__, "HTBTree_new");
33:
34: tree->compare = comp;
35: tree->top = NULL;
36:
37: return tree;
38: }
39:
40:
41:
42:
2.7 secret 43: PRIVATE void HTBTElement_free ARGS1(HTBTElement*, element)
44: /**********************************************************
45: ** This void will free the memory allocated for one element
46: */
47: {
2.9 secret 48: if (element) {
49: if (element->left != NULL) HTBTElement_free(element->left);
50: if (element->right != NULL) HTBTElement_free(element->right);
51: free(element);
52: }
2.7 secret 53: }
1.1 timbl 54:
55: PUBLIC void HTBTree_free ARGS1(HTBTree*, tree)
56: /**************************************************************
57: ** This void will free the memory allocated for the whole tree
58: */
59: {
2.6 timbl 60: HTBTElement_free(tree->top);
1.1 timbl 61: free(tree);
62: }
63:
64:
65:
66:
2.7 secret 67: PRIVATE void HTBTElementAndObject_free ARGS1(HTBTElement*, element)
2.6 timbl 68: /**********************************************************
69: ** This void will free the memory allocated for one element
70: */
71: {
2.9 secret 72: if (element) { /* Just in case nothing was in the tree anyway */
73: if (element->left != NULL) HTBTElementAndObject_free(element->left);
74: if (element->right != NULL)
75: HTBTElementAndObject_free(element->right);
76: free(element->object);
77: free(element);
78: }
2.7 secret 79: }
80:
81: PUBLIC void HTBTreeAndObject_free ARGS1(HTBTree*, tree)
82: /**************************************************************
83: ** This void will free the memory allocated for the whole tree
84: */
85: {
86: HTBTElementAndObject_free(tree->top);
87: free(tree);
2.6 timbl 88: }
89:
90:
91:
92:
1.1 timbl 93: PUBLIC void HTBTree_add ARGS2(
94: HTBTree*, tree,
95: void*, object)
96: /**********************************************************************
97: ** This void is the core of HTBTree.c . It will
98: ** 1/ add a new element to the tree at the right place
99: ** so that the tree remains sorted
100: ** 2/ balance the tree to be as fast as possible when reading it
101: */
102: {
2.6 timbl 103: HTBTElement * father_of_element;
104: HTBTElement * added_element;
105: HTBTElement * forefather_of_element;
106: HTBTElement * father_of_forefather;
2.10 secret 107: BOOL father_found,top_found;
108: int depth,depth2,corrections;
2.6 timbl 109: /* father_of_element is a pointer to the structure that is the father of the
110: ** new object "object".
111: ** added_element is a pointer to the structure that contains or will contain
1.1 timbl 112: ** the new object "object".
2.6 timbl 113: ** father_of_forefather and forefather_of_element are pointers that are used
114: ** to modify the depths of upper elements, when needed.
1.1 timbl 115: **
2.7 secret 116: ** father_found indicates by a value NO when the future father of "object"
117: ** is found.
2.6 timbl 118: ** top_found indicates by a value NO when, in case of a difference of depths
1.1 timbl 119: ** < 2, the top of the tree is encountered and forbids any further try to
120: ** balance the tree.
2.10 secret 121: ** corrections is an integer used to avoid infinite loops in cases
1.1 timbl 122: ** such as:
123: **
124: ** 3 3
125: ** 4 4
126: ** 5 5
127: **
128: ** 3 is used here to show that it need not be the top of the tree.
129: */
130:
131: /*
132: ** 1/ Adding of the element to the binary tree
133: */
134:
135: if (tree->top == NULL)
136: {
137: tree->top = (HTBTElement *)malloc(sizeof(HTBTElement));
138: if (tree->top == NULL) outofmem(__FILE__, "HTBTree_add");
139: tree->top->up = NULL;
140: tree->top->object = object;
141: tree->top->left = NULL;
142: tree->top->left_depth = 0;
143: tree->top->right = NULL;
144: tree->top->right_depth = 0;
145: }
146: else
147: {
2.6 timbl 148: father_found = YES;
149: father_of_element = tree->top;
150: added_element = NULL;
151: father_of_forefather = NULL;
152: forefather_of_element = NULL;
153: while (father_found)
1.1 timbl 154: {
2.6 timbl 155: if (tree->compare(object,father_of_element->object)<0)
1.1 timbl 156: {
2.6 timbl 157: if (father_of_element->left != NULL)
158: father_of_element = father_of_element->left;
1.1 timbl 159: else
160: {
2.6 timbl 161: father_found = NO;
162: father_of_element->left =
163: (HTBTElement *)malloc(sizeof(HTBTElement));
164: if (father_of_element->left==NULL)
165: outofmem(__FILE__, "HTBTree_add");
166: added_element = father_of_element->left;
167: added_element->up = father_of_element;
168: added_element->object = object;
169: added_element->left = NULL;
170: added_element->left_depth = 0;
171: added_element->right = NULL;
172: added_element->right_depth = 0;
1.1 timbl 173: }
174: }
2.8 secret 175: if (tree->compare(object,father_of_element->object)>=0)
1.1 timbl 176: {
2.6 timbl 177: if (father_of_element->right != NULL)
178: father_of_element = father_of_element->right;
1.1 timbl 179: else
180: {
2.6 timbl 181: father_found = NO;
182: father_of_element->right =
183: (HTBTElement *)malloc(sizeof(HTBTElement));
184: if (father_of_element->right==NULL)
185: outofmem(__FILE__, "HTBTree_add");
186: added_element = father_of_element->right;
187: added_element->up = father_of_element;
188: added_element->object = object;
189: added_element->left = NULL;
190: added_element->left_depth = 0;
191: added_element->right = NULL;
192: added_element->right_depth = 0;
1.1 timbl 193: }
194: }
195: }
196: /*
197: ** Changing of all depths that need to be changed
198: */
2.6 timbl 199: father_of_forefather = father_of_element;
200: forefather_of_element = added_element;
1.1 timbl 201: do
202: {
2.6 timbl 203: if (father_of_forefather->left == forefather_of_element)
1.1 timbl 204: {
2.6 timbl 205: depth = father_of_forefather->left_depth;
206: father_of_forefather->left_depth = 1
2.7 secret 207: + MAXIMUM(forefather_of_element->right_depth,
2.6 timbl 208: forefather_of_element->left_depth);
209: depth2 = father_of_forefather->left_depth;
1.1 timbl 210: }
211: else
212: {
2.6 timbl 213: depth = father_of_forefather->right_depth;
214: father_of_forefather->right_depth = 1
2.7 secret 215: + MAXIMUM(forefather_of_element->right_depth,
2.6 timbl 216: forefather_of_element->left_depth);
217: depth2 = father_of_forefather->right_depth;
1.1 timbl 218: }
2.6 timbl 219: forefather_of_element = father_of_forefather;
220: father_of_forefather = father_of_forefather->up;
221: } while ((depth != depth2) && (father_of_forefather != NULL));
1.1 timbl 222:
223:
2.10 secret 224:
1.1 timbl 225: /*
226: ** 2/ Balancing the binary tree, if necessary
2.11 secret 227: ** Bugs in this part have been fixed in March 94 - AS
1.1 timbl 228: */
2.6 timbl 229: top_found = YES;
2.10 secret 230: corrections = 0;
231: while ((top_found) && (corrections < 7))
1.1 timbl 232: {
2.6 timbl 233: if ((abs(father_of_element->left_depth
234: - father_of_element->right_depth)) < 2)
1.1 timbl 235: {
2.6 timbl 236: if (father_of_element->up != NULL)
237: father_of_element = father_of_element->up;
238: else top_found = NO;
1.1 timbl 239: }
240: else
241: { /* We start the process of balancing */
242:
2.10 secret 243: corrections = corrections + 1;
1.1 timbl 244: /*
2.10 secret 245: ** corrections is an integer used to avoid infinite
1.1 timbl 246: ** loops in cases such as:
247: **
248: ** 3 3
249: ** 4 4
250: ** 5 5
251: **
252: ** 3 is used to show that it need not be the top of the tree
2.10 secret 253: ** But let's avoid these two exceptions anyhow
2.11 secret 254: ** with the two following conditions (March 94 - AS)
1.1 timbl 255: */
256:
2.10 secret 257: if ((father_of_element->left == NULL)
258: && (father_of_element->right->right == NULL)
259: && (father_of_element->right->left->left == NULL)
260: && (father_of_element->right->left->right == NULL))
261: corrections = 7;
262:
263: if ((father_of_element->right == NULL)
264: && (father_of_element->left->left == NULL)
265: && (father_of_element->left->right->right == NULL)
266: && (father_of_element->left->right->left == NULL))
267: corrections = 7;
268:
1.1 timbl 269:
2.6 timbl 270: if (father_of_element->left_depth > father_of_element->right_depth)
1.1 timbl 271: {
2.6 timbl 272: added_element = father_of_element->left;
273: father_of_element->left_depth = added_element->right_depth;
274: added_element->right_depth = 1
2.7 secret 275: + MAXIMUM(father_of_element->right_depth,
2.6 timbl 276: father_of_element->left_depth);
277: if (father_of_element->up != NULL)
1.1 timbl 278: {
2.11 secret 279: /* Bug fixed in March 94 */
2.10 secret 280: BOOL first_time;
281:
2.6 timbl 282: father_of_forefather = father_of_element->up;
283: forefather_of_element = added_element;
2.10 secret 284: first_time = YES;
1.1 timbl 285: do
286: {
2.6 timbl 287: if (father_of_forefather->left
288: == forefather_of_element->up)
2.10 secret 289: {
290: depth = father_of_forefather->left_depth;
291: if (first_time)
292: {
293: father_of_forefather->left_depth = 1
294: + MAXIMUM(forefather_of_element->left_depth,
295: forefather_of_element->right_depth);
296: first_time = NO;
297: }
298: else
299: father_of_forefather->left_depth = 1
300: + MAXIMUM(forefather_of_element->up->left_depth,
301: forefather_of_element->up->right_depth);
302:
2.6 timbl 303: depth2 = father_of_forefather->left_depth;
1.1 timbl 304: }
305: else
306: {
2.6 timbl 307: depth = father_of_forefather->right_depth;
2.10 secret 308: if (first_time)
309: {
310: father_of_forefather->right_depth = 1
311: + MAXIMUM(forefather_of_element->left_depth,
312: forefather_of_element->right_depth);
313: first_time = NO;
314: }
315: else
316: father_of_forefather->right_depth = 1
317: + MAXIMUM(forefather_of_element->up->left_depth,
318: forefather_of_element->up->right_depth);
2.6 timbl 319: depth2 = father_of_forefather->right_depth;
1.1 timbl 320: }
2.10 secret 321: forefather_of_element = forefather_of_element->up;
2.6 timbl 322: father_of_forefather = father_of_forefather->up;
2.7 secret 323: } while ((depth != depth2) &&
324: (father_of_forefather != NULL));
2.6 timbl 325: father_of_forefather = father_of_element->up;
326: if (father_of_forefather->left == father_of_element)
1.1 timbl 327: {
328: /*
329: ** 3 3
330: ** 4 5
331: ** When tree 5 6 becomes 7 4
332: ** 7 8 8 6
333: **
334: ** 3 is used to show that it may not be the top of the
335: ** tree.
336: */
2.6 timbl 337: father_of_forefather->left = added_element;
338: father_of_element->left = added_element->right;
339: added_element->right = father_of_element;
1.1 timbl 340: }
2.6 timbl 341: if (father_of_forefather->right == father_of_element)
1.1 timbl 342: {
343: /*
344: ** 3 3
345: ** 4 5
346: ** When tree 5 6 becomes 7 4
347: ** 7 8 8 6
348: **
349: ** 3 is used to show that it may not be the top of the
350: ** tree
351: */
2.6 timbl 352: father_of_forefather->right = added_element;
353: father_of_element->left = added_element->right;
354: added_element->right = father_of_element;
1.1 timbl 355: }
2.6 timbl 356: added_element->up = father_of_forefather;
1.1 timbl 357: }
358: else
359: {
360: /*
361: **
362: ** 1 2
363: ** When tree 2 3 becomes 4 1
364: ** 4 5 5 3
365: **
366: ** 1 is used to show that it is the top of the tree
367: */
2.6 timbl 368: added_element->up = NULL;
369: father_of_element->left = added_element->right;
370: added_element->right = father_of_element;
1.1 timbl 371: }
2.6 timbl 372: father_of_element->up = added_element;
373: if (father_of_element->left != NULL)
374: father_of_element->left->up = father_of_element;
1.1 timbl 375: }
376: else
377: {
2.6 timbl 378: added_element = father_of_element->right;
379: father_of_element->right_depth = added_element->left_depth;
380: added_element->left_depth = 1 +
2.7 secret 381: MAXIMUM(father_of_element->right_depth,
2.6 timbl 382: father_of_element->left_depth);
383: if (father_of_element->up != NULL)
2.11 secret 384: /* Bug fixed in March 94 */
1.1 timbl 385: {
2.10 secret 386: BOOL first_time;
387:
2.6 timbl 388: father_of_forefather = father_of_element->up;
389: forefather_of_element = added_element;
2.10 secret 390: first_time = YES;
1.1 timbl 391: do
392: {
2.10 secret 393: if (father_of_forefather->left
394: == forefather_of_element->up)
1.1 timbl 395: {
2.6 timbl 396: depth = father_of_forefather->left_depth;
2.10 secret 397: if (first_time)
398: {
399: father_of_forefather->left_depth = 1
400: + MAXIMUM(forefather_of_element->left_depth,
401: forefather_of_element->right_depth);
402: first_time = NO;
403: }
404: else
405: father_of_forefather->left_depth = 1
406: + MAXIMUM(forefather_of_element->up->left_depth,
407: forefather_of_element->up->right_depth);
408: depth2 = father_of_forefather->left_depth;
1.1 timbl 409: }
410: else
411: {
2.6 timbl 412: depth = father_of_forefather->right_depth;
2.10 secret 413: if (first_time)
414: {
415: father_of_forefather->right_depth = 1
416: + MAXIMUM(forefather_of_element->left_depth,
417: forefather_of_element->right_depth);
418: first_time = NO;
419: }
420: else
421: father_of_forefather->right_depth = 1
422: + MAXIMUM(forefather_of_element->up->left_depth,
423: forefather_of_element->up->right_depth);
2.6 timbl 424: depth2 = father_of_forefather->right_depth;
1.1 timbl 425: }
2.6 timbl 426: father_of_forefather = father_of_forefather->up;
2.10 secret 427: forefather_of_element = forefather_of_element->up;
2.7 secret 428: } while ((depth != depth2) &&
429: (father_of_forefather != NULL));
2.6 timbl 430: father_of_forefather = father_of_element->up;
431: if (father_of_forefather->left == father_of_element)
1.1 timbl 432: {
433: /*
434: ** 3 3
435: ** 4 6
436: ** When tree 5 6 becomes 4 8
437: ** 7 8 5 7
438: **
439: ** 3 is used to show that it may not be the top of the
440: ** tree.
441: */
2.6 timbl 442: father_of_forefather->left = added_element;
443: father_of_element->right = added_element->left;
444: added_element->left = father_of_element;
1.1 timbl 445: }
2.6 timbl 446: if (father_of_forefather->right == father_of_element)
1.1 timbl 447: {
448: /*
449: ** 3 3
450: ** 4 6
451: ** When tree 5 6 becomes 4 8
452: ** 7 8 5 7
453: **
454: ** 3 is used to show that it may not be the top of the
455: ** tree
456: */
2.6 timbl 457: father_of_forefather->right = added_element;
458: father_of_element->right = added_element->left;
459: added_element->left = father_of_element;
1.1 timbl 460: }
2.6 timbl 461: added_element->up = father_of_forefather;
1.1 timbl 462: }
463: else
464: {
465: /*
466: **
467: ** 1 3
468: ** When tree 2 3 becomes 1 5
469: ** 4 5 2 4
470: **
471: ** 1 is used to show that it is the top of the tree.
472: */
2.6 timbl 473: added_element->up = NULL;
474: father_of_element->right = added_element->left;
475: added_element->left = father_of_element;
1.1 timbl 476: }
2.6 timbl 477: father_of_element->up = added_element;
2.8 secret 478: if (father_of_element->right != NULL)
479: father_of_element->right->up = father_of_element;
1.1 timbl 480: }
481: }
482: }
2.6 timbl 483: while (father_of_element->up != NULL)
1.1 timbl 484: {
2.6 timbl 485: father_of_element = father_of_element->up;
1.1 timbl 486: }
2.6 timbl 487: tree->top = father_of_element;
1.1 timbl 488: }
489: }
490:
491:
492:
493: PUBLIC HTBTElement * HTBTree_next ARGS2(
494: HTBTree*, tree,
495: HTBTElement*, ele)
496: /**************************************************************************
497: ** this function returns a pointer to the leftmost element if ele is NULL,
498: ** and to the next object to the right otherways.
499: ** If no elements left, returns a pointer to NULL.
500: */
501: {
2.6 timbl 502: HTBTElement * father_of_element;
503: HTBTElement * father_of_forefather;
1.1 timbl 504:
505: if (ele == NULL)
506: {
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.6 timbl 514: father_of_element = ele;
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.6 timbl 533: #ifdef BTREE_TRACE
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.7 secret 539: printf("\nObject = %s\t",(char *)father_of_element->object);
2.6 timbl 540: if (father_of_element->up != NULL)
2.7 secret 541: printf("Objet du pere = %s\n",
542: (char *)father_of_element->up->object);
2.6 timbl 543: else printf("Pas de Pere\n");
544: if (father_of_element->left != NULL)
2.7 secret 545: printf("Objet du fils gauche = %s\t",
546: (char *)father_of_element->left->object);
2.6 timbl 547: else printf("Pas de fils gauche\t");
548: if (father_of_element->right != NULL)
2.7 secret 549: printf("Objet du fils droit = %s\n",
550: (char *)father_of_element->right->object);
2.6 timbl 551: else printf("Pas de fils droit\n");
552: printf("Profondeur gauche = %i\t",father_of_element->left_depth);
553: printf("Profondeur droite = %i\n",father_of_element->right_depth);
554: printf(" **************\n");
555: }
556: #endif
557: return father_of_element;
1.1 timbl 558: }
559:
560:
561: #ifdef TEST
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.6 timbl 704: #ifdef BTREE_TRACE
705: printf("\nTreeTopObject=%s\n\n",tree->top->object);
706: #endif
707: next_element = HTBTree_next(tree,NULL);
708: while (next_element != NULL)
1.1 timbl 709: {
2.6 timbl 710: #ifndef BTREE_TRACE
711: printf("The next element is %s\n",next_element->object);
712: #endif
713: next_element = HTBTree_next(tree,next_element);
1.1 timbl 714: }
715: HTBTree_free (tree);
716: }
717:
718:
719: #endif
Webmaster