lib: prepare table code for reuse by bgp_table

  * lib/table.[ch]

    - Add a macro (ROUTE_NODE_FIELDS) that expands to all the fields
      of a route_node structure.

    - Add the route_table_delegate_t structure, a function vector
      which allows clients to customize the behavior of one or more
      tables.

      The delegate currently contains the 'create_node' and
      'destroy_node' functions, and hence enables a table to use an
      alternative node structure. The alternative node is expected to
      embed the fields of a route_node using ROUTE_NODE_FIELDS.

    - Add route_table_init_with_delegate() to create a new table with
      a given delegate.

    - Make route_table_init() a thin wrapper around
      route_table_init_with_delegate(). The delegate it passes in
      simply creates/destroys route_node structures as before.

    - Add a user data pointer (info) to the route_table
      structure. This can be used by a client to keep per-table state.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/lib/table.h b/lib/table.h
index 1e8df46..4d3eddb 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -23,39 +23,87 @@
 #ifndef _ZEBRA_TABLE_H
 #define _ZEBRA_TABLE_H
 
+/*
+ * Forward declarations.
+ */
+struct route_node;
+struct route_table;
+
+/*
+ * route_table_delegate_t
+ *
+ * Function vector that can be used by a client to customize the
+ * behavior of one or more route tables.
+ */
+typedef struct route_table_delegate_t_ route_table_delegate_t;
+
+typedef struct route_node * (*route_table_create_node_func_t) 
+  (route_table_delegate_t *, struct route_table *);
+
+typedef void (*route_table_destroy_node_func_t) 
+  (route_table_delegate_t *, struct route_table *, struct route_node *);
+
+struct route_table_delegate_t_ 
+{
+  route_table_create_node_func_t create_node;
+  route_table_destroy_node_func_t destroy_node;
+};
+
 /* Routing table top structure. */
 struct route_table
 {
   struct route_node *top;
 
+  /*
+   * Delegate that performs certain functions for this table.
+   */
+  route_table_delegate_t *delegate;
+  
   unsigned long count;
+  
+  /*
+   * User data.
+   */
+  void *info;
 };
 
+/*
+ * Macro that defines all fields in a route node.
+ */
+#define ROUTE_NODE_FIELDS			\
+  /* Actual prefix of this radix. */		\
+  struct prefix p;				\
+						\
+  /* Tree link. */				\
+  struct route_table *table;			\
+  struct route_node *parent;			\
+  struct route_node *link[2];			\
+						\
+  /* Lock of this radix */			\
+  unsigned int lock;				\
+						\
+  /* Each node of route. */			\
+  void *info;					\
+						\
+  /* Aggregation. */				\
+  void *aggregate;
+
+
 /* Each routing entry. */
 struct route_node
 {
-  /* Actual prefix of this radix. */
-  struct prefix p;
+  ROUTE_NODE_FIELDS;
 
-  /* Tree link. */
-  struct route_table *table;
-  struct route_node *parent;
-  struct route_node *link[2];
 #define l_left   link[0]
 #define l_right  link[1]
-
-  /* Lock of this radix */
-  unsigned int lock;
-
-  /* Each node of route. */
-  void *info;
-
-  /* Aggregation. */
-  void *aggregate;
 };
 
 /* Prototypes. */
 extern struct route_table *route_table_init (void);
+
+extern struct route_table *
+route_table_init_with_delegate (route_table_delegate_t *);
+
 extern void route_table_finish (struct route_table *);
 extern void route_unlock_node (struct route_node *node);
 extern struct route_node *route_top (struct route_table *);