#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NHASH 30
#define MULTIPLER 31
#define CREATE 1
typedef struct Nameval Nameval;
struct Nameval {
char *name;
int value;
Nameval *next;
};
Nameval *symtab[NHASH];
unsigned int hash(char *str)
{
unsigned int h;
unsigned char *p;
h = 0;
for (p = (unsigned char *) str; *p != '\0'; p++)
h = MULTIPLER * h + *p;
return h % NHASH;
}
Nameval* lookup(char *name, int create, int value)
{
int h;
Nameval *sym;
char *n_name;
h = hash(name);
for (sym = symtab[h]; sym != NULL; sym = sym->next)
if (strcmp(name, sym->name) == 0)
return sym;
if (create) {
sym = (Nameval *) malloc(sizeof(Nameval));
if (sym == NULL) {
printf("メモリを確保できませんでした。\n");
exit(1);
}
n_name = malloc(strlen(name)+1);
if (n_name == NULL) {
printf("メモリを確保できませんでした。\n");
exit(1);
}
memcpy(n_name, name, strlen(name)+1);
sym->name = n_name;
sym->value = value;
sym->next = symtab[h];
symtab[h] = sym;
}
return sym;
}
int main()
{
char name[80];
int value, i;
Nameval* pnv;
FILE *fp;
if ((fp = fopen("file.csv", "r")) == NULL) exit(1);
while (fscanf(fp, "%[^,],%d\n", name, &value) != EOF) {
lookup(name, CREATE, value);
}
fclose(fp);
for (i = 0; i < NHASH; i++) {
printf("table[%d],", i);
for (pnv = symtab[i]; pnv != NULL; pnv = pnv->next)
printf("%s_%d,", pnv->name, pnv->value);
printf("NULL\n");
}
return 0;
}