From 86930ce270817e1b851379ff555d3bd5de58fbcf Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 13 Feb 2023 18:19:02 +0100 Subject: [PATCH] - Afegides classes per a accedir als packs --- .gitignore | 3 +- jfile.cpp | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++ jfile.h | 18 +++++ 3 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 jfile.cpp create mode 100644 jfile.h diff --git a/.gitignore b/.gitignore index a142d76..724fee8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ data/* *.opensdf *.user *.dll -.DS_Store \ No newline at end of file +.DS_Store +*.exe \ No newline at end of file diff --git a/jfile.cpp b/jfile.cpp new file mode 100644 index 0000000..588ce78 --- /dev/null +++ b/jfile.cpp @@ -0,0 +1,229 @@ +#include +#include +#include +#include +#include "jfile.h" +#include +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#endif + +#define DEFAULT_FILENAME "data.jf2" +#define DEFAULT_FOLDER "data/" +#define CONFIG_FILENAME "config.txt" + +struct file_t +{ + std::string path; + uint32_t size; + uint32_t offset; +}; + +std::vector toc; + +/* El std::map me fa coses rares, vaig a usar un good old std::vector amb una estructura key,value propia i au, que sempre funciona */ +struct keyvalue_t { + std::string key, value; +}; + +char *resource_filename = NULL; +char *resource_folder = NULL; +int file_source = SOURCE_FILE; +char scratch[255]; +static std::string config_folder; +std::vector config; + +void file_setresourcefilename(const char *str) { + if (resource_filename != NULL) free(resource_filename); + resource_filename = (char*)malloc(strlen(str)+1); + strcpy(resource_filename, str); +} + +void file_setresourcefolder(const char *str) { + if (resource_folder != NULL) free(resource_folder); + resource_folder = (char*)malloc(strlen(str)+1); + strcpy(resource_folder, str); +} + +void file_setsource(const int src) { + file_source = src%2; // mod 2 so it always is a valid value, 0 (file) or 1 (folder) + if (src==SOURCE_FOLDER && resource_folder==NULL) file_setresourcefolder(DEFAULT_FOLDER); +} + +bool file_getdictionary() { + if (resource_filename == NULL) file_setresourcefilename(DEFAULT_FILENAME); + + std::ifstream fi (resource_filename, std::ios::binary); + if (!fi.is_open()) return false; + char header[4]; + fi.read(header, 4); + uint32_t num_files, toc_offset; + fi.read((char*)&num_files, 4); + fi.read((char*)&toc_offset, 4); + fi.seekg(toc_offset); + + for (int i=0; ipw_dir; + config_folder = std::string(homedir) + "/Library/Application Support/" + foldername; +#elif __linux__ + struct passwd *pw = getpwuid(getuid()); + const char *homedir = pw->pw_dir; + config_folder = std::string(homedir) + "/." + foldername; +#endif + + struct stat st = {0}; + if (stat(config_folder.c_str(), &st) == -1) + { +#ifdef _WIN32 + int ret = mkdir(config_folder.c_str()); +#else + int ret = mkdir(config_folder.c_str(), S_IRWXU); +#endif + + if (ret == -1) + { + printf("ERROR CREATING CONFIG FOLDER."); + exit(EXIT_FAILURE); + } + } +} + +const char *file_getconfigfolder() { + std::string folder = config_folder + "/"; + return folder.c_str(); +} + +void file_loadconfigvalues() { + config.clear(); + std::string config_file = config_folder + "/config.txt"; + FILE *f = fopen(config_file.c_str(), "r"); + if (!f) return; + + char line[1024]; + while (fgets(line, sizeof(line), f)) { + char *value = strchr(line, '='); + if (value) { + *value='\0'; value++; + value[strlen(value)-1] = '\0'; + config.push_back({line, value}); + } + } + fclose(f); +} + +void file_saveconfigvalues() { + std::string config_file = config_folder + "/config.txt"; + FILE *f = fopen(config_file.c_str(), "w"); + if (f) { + for (auto pair : config) { + fprintf(f, "%s=%s\n", pair.key.c_str(), pair.value.c_str()); + } + fclose(f); + } +} + +const char* file_getconfigvalue(const char *key) { + if (config.empty()) file_loadconfigvalues(); + for (auto pair : config) { + if (pair.key == std::string(key)) { + strcpy(scratch, pair.value.c_str()); + return scratch; + } + } + return NULL; +} + +void file_setconfigvalue(const char* key, const char* value) { + if (config.empty()) file_loadconfigvalues(); + for (auto &pair : config) { + if (pair.key == std::string(key)) { + pair.value = value; + file_saveconfigvalues(); + return; + } + } + config.push_back({key, value}); + file_saveconfigvalues(); + return; +} diff --git a/jfile.h b/jfile.h new file mode 100644 index 0000000..560d602 --- /dev/null +++ b/jfile.h @@ -0,0 +1,18 @@ +#pragma once +#include + +#define SOURCE_FILE 0 +#define SOURCE_FOLDER 1 + +void file_setconfigfolder(const char *foldername); +const char *file_getconfigfolder(); + +void file_setresourcefilename(const char *str); +void file_setresourcefolder(const char *str); +void file_setsource(const int src); + +FILE *file_getfilepointer(const char *resourcename, int& filesize, const bool binary=false); +char *file_getfilebuffer(const char *resourcename, int& filesize); + +const char* file_getconfigvalue(const char *key); +void file_setconfigvalue(const char* key, const char* value);