#include "tstring.h"
|
|
#include "string.h"
|
|
#include "stdlib.h"
|
|
#include "stdio.h"
|
|
|
|
void generator(
|
|
tstring* header_filename,
|
|
tstring* prefix,
|
|
tstring* bucket_count,
|
|
tstring* K_size, tstring* K_comp_pred, tstring* K_hash_func,
|
|
tstring* V_size
|
|
) {
|
|
tstring* key_type = tstring_n_compose("tc",
|
|
prefix, "_key_t"
|
|
);
|
|
tstring* key_type_decl = tstring_n_compose("ctctc",
|
|
"struct ", key_type, "{\n"
|
|
"char* data[",K_size,"];\n"
|
|
"};\n"
|
|
);
|
|
tstring* value_type = tstring_n_compose("tc",
|
|
prefix, "_value_t"
|
|
);
|
|
tstring* value_type_decl = tstring_n_compose("ctctc",
|
|
"struct ", value_type, "{\n"
|
|
"char* data[",V_size,"];\n"
|
|
"};\n"
|
|
);
|
|
tstring* accessor_type = tstring_n_compose("tc",
|
|
prefix, "_accessor_t"
|
|
);
|
|
tstring* accessor_type_decl = tstring_n_compose("ctc",
|
|
"struct ", accessor_type, "{\n"
|
|
"void* value;\n"
|
|
"};\n"
|
|
);
|
|
tstring* hash_decl = tstring_n_compose("ctctctctc",
|
|
"size_t ",K_hash_func,"(void*);\n"
|
|
"struct ",prefix,"_hashtype{\n"
|
|
"size_t operator()(",key_type," key) {\n"
|
|
"return ", K_hash_func, "(key);\n"
|
|
"}\n"
|
|
"}\n"
|
|
);
|
|
tstring* hashmap_ptr_type = tstring_n_compose("tc",
|
|
prefix,"_hashmap_ptr"
|
|
);
|
|
tstring* hashmap_decl = tstring_n_compose("ctc",
|
|
"typedef void* ",hashmap_ptr_type,";\n"
|
|
);
|
|
tstring* create_hashmap_decl = tstring_n_compose("tctc",
|
|
hashmap_ptr_type," ",prefix,"_hm_create();\n"
|
|
);
|
|
tstring* destroy_hashmap_decl = tstring_n_compose("ctctc",
|
|
"void ", prefix, "_hm_destroy(",hashmap_ptr_type,");\n"
|
|
);
|
|
tstring* hashmap_push_decl = tstring_n_compose("ctctctc",
|
|
"void ", prefix, "_hm_push(",key_type,"* k, ",value_type,"* v);\n"
|
|
);
|
|
tstring* hashmap_get_decl = tstring_n_compose("tctctc",
|
|
accessor_type, " ", prefix, "_hm_get(",key_type,"* k);\n"
|
|
);
|
|
tstring* hashmap_endget_decl = tstring_n_compose("ctctc",
|
|
"void ", prefix, "_hm_endget(",accessor_type," acc);\n"
|
|
);
|
|
tstring* hashmap_remove_decl = tstring_n_compose("ctctc",
|
|
"void ", prefix, "_hm_remove(",key_type,"* k);\n"
|
|
);
|
|
tstring* top_guard = tstring_n_compose("ctctc",
|
|
"#ifndef GUARD_", prefix,
|
|
"\n#define GUARD_", prefix,"\n\n"
|
|
);
|
|
tstring* bottom_guard = tstring_n_compose("ctc",
|
|
"\n#endif // GUARD_", prefix, "\n"
|
|
);
|
|
FILE* header;
|
|
if(
|
|
!(header = fopen(header_filename->data, "w"))
|
|
) {
|
|
char* m = header_filename->data;
|
|
fprintf(stderr, "Couldn't open header file: %s\n", header_filename->data);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
if(
|
|
tstring_n_write(
|
|
header,12,
|
|
top_guard,
|
|
key_type_decl,
|
|
value_type_decl,
|
|
accessor_type_decl,
|
|
hashmap_decl,
|
|
create_hashmap_decl,
|
|
destroy_hashmap_decl,
|
|
hashmap_get_decl,
|
|
hashmap_endget_decl,
|
|
hashmap_push_decl,
|
|
hashmap_remove_decl,
|
|
bottom_guard
|
|
) != 0
|
|
) {
|
|
fprintf(stderr, "Couldn't generate header file: error writing to file: %s\n", header_filename->data);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
}
|