diff options
author | behdad <behdad> | 2002-05-18 17:51:07 +0000 |
---|---|---|
committer | behdad <behdad> | 2002-05-18 17:51:07 +0000 |
commit | 421283dee65cf0799a3794e55660ebe6323bbb9d (patch) | |
tree | 5b1590788bda79fcd0d1ba7a2ccb2882f992e2fe /packtab.c | |
parent | 8bfd07490d3007bc7a6fec9856a293759d9993d5 (diff) |
Packtab version 2.
Diffstat (limited to 'packtab.c')
-rw-r--r-- | packtab.c | 85 |
1 files changed, 41 insertions, 44 deletions
@@ -22,14 +22,16 @@ /* 8 <= N <= 2^21 int key - 1 <= a, b, max_depth <= 21 + 1 <= max_depth <= 21 */ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include "packtab.h" + typedef int uni_table[1024 * 1024 * 2]; -static int n, a, b, max_depth, N, digits, tab_width, per_row; +static int n, a, max_depth, N, digits, tab_width, per_row; static uni_table temp, x, perm, *tab; static int pow[22], cluster, cmpcluster; static char **name, *key_type_name, *table_name, *macro_name; @@ -52,12 +54,12 @@ init (int *base) } static int -compare (const void *a, const void *b) +compare (const void *r, const void *s) { int i; for (i = 0; i < cmpcluster; i++) - if (((int *) a)[i] != ((int *) b)[i]) - return ((int *) a)[i] - ((int *) b)[i]; + if (((int *) r)[i] != ((int *) s)[i]) + return ((int *) r)[i] - ((int *) s)[i]; return 0; } @@ -66,7 +68,7 @@ static int best_lev, best_p[22], best_t[22], best_c[22], best_cluster[22], best_s; static void -found () +found (void) { int i; @@ -87,7 +89,8 @@ found () static void bt (int node_size) { - int i, j, k, y, sbak; + int i, j, k, y, sbak, key_bytes; + if (t[lev] == 1) { found (); @@ -140,8 +143,10 @@ bt (int node_size) return; } + key_bytes = k * cluster; + key_bytes = key_bytes <= 0xff ? 1 : key_bytes <= 0xffff ? 2 : 4; lev++; - bt (b); + bt (key_bytes); lev--; s = sbak; @@ -150,10 +155,10 @@ bt (int node_size) } static void -solve () +solve (void) { best_lev = max_depth + 2; - best_s = N * a + 2 * b; + best_s = N * a * 2; lev = 0; s = 0; nn = n; @@ -162,9 +167,11 @@ solve () } static void -write_array () +write_array (int max_key) { int i, j, k, y, ii, ofs; + char *key_type; + if (best_t[lev] == 1) return; @@ -206,25 +213,17 @@ write_array () if (x[ii] < x[i]) i = ii; - fprintf (f, "static const %s ", key_type_name); - for (j = 0; j < lev; j++) - fprintf (f, "*"); - fprintf (f, "%s", table_name); - /* if (best_t[lev + 1] != 1) */ - fprintf (f, "Level%d", best_lev - lev - 1); - fprintf (f, "[%d*%d] = {", cluster, k); + key_type = !lev ? key_type_name : + max_key <= 0xff ? "fribidi_uint8" : + max_key <= 0xffff ? "fribidi_uint16" : "fribidi_uint32"; + fprintf (f, "static const %s %sLevel%d[%d*%d] = {", key_type, table_name, + best_lev - lev - 1, cluster, k); ofs = 0; for (ii = 0; ii < k; ii++) { int kk, jj; - fprintf (f, "\n\n#define %s", table_name); - if (best_t[lev + 1] != 1) - { - fprintf (f, "Level%d_%0*X", best_lev - lev - 1, digits, - x[i] * pow[n - nn]); - } - fprintf (f, " (%sLevel%d + 0x%0X)\n", table_name, best_lev - lev - 1, - ofs); + fprintf (f, "\n\n#define %sLevel%d_%0*X 0x%0X\n", table_name, + best_lev - lev - 1, digits, x[i] * pow[n - nn], ofs); kk = x[i] * cluster; if (!lev) if (name) @@ -258,12 +257,12 @@ write_array () } fprintf (f, "\n};\n\n"); lev++; - write_array (f); + write_array (cluster * k); lev--; } static void -write_source () +write_source (void) { int i, j; @@ -272,23 +271,22 @@ write_source () nn = n; t[0] = N; fprintf (f, "\n*/\n\n" "/* *INDENT-OFF* */\n\n"); - write_array (f); + write_array (0); fprintf (f, "/* *INDENT-ON* */\n\n"); - fprintf (f, "#define %s(x) \\\n" " %s", macro_name, table_name); + fprintf (f, "#define %s(x)", macro_name); j = 1; - for (i = 0; i < best_lev; i++) - j *= best_cluster[i]; - for (i = 0; i < best_lev; i++) + for (i = best_lev - 1; i >= 0; i--) { - j /= best_cluster[best_lev - 1 - i]; - fprintf (f, "[(x)"); - if (i < best_lev - 1) + fprintf (f, "\t\\\n\t%sLevel%d[(x)", table_name, i); + if (j != 1) fprintf (f, "/%d", j); if (i) - fprintf (f, "%%%d", pow[best_p[best_lev - 1 - i]]); - fprintf (f, "]"); + fprintf (f, "%%%d +", pow[best_p[best_lev - 1 - i]]); + j *= best_cluster[best_lev - 1 - i]; } + for (i = 0; i < best_lev; i++) + fprintf (f, "]"); fprintf (f, "\n\n"); } @@ -297,14 +295,14 @@ write_out () { int i; fprintf (f, "/*\n" - " Automatically generated by packtab.c\n\n" + " Automatically generated by packtab.c version %d\n\n" " just use %s(key)\n\n" - " assumed sizeof(pointer) == %d\n" " assumed sizeof(%s) == %d\n" " required memory: %d\n" " lookups: %d\n" - " partition shape: %s", macro_name, b, key_type_name, a, best_s, - best_lev, table_name); + " partition shape: %s", + packtab_version, macro_name, key_type_name, a, best_s, best_lev, + table_name); for (i = best_lev - 1; i >= 0; i--) fprintf (f, "[%d]", best_cluster[i]); fprintf (f, "\n" " different table entries:"); @@ -314,14 +312,13 @@ write_out () } int -pack_table (int *base, int key_num, int key_size, int ptr_size, +pack_table (int *base, int key_num, int key_size, int p_max_depth, int p_tab_width, char **p_name, char *p_key_type_name, char *p_table_name, char *p_macro_name, FILE * out) { N = key_num; a = key_size; - b = ptr_size; max_depth = p_max_depth; tab_width = p_tab_width; name = p_name; |