Steve,
This patch strips down the gen_tables.c to make the
preprocessor output slightly smaller.  This is not necessary for the
other two patches to work but I thought it would be best to remove unused
code.  
Thanks,
Clayton
Clayton Shotwell
Software Engineer
clshotwe@rockwellcollins.com
www.rockwellcollins.com
diff -urN a/lib/gen_tables.c b/lib/gen_tables.c
--- a/lib/gen_tables.c        2013-07-29
16:37:01.000000000 -0500
+++ b/lib/gen_tables.c        2013-08-19
10:09:03.060041420 -0500
@@ -54,19 +54,6 @@
 #define SHMGET          23
 #define SHMCTL          24
 
-
-/* The ratio of table size to number of non-empty
elements allowed for a
-   "direct" s2i table; if the ratio
would be bigger, bsearch tables are used
-   instead.
-
-   2 looks like a lot at a first glance, but
the bsearch tables need twice as
-   much space per element, so with the ratio
equal to 2 the direct table uses
-   no more memory and is faster. */
-#define DIRECT_THRESHOLD 2
-
-/* Allow more than one string defined for a single
integer value */
-static bool allow_duplicate_ints; /* = false; */
-
 struct value {
         int val;
         const char
*s;
@@ -83,335 +70,11 @@
 
 #define NUM_VALUES (sizeof(values) / sizeof(*values))
 
-/* Compare two "struct value" members by
name. */
-static int
-cmp_value_strings(const void *xa, const void *xb)
-{
-        const struct
value *a, *b;
-
-        a = xa;
-        b = xb;
-        return strcmp(a->s,
b->s);
-}
-
-/* Compare two "struct value" members by
value. */
-static int
-cmp_value_vals(const void *xa, const void *xb)
-{
-        const struct
value *a, *b;
-
-        a = xa;
-        b = xb;
-        if (a->val
> b->val)
-            
   return 1;
-        if (a->val
< b->val)
-            
   return -1;
-        /* Preserve the
original order if there is an ambiguity, to always use
-           the first
specified value. */
-        if (a->orig_index
> b->orig_index)
-            
   return 1;
-        if (a->orig_index
< b->orig_index)
-            
   return -1;
-        return 0;
-}
-
-/* Compare two "struct value" members by
orig_index. */
-static int
-cmp_value_orig_index(const void *xa, const void *xb)
-{
-        const struct
value *a, *b;
-
-        a = xa;
-        b = xb;
-        if (a->orig_index
> b->orig_index)
-            
   return 1;
-        if (a->orig_index
< b->orig_index)
-            
   return -1;
-        return 0;
-}
-
-/* Output the string table, initialize values[*]->s_offset.
*/
-static void
-output_strings(const char *prefix)
-{
-        size_t i, offset;
-
-        offset = 0;
-        for (i = 0; i
< NUM_VALUES; i++) {
-            
   values[i].s_offset = offset;
-            
   offset += strlen(values[i].s) + 1;
-        }
-        printf("static
const char %s_strings[] = \"", prefix);
-        assert(NUM_VALUES
> 0);
-        for (i = 0; i
< NUM_VALUES; i++) {
-            
   const char *c;
-
-            
   if (i != 0 && i % 10 == 0)
-            
           fputs("\"\n"
-            
               
 "\t\"", stdout);
-            
   for (c = values[i].s; *c != '\0'; c++) {
-            
           assert(*c != '"'
&& *c != '\\'
-            
               
  && isprint((unsigned char)*c));
-            
           putc(*c, stdout);
-            
   }
-            
   if (i != NUM_VALUES - 1)
-            
           fputs("\\0",
stdout);
-        }
-        fputs("\";\n",
stdout);
-}
-
-/* Output the string to integer mapping code.
-   Assume strings are all uppsercase or all
lowercase if specified by
-   parameters; in that case, make the search
case-insensitive.
-   values must be sorted by strings. */
-static void
-output_s2i(const char *prefix, bool uppercase, bool
lowercase)
-{
-        size_t i;
-
-        for (i = 0; i
< NUM_VALUES - 1; i++) {
-            
   assert(strcmp(values[i].s, values[i + 1].s) <=
0);
-            
   if (strcmp(values[i].s, values[i + 1].s) == 0) {
-            
           fprintf(stderr,
"Duplicate value `%s': %d, %d\n",
-            
               
   values[i].s, values[i].val, values[i + 1].val);
-            
           abort();
-            
   }
-        }
-        printf("static
const unsigned %s_s2i_s[] = {", prefix);
-        for (i = 0; i
< NUM_VALUES; i++) {
-            
   if (i % 10 == 0)
-            
           fputs("\n\t",
stdout);
-            
   assert(values[i].s_offset <= UINT_MAX);
-            
   printf("%zu,", values[i].s_offset);
-        }
-        printf("\n"
-            
  "};\n"
-            
  "static const int %s_s2i_i[] = {", prefix);
-        for (i = 0; i
< NUM_VALUES; i++) {
-            
   if (i % 10 == 0)
-            
           fputs("\n\t",
stdout);
-            
   printf("%d,", values[i].val);
-        }
-        fputs("\n"
-            
 "};\n", stdout);
-        assert(!(uppercase
&& lowercase));
-        if (uppercase)
{
-            
   for (i = 0; i < NUM_VALUES; i++) {
-            
           const char *c;
-
-            
           for (c = values[i].s;
*c != '\0'; c++)
-            
               
   assert(isascii((unsigned char)*c)
-            
               
          && !GT_ISLOWER(*c));
-            
   }
-        } else if (lowercase)
{
-            
   for (i = 0; i < NUM_VALUES; i++) {
-            
           const char *c;
-
-            
           for (c = values[i].s;
*c != '\0'; c++)
-            
               
   assert(isascii((unsigned char)*c)
-            
               
          && !GT_ISUPPER(*c));
-            
   }
-        }
-        if (uppercase
|| lowercase) {
-            
   printf("static int %s_s2i(const char *s, int
*value) {\n"
-            
          "\tsize_t len, i;\n"
-            
          "\tlen = strlen(s);\n"
-            
          "\t{ char copy[len + 1];\n"
-            
          "\tfor (i = 0; i < len;
i++) {\n"
-            
          "\t\tchar c = s[i];\n",
prefix);
-            
   if (uppercase)
-            
           fputs("\t\tcopy[i]
= GT_ISLOWER(c) ? c - 'a' + 'A' "
-            
               
               
             ":
c;\n", stdout);
-            
   else
-            
           fputs("\t\tcopy[i]
= GT_ISUPPER(c) ? c - 'A' + 'a' "
-            
               
               
             ":
c;\n", stdout);
-            
   printf("\t}\n"
-            
          "\tcopy[i] = 0;\n"
-            
          "\treturn s2i__(%s_strings,
%s_s2i_s, %s_s2i_i, %zu, "
-            
               
         "copy, value);\n"
-            
          "\t}\n"
-            
          "}\n", prefix, prefix,
prefix, NUM_VALUES);
-        } else
-            
   printf("static int %s_s2i(const char *s, int
*value) {\n"
-            
          "\treturn s2i__(%s_strings,
%s_s2i_s, %s_s2i_i, %zu, s, "
-            
               
         "value);\n"
-            
          "}\n", prefix, prefix,
prefix, prefix, NUM_VALUES);
-}
-
-/* Output the string to integer mapping table.
-   values must be sorted by strings. */
-static void
-output_i2s(const char *prefix)
-{
-        struct value
*unique_values;
-        int min_val,
max_val;
-        size_t i, n;
-
-        assert(NUM_VALUES
> 0);
-        for (i = 0; i
< NUM_VALUES - 1; i++) {
-            
   assert(values[i].val <= values[i + 1].val);
-            
   if (!allow_duplicate_ints
-            
       && values[i].val == values[i
+ 1].val) {
-            
           fprintf(stderr,
"Duplicate value %d: `%s', `%s'\n",
-            
               
   values[i].val, values[i].s, values[i + 1].s);
-            
           abort();
-            
   }
-        }
-
-        unique_values
= malloc(NUM_VALUES * sizeof(*unique_values));
-        assert(unique_values
!= NULL);
-        n = 0;
-        for (i = 0; i
< NUM_VALUES; i++) {
-            
   if (n == 0 || unique_values[n - 1].val != values[i].val)
{
-            
           unique_values[n]
= values[i];
-            
           n++;
-            
   }
-        }
-
-        min_val = unique_values[0].val;
-        max_val = unique_values[n
- 1].val;
-        if (((double)max_val
- (double)min_val) / n <= DIRECT_THRESHOLD) {
-            
   int next_index;
-
-            
   printf("static const unsigned %s_i2s_direct[]
= {", prefix);
-            
   next_index = min_val;
-            
   i = 0;
-            
   for (;;) {
-            
           if ((next_index
- min_val) % 10 == 0)
-            
               
   fputs("\n\t", stdout);
-            
           while (unique_values[i].val
< next_index)
-            
               
   /* This can happen if (allow_duplicate_ints) */
-            
               
   i++;
-            
           if (unique_values[i].val
== next_index) {
-            
               
   assert(unique_values[i].s_offset <= UINT_MAX);
-            
               
   printf("%zu,", unique_values[i].s_offset);
-            
           } else
-            
               
   fputs("-1u,", stdout);
-            
           if (next_index
== max_val)
-            
               
   /* Done like this to avoid integer overflow */
-            
               
   break;
-            
           next_index++;
-            
   }
-            
   printf("\n"
-            
          "};\n"
-            
          "static const char *%s_i2s(int
v) {\n"
-            
          "\treturn i2s_direct__(%s_strings,
%s_i2s_direct, %d, "
-            
               
               
"%d, v);\n"
-            
          "}\n", prefix, prefix,
prefix, min_val, max_val);
-        } else {
-            
   printf("static const int %s_i2s_i[] = {",
prefix);
-            
   for (i = 0; i < n; i++) {
-            
           if (i % 10 ==
0)
-            
               
   fputs("\n\t", stdout);
-            
           printf("%d,",
unique_values[i].val);
-            
   }
-            
   printf("\n"
-            
          "};\n"
-            
          "static const unsigned
%s_i2s_s[] = {", prefix);
-            
   for (i = 0; i < n; i++) {
-            
           if (i % 10 ==
0)
-            
               
   fputs("\n\t", stdout);
-            
           assert(unique_values[i].s_offset
<= UINT_MAX);
-            
           printf("%zu,",
unique_values[i].s_offset);
-            
   }
-            
   printf("\n"
-            
          "};\n"
-            
          "static const char *%s_i2s(int
v) {\n"
-            
          "\treturn i2s_bsearch__(%s_strings,
%s_i2s_i, %s_i2s_s, "
-            
               
 "%zu, v);\n"
-            
          "}\n", prefix, prefix,
prefix, prefix, n);
-        }
-        free(unique_values);
-}
-
-/* Output the string to integer mapping table as
a transtab[].
-   values must be sorted in the desired order.
*/
-static void
-output_i2s_transtab(const char *prefix)
-{
-        size_t i;
-        char *uc_prefix;
-
-        printf("static
const struct transtab %s_table[] = {", prefix);
-        for (i = 0; i
< NUM_VALUES; i++) {
-            
   if (i % 10 == 0)
-            
           fputs("\n\t",
stdout);
-            
   printf("{%d,%zu},", values[i].val, values[i].s_offset);
-        }
-        uc_prefix = strdup(prefix);
-        assert(uc_prefix
!= NULL);
-        for (i = 0; uc_prefix[i]
!= '\0'; i++)
-            
   uc_prefix[i] = toupper((unsigned char)uc_prefix[i]);
-        printf("\n"
-            
  "};\n"
-            
  "#define %s_NUM_ENTRIES "
-            
  "(sizeof(%s_table) / sizeof(*%s_table))\n", uc_prefix,
prefix,
-            
  prefix);
-        free(uc_prefix);
-}
-
 int
 main(int argc, char **argv)
 {
-        bool gen_i2s,
gen_i2s_transtab, gen_s2i, uppercase, lowercase;
-        char *prefix;
-        size_t i;
-
         /* This
is required by gen_tables.h */
         assert(NUM_VALUES
<= (SSIZE_MAX / 2 + 1));
 
-        /* To make sure
GT_ISUPPER and GT_ISLOWER work. */
-        assert('Z' ==
'A' + 25 && 'z' == 'a' + 25);
-        gen_i2s = false;
-        gen_i2s_transtab
= false;
-        gen_s2i = false;
-        uppercase = false;
-        lowercase = false;
-        prefix = NULL;
-        assert (argc
> 1);
-        for (i = 1; i
< (size_t)argc; i++) {
-            
   if (strcmp(argv[i], "--i2s") == 0)
-            
           gen_i2s = true;
-            
   else if (strcmp(argv[i], "--i2s-transtab")
== 0)
-            
           gen_i2s_transtab
= true;
-            
   else if (strcmp(argv[i], "--s2i") == 0)
-            
           gen_s2i = true;
-            
   else if (strcmp(argv[i], "--uppercase")
== 0)
-            
           uppercase = true;
-            
   else if (strcmp(argv[i], "--lowercase")
== 0)
-            
           lowercase = true;
-            
   else if (strcmp(argv[i], "--duplicate-ints")
== 0)
-            
           allow_duplicate_ints
= true;
-            
   else {
-            
           assert(*argv[i]
!= '-');
-            
           assert(prefix
== NULL);
-            
           prefix = argv[i];
-            
   }
-        }
-        assert(prefix
!= NULL);
-        assert(!(uppercase
&& lowercase));
-
-        printf("/*
This is a generated file, see Makefile.am for its "
-            
  "inputs. */\n");
-        for (i = 0; i
< NUM_VALUES; i++)
-            
   values[i].orig_index = i;
-        qsort(values,
NUM_VALUES, sizeof(*values), cmp_value_strings);
-        /* FIXME? if
(gen_s2i), sort the strings in some other order
-           (e.g.
"first 4 nodes in BFS of the bsearch tree first") to use the
-           cache
better. */
-        /* FIXME? If
the only thing generated is a transtab, keep the strings
-           in the
original order to use the cache better. */
-        output_strings(prefix);
-        if (gen_s2i)
-            
   output_s2i(prefix, uppercase, lowercase);
-        if (gen_i2s)
{
-            
   qsort(values, NUM_VALUES, sizeof(*values), cmp_value_vals);
-            
   output_i2s(prefix);
-        }
-        if (gen_i2s_transtab)
{
-            
   qsort(values, NUM_VALUES, sizeof(*values),
-            
         cmp_value_orig_index);
-            
   output_i2s_transtab(prefix);
-        }
         return EXIT_SUCCESS;
 }