static int create_db(lua_State *L) { int rv; RFILE *dst; const char *db_file = luaL_checkstring(L, -2); if (!lua_isfunction(L, -1)) { lua_pushstring(L, "second argument must be a function"); lua_error(L); } lua_setfield(L, LUA_REGISTRYINDEX, "testlib_get_value"); dst = retro_fopen(db_file, RFILE_MODE_WRITE, -1); if (!dst) { lua_pushstring(L, "Could not open destination file"); lua_error(L); } rv = libretrodb_create(dst, &value_provider, L); retro_fclose(dst); return 0; }
int main(int argc, char** argv) { const char* rdb_path; dat_converter_match_key_t* match_key = NULL; RFILE* rdb_file; if (argc < 2) { printf("usage:\n%s <db file> [args ...]\n", *argv); dat_converter_exit(1); } argc--; argv++; rdb_path = *argv; argc--; argv++; if (argc > 1 &&** argv) { match_key = dat_converter_match_key_create(*argv); argc--; argv++; } int dat_count = argc; char** dat_buffers = (char**) malloc(dat_count * sizeof(*dat_buffers)); char** dat_buffer = dat_buffers; dat_converter_list_t* dat_parser_list = NULL; while (argc) { size_t dat_file_size; dat_converter_list_t* dat_lexer_list = NULL; FILE* dat_file = fopen(*argv, "r"); if (!dat_file) { printf("could not open dat file '%s': %s\n", *argv, strerror(errno)); dat_converter_exit(1); } fseek(dat_file, 0, SEEK_END); dat_file_size = ftell(dat_file); fseek(dat_file, 0, SEEK_SET); *dat_buffer = (char*)malloc(dat_file_size + 1); fread(*dat_buffer, 1, dat_file_size, dat_file); fclose(dat_file); (*dat_buffer)[dat_file_size] = '\0'; printf("Parsing dat file '%s'...\n", *argv); dat_lexer_list = dat_converter_lexer(*dat_buffer, *argv); dat_parser_list = dat_converter_parser( dat_parser_list, dat_lexer_list, match_key); dat_converter_list_free(dat_lexer_list); argc--; argv++; dat_buffer++; } rdb_file = filestream_open(rdb_path, RETRO_VFS_FILE_ACCESS_WRITE, RETRO_VFS_FILE_ACCESS_HINT_NONE); if (!rdb_file) { printf( "Could not open destination file '%s': %s\n", rdb_path, strerror(errno) ); dat_converter_exit(1); } dat_converter_list_item_t* current_item = &dat_parser_list->values[dat_parser_list->count]; dat_converter_value_provider_init(); libretrodb_create(rdb_file, (libretrodb_value_provider)&dat_converter_value_provider, ¤t_item); dat_converter_value_provider_free(); filestream_close(rdb_file); dat_converter_list_free(dat_parser_list); while (dat_count--) free(dat_buffers[dat_count]); free(dat_buffers); dat_converter_match_key_free(match_key); return 0; }