+typedef struct
+{
+ u8 *name;
+ u8 *value;
+} name_sort_t;
+
+static int
+name_compare (void *a1, void *a2)
+{
+ name_sort_t *ns1 = a1;
+ name_sort_t *ns2 = a2;
+
+ return strcmp ((char *) ns1->name, (char *) ns2->name);
+}
+
+
+__clib_export u8 *
+format_clib_macro_main (u8 * s, va_list * args)
+{
+ clib_macro_main_t *mm = va_arg (*args, clib_macro_main_t *);
+ int evaluate = va_arg (*args, int);
+ hash_pair_t *p;
+ name_sort_t *nses = 0, *ns;
+ int i;
+
+ /* *INDENT-OFF* */
+ hash_foreach_pair (p, mm->the_value_table_hash,
+ ({
+ vec_add2 (nses, ns, 1);
+ ns->name = (u8 *)(p->key);
+ ns->value = (u8 *)(p->value[0]);
+ }));
+ /* *INDENT-ON* */
+
+ if (vec_len (nses) == 0)
+ return s;
+
+ vec_sort_with_function (nses, name_compare);
+
+ for (i = 0; i < vec_len (nses); i++)
+ {
+ s = format (s, "%-20s", nses[i].name);
+ if (evaluate == 0)
+ s = format (s, "%s\n", nses[i].value);
+ else
+ {
+ u8 *rv = (u8 *) clib_macro_eval_dollar (mm, (i8 *) nses[i].name,
+ 0 /* no complain */ );
+ s = format (s, "%s\n", rv);
+ vec_free (rv);
+ }
+ }
+ return s;
+}
+
+