summaryrefslogtreecommitdiff
path: root/packtab.c
diff options
context:
space:
mode:
authorbehdad <behdad>2002-05-18 17:51:07 +0000
committerbehdad <behdad>2002-05-18 17:51:07 +0000
commit421283dee65cf0799a3794e55660ebe6323bbb9d (patch)
tree5b1590788bda79fcd0d1ba7a2ccb2882f992e2fe /packtab.c
parent8bfd07490d3007bc7a6fec9856a293759d9993d5 (diff)
Packtab version 2.
Diffstat (limited to 'packtab.c')
-rw-r--r--packtab.c85
1 files changed, 41 insertions, 44 deletions
diff --git a/packtab.c b/packtab.c
index 2b8b22d..05f2e4f 100644
--- a/packtab.c
+++ b/packtab.c
@@ -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;