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