diff options
Diffstat (limited to 'mktable.c')
-rw-r--r-- | mktable.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/mktable.c b/mktable.c new file mode 100644 index 0000000..a90b52a --- /dev/null +++ b/mktable.c @@ -0,0 +1,127 @@ +/* $Id: mktable.c,v 1.14 2003/09/22 21:02:20 ukai Exp $ */ +#include <stdio.h> +#include <stdlib.h> +#include "myctype.h" +#include "config.h" +#include "hash.h" +#include "myctype.h" +#include "Str.h" +#include <gc.h> + +/* *INDENT-OFF* */ +defhash(HashItem_ss *, int, hss_i) +/* *INDENT-ON* */ + +#define keycomp(x,y) ((x)==(y)) + +/* XXX: we assume sizeof(unsigned long) >= sizeof(void *) */ +static unsigned long +hashfunc(HashItem_ss * x) +{ + return (unsigned long)x; +} + +/* *INDENT-OFF* */ +defhashfunc(HashItem_ss *, int, hss_i) +/* *INDENT-ON* */ + +int +main(int argc, char *argv[], char **envp) +{ + FILE *f; + Hash_ss *hash; + HashItem_ss **hashitems, *hi; + int size, n, i, j; + Str s, name, fbase; + char *p; + Hash_hss_i *rhash; + + if (argc != 3) { + fprintf(stderr, "usage: %s hashsize file.tab > file.c\n", argv[0]); + exit(1); + } + size = atoi(argv[1]); + if (size <= 0) { + fprintf(stderr, "hash size should be positive\n"); + exit(1); + } + if ((f = fopen(argv[2], "r")) == NULL) { + fprintf(stderr, "Can't open %s\n", argv[2]); + exit(1); + } + p = argv[2]; + if (strrchr(p, '/') != NULL) + p = strrchr(p, '/') + 1; + fbase = Strnew_charp(p); + if (strchr(fbase->ptr, '.')) + while (Strlastchar(fbase) != '.') + Strshrink(fbase, 1); + Strshrink(fbase, 1); + + hash = newHash_ss(size); + printf("#include \"hash.h\"\n"); + for (;;) { + s = Strfgets(f); + if (s->length == 0) + exit(0); + Strremovetrailingspaces(s); + if (Strcmp_charp(s, "%%") == 0) + break; + puts(s->ptr); + } + n = 0; + for (;;) { + s = Strfgets(f); + if (s->length == 0) + break; + Strremovefirstspaces(s); + Strremovetrailingspaces(s); + name = Strnew(); + for (p = s->ptr; *p; p++) { + if (IS_SPACE(*p)) + break; + Strcat_char(name, *p); + } + while (*p && IS_SPACE(*p)) + p++; + putHash_ss(hash, name->ptr, p); + n++; + } + fclose(f); + + hashitems = (HashItem_ss **) GC_malloc(sizeof(HashItem_ss *) * n); + rhash = newHash_hss_i(n * 2); + j = 0; + for (i = 0; i < hash->size; i++) { + for (hi = hash->tab[i]; hi != NULL; hi = hi->next) { + hashitems[j] = hi; + putHash_hss_i(rhash, hi, j); + j++; + } + } + printf("static HashItem_si MyHashItem[] = {\n"); + for (i = 0; i < j; i++) { + printf(" /* %d */ {\"%s\",%s,", i, + hashitems[i]->key, hashitems[i]->value); + if (hashitems[i]->next == NULL) { + printf("NULL},\n"); + } + else { + printf("&MyHashItem[%d]},\n", + getHash_hss_i(rhash, hashitems[i]->next, -1)); + } + } + printf("};\n\nstatic HashItem_si *MyHashItemTbl[] = {\n"); + + for (i = 0; i < hash->size; i++) { + if (hash->tab[i]) + printf(" &MyHashItem[%d],\n", + getHash_hss_i(rhash, hash->tab[i], -1)); + else + printf(" NULL,\n"); + } + printf("};\n\n"); + printf("Hash_si %s = {%d, MyHashItemTbl};\n", fbase->ptr, hash->size); + + exit(0); +} |