int do_init(int argc, char** argv) { FILE *list; char line[1024]; struct map_data map; char name[MAP_NAME_LENGTH_EXT]; grf_list_file = aStrdup("conf/grf-files.txt"); map_list_file = aStrdup("db/map_index.txt"); /* setup pre-defined, #define-dependant */ map_cache_file = aStrdup("db/map_cache.dat"); cmdline->exec(argc, argv, CMDLINE_OPT_PREINIT); cmdline->exec(argc, argv, CMDLINE_OPT_NORMAL); ShowStatus("Initializing grfio with %s\n", grf_list_file); grfio_init(grf_list_file); // Attempt to open the map cache file and force rebuild if not found ShowStatus("Opening map cache: %s\n", map_cache_file); if(!rebuild) { map_cache_fp = fopen(map_cache_file, "rb"); if(map_cache_fp == NULL) { ShowNotice("Existing map cache not found, forcing rebuild mode\n"); rebuild = 1; } else fclose(map_cache_fp); } if(rebuild) map_cache_fp = fopen(map_cache_file, "w+b"); else map_cache_fp = fopen(map_cache_file, "r+b"); if(map_cache_fp == NULL) { ShowError("Failure when opening map cache file %s\n", map_cache_file); exit(EXIT_FAILURE); } // Open the map list ShowStatus("Opening map list: %s\n", map_list_file); list = fopen(map_list_file, "r"); if(list == NULL) { ShowError("Failure when opening maps list file %s\n", map_list_file); exit(EXIT_FAILURE); } // Initialize the main header if(rebuild) { header.file_size = sizeof(struct main_header); header.map_count = 0; } else { if(fread(&header, sizeof(struct main_header), 1, map_cache_fp) != 1){ printf("An error as occured while reading map_cache_fp \n"); } header.file_size = GetULong((unsigned char *)&(header.file_size)); header.map_count = GetUShort((unsigned char *)&(header.map_count)); } // Read and process the map list while(fgets(line, sizeof(line), list)) { if(line[0] == '/' && line[1] == '/') continue; if(sscanf(line, "%15s", name) < 1) continue; if(strcmp("map:", name) == 0 && sscanf(line, "%*s %15s", name) < 1) continue; name[MAP_NAME_LENGTH_EXT-1] = '\0'; remove_extension(name); if (find_map(name)) { ShowInfo("Map '"CL_WHITE"%s"CL_RESET"' already in cache.\n", name); } else if(!read_map(name, &map)) { ShowError("Map '"CL_WHITE"%s"CL_RESET"' not found!\n", name); } else if (!cache_map(name, &map)) { ShowError("Map '"CL_WHITE"%s"CL_RESET"' failed to cache (write error).\n", name); } else { ShowInfo("Map '"CL_WHITE"%s"CL_RESET"' successfully cached.\n", name); } } ShowStatus("Closing map list: %s\n", map_list_file); fclose(list); // Write the main header and close the map cache ShowStatus("Closing map cache: %s\n", map_cache_file); fseek(map_cache_fp, 0, SEEK_SET); fwrite(&header, sizeof(struct main_header), 1, map_cache_fp); fclose(map_cache_fp); ShowStatus("Finalizing grfio\n"); grfio_final(); ShowInfo("%d maps now in cache\n", header.map_count); aFree(grf_list_file); aFree(map_list_file); aFree(map_cache_file); return 0; }
int do_init(int argc, char** argv) { /* setup pre-defined, #define-dependant */ map_cache_file = std::string(db_path) + "/" + std::string(DBPATH) + "map_cache.dat"; // Process the command-line arguments process_args(argc, argv); ShowStatus("Initializing grfio with %s\n", grf_list_file.c_str()); grfio_init(grf_list_file.c_str()); // Attempt to open the map cache file and force rebuild if not found ShowStatus("Opening map cache: %s\n", map_cache_file.c_str()); if(!rebuild) { map_cache_fp = fopen(map_cache_file.c_str(), "rb"); if(map_cache_fp == NULL) { ShowNotice("Existing map cache not found, forcing rebuild mode\n"); rebuild = 1; } else fclose(map_cache_fp); } if(rebuild) map_cache_fp = fopen(map_cache_file.c_str(), "w+b"); else map_cache_fp = fopen(map_cache_file.c_str(), "r+b"); if(map_cache_fp == NULL) { ShowError("Failure when opening map cache file %s\n", map_cache_file.c_str()); exit(EXIT_FAILURE); } // Open the map list FILE *list; std::vector<std::string> directories = { std::string(db_path) + "/", std::string(db_path) + "/" + std::string(DBIMPORT) + "/" }; for (const auto &directory : directories) { std::string filename = directory + map_list_file; ShowStatus("Opening map list: %s\n", filename.c_str()); list = fopen(filename.c_str(), "r"); if (list == NULL) { ShowError("Failure when opening maps list file %s\n", filename.c_str()); exit(EXIT_FAILURE); } // Initialize the main header if (rebuild) { header.file_size = sizeof(struct main_header); header.map_count = 0; } else { if (fread(&header, sizeof(struct main_header), 1, map_cache_fp) != 1) { printf("An error as occured while reading map_cache_fp \n"); } header.file_size = GetULong((unsigned char *)&(header.file_size)); header.map_count = GetUShort((unsigned char *)&(header.map_count)); } // Read and process the map list char line[1024]; while (fgets(line, sizeof(line), list)) { if (line[0] == '/' && line[1] == '/') continue; char name[MAP_NAME_LENGTH_EXT]; if (sscanf(line, "%15s", name) < 1) continue; if (strcmp("map:", name) == 0 && sscanf(line, "%*s %15s", name) < 1) continue; struct map_data map; name[MAP_NAME_LENGTH_EXT - 1] = '\0'; remove_extension(name); if (find_map(name)) ShowInfo("Map '" CL_WHITE "%s" CL_RESET "' already in cache.\n", name); else if (read_map(name, &map)) { cache_map(name, &map); ShowInfo("Map '" CL_WHITE "%s" CL_RESET "' successfully cached.\n", name); } else ShowError("Map '" CL_WHITE "%s" CL_RESET "' not found!\n", name); } ShowStatus("Closing map list: %s\n", filename.c_str()); fclose(list); } // Write the main header and close the map cache ShowStatus("Closing map cache: %s\n", map_cache_file.c_str()); fseek(map_cache_fp, 0, SEEK_SET); fwrite(&header, sizeof(struct main_header), 1, map_cache_fp); fclose(map_cache_fp); ShowStatus("Finalizing grfio\n"); grfio_final(); ShowInfo("%d maps now in cache\n", header.map_count); return 0; }