w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

mktable.c (2812B)


      1 /* $Id$ */
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include "myctype.h"
      5 #include "config.h"
      6 #include "hash.h"
      7 #include "myctype.h"
      8 #include "Str.h"
      9 #include <gc.h>
     10 
     11 /* *INDENT-OFF* */
     12 defhash(HashItem_ss *, int, hss_i)
     13 /* *INDENT-ON* */
     14 
     15 #define keycomp(x,y) ((x)==(y))
     16 
     17 /* XXX: we assume sizeof(unsigned long) >= sizeof(void *) */
     18 static unsigned long
     19 hashfunc(HashItem_ss * x)
     20 {
     21     return (unsigned long)x;
     22 }
     23 
     24 /* *INDENT-OFF* */
     25 defhashfunc(HashItem_ss *, int, hss_i)
     26 /* *INDENT-ON* */
     27 
     28 int
     29 main(int argc, char *argv[], char **envp)
     30 {
     31     FILE *f;
     32     Hash_ss *hash;
     33     HashItem_ss **hashitems, *hi;
     34     int size, n, i, j;
     35     Str s, name, fbase;
     36     char *p;
     37     Hash_hss_i *rhash;
     38 
     39     GC_INIT();
     40     if (argc != 3) {
     41 	fprintf(stderr, "usage: %s hashsize file.tab > file.c\n", argv[0]);
     42 	exit(1);
     43     }
     44     size = atoi(argv[1]);
     45     if (size <= 0) {
     46 	fprintf(stderr, "hash size should be positive\n");
     47 	exit(1);
     48     }
     49     if ((f = fopen(argv[2], "r")) == NULL) {
     50 	fprintf(stderr, "Can't open %s\n", argv[2]);
     51 	exit(1);
     52     }
     53     p = argv[2];
     54     if (strrchr(p, '/') != NULL)
     55 	p = strrchr(p, '/') + 1;
     56     fbase = Strnew_charp(p);
     57     if (strchr(fbase->ptr, '.'))
     58 	while (Strlastchar(fbase) != '.')
     59 	    Strshrink(fbase, 1);
     60     Strshrink(fbase, 1);
     61 
     62     hash = newHash_ss(size);
     63     printf("#include \"hash.h\"\n");
     64     for (;;) {
     65 	s = Strfgets(f);
     66 	if (s->length == 0)
     67 	    exit(0);
     68 	Strremovetrailingspaces(s);
     69 	if (Strcmp_charp(s, "%%") == 0)
     70 	    break;
     71 	puts(s->ptr);
     72     }
     73     n = 0;
     74     for (;;) {
     75 	s = Strfgets(f);
     76 	if (s->length == 0)
     77 	    break;
     78 	Strremovefirstspaces(s);
     79 	Strremovetrailingspaces(s);
     80 	name = Strnew();
     81 	for (p = s->ptr; *p; p++) {
     82 	    if (IS_SPACE(*p))
     83 		break;
     84 	    Strcat_char(name, *p);
     85 	}
     86 	while (*p && IS_SPACE(*p))
     87 	    p++;
     88 	putHash_ss(hash, name->ptr, p);
     89 	n++;
     90     }
     91     fclose(f);
     92 
     93     hashitems = (HashItem_ss **) GC_malloc(sizeof(HashItem_ss *) * n);
     94     rhash = newHash_hss_i(n * 2);
     95     j = 0;
     96     for (i = 0; i < hash->size; i++) {
     97 	for (hi = hash->tab[i]; hi != NULL; hi = hi->next) {
     98 	    hashitems[j] = hi;
     99 	    putHash_hss_i(rhash, hi, j);
    100 	    j++;
    101 	}
    102     }
    103     printf("static HashItem_si MyHashItem[] = {\n");
    104     for (i = 0; i < j; i++) {
    105 	printf("    /* %d */ {\"%s\", %s, ", i,
    106 	       hashitems[i]->key, hashitems[i]->value);
    107 	if (hashitems[i]->next == NULL) {
    108 	    printf("NULL},\n");
    109 	}
    110 	else {
    111 	    printf("&MyHashItem[%d]},\n",
    112 		   getHash_hss_i(rhash, hashitems[i]->next, -1));
    113 	}
    114     }
    115     printf("};\n\nstatic HashItem_si *MyHashItemTbl[] = {\n");
    116 
    117     for (i = 0; i < hash->size; i++) {
    118 	if (hash->tab[i])
    119 	    printf("    &MyHashItem[%d],\n",
    120 		   getHash_hss_i(rhash, hash->tab[i], -1));
    121 	else
    122 	    printf("    NULL,\n");
    123     }
    124     printf("};\n\n");
    125     printf("Hash_si %s = { %d, MyHashItemTbl };\n", fbase->ptr, hash->size);
    126 
    127     exit(0);
    128 }