Listing 5: The cross-reference table non-inline member function definitions, using strings

// table.cpp

#include <stdio.h>
#include <string>
#include <string.h>

#include "deep.h"
#include "table.h"
#include "sequence.h"

using std::string;

struct cross_reference_table::tree_node
    {
    tree_node(string const &w, unsigned n);
    string word;
    line_number_sequence lines;
    deep_pointer<tree_node> left, right;
    };

inline
cross_reference_table::
tree_node::tree_node(string const &w, unsigned n)
    : word(w), lines(n), left(NULL), right(NULL)
    {
    }

cross_reference_table::tree_node *
cross_reference_table::add_tree
(tree_node *t, string const &w, unsigned n)
    {
    if (t == NULL)
        t = new tree_node (w, n);
    else if (w < t->word)
        t->left = add_tree(t->left, w, n);
    else if (w > t->word)
        t->right = add_tree(t->right, w, n);
    else
        t->lines.add(n);
    return t;
    }

void
cross_reference_table::put_tree(tree_node const *t)
    {
    if (t != NULL)
        {
        put_tree(t->left);
        printf("%12s:", t->word.c_str());
        t->lines.put();
        printf("\n");
        put_tree(t->right);
        }
    }