From 25823b36905a84d92f9299ba7f9f0c713141c8fb Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Mon, 18 Feb 2013 19:20:35 -0800 Subject: Strictify map cells Also fix a small but major bug in map_randfreecell. --- src/common/grfio.cpp | 226 -------------------------------------------------- src/common/grfio.hpp | 26 ------ src/common/utils2.hpp | 19 +++++ 3 files changed, 19 insertions(+), 252 deletions(-) delete mode 100644 src/common/grfio.cpp delete mode 100644 src/common/grfio.hpp (limited to 'src/common') diff --git a/src/common/grfio.cpp b/src/common/grfio.cpp deleted file mode 100644 index 1ed5c3e..0000000 --- a/src/common/grfio.cpp +++ /dev/null @@ -1,226 +0,0 @@ -// Reads .gat files by name-mapping .wlk files -#include "grfio.hpp" - -#include - -#include -#include - -#include "cxxstdio.hpp" -#include "socket.hpp" -#include "utils.hpp" - -#include "../poison.hpp" - -//---------------------------- -// file entry table struct -//---------------------------- -typedef struct -{ - size_t declen; - int16_t next; // next index into the filelist[] array, or -1 - char fn[128 - 4 - 2]; // file name -} FILELIST; - -#define FILELIST_LIMIT 32768 // limit to number of filelists - if you increase this, change all shorts to int -#define FILELIST_ADDS 1024 // amount to increment when reallocing - -static -FILELIST *filelist = NULL; -/// Number of entries used -static -uint16_t filelist_entrys = 0; -/// Number of FILELIST entries actually allocated -static -uint16_t filelist_maxentry = 0; - -/// First index of the given hash, into the filelist[] array -#define l -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -static -int16_t filelist_hash[256] = {l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l}; -#undef l - -/// Hash a filename -static -uint8_t filehash(const char *fname) -{ - // Larger than the return type - upper bits are used in the process - uint32_t hash = 0; - while (*fname) - { - hash = (hash << 1) + (hash >> 7) * 9 + (unsigned char)*fname; - fname++; - } - return hash; -} - -/// Find the filelist entry for the given filename, or NULL if it is not -static -FILELIST *filelist_find(const char *fname) -{ - int16_t index = filelist_hash[filehash(fname)]; - while (index >= 0) - { - if (strcmp(filelist[index].fn, fname) == 0) - return &filelist[index]; - index = filelist[index].next; - } - return NULL; -} - -/// Copy a temporary entry into the hash map -static -FILELIST *filelist_add(FILELIST * entry) -{ - if (filelist_entrys >= FILELIST_LIMIT) - { - FPRINTF(stderr, "filelist limit : filelist_add\n"); - exit(1); - } - - if (filelist_entrys >= filelist_maxentry) - { - RECREATE(filelist, FILELIST, filelist_maxentry + FILELIST_ADDS); - memset(filelist + filelist_maxentry, '\0', - FILELIST_ADDS * sizeof(FILELIST)); - filelist_maxentry += FILELIST_ADDS; - } - - uint16_t new_index = filelist_entrys++; - uint8_t hash = filehash(entry->fn); - entry->next = filelist_hash[hash]; - filelist_hash[hash] = new_index; - - filelist[new_index] = *entry; - - return &filelist[new_index]; -} - -static -FILELIST *filelist_modify(FILELIST * entry) -{ - FILELIST *fentry = filelist_find(entry->fn); - if (fentry) - { - entry->next = fentry->next; - *fentry = *entry; - return fentry; - } - return filelist_add(entry); -} - -/// Change fname data/*.gat to lfname data/*.wlk -// TODO even if the file exists, don't keep reopening it every time one loads -static -void grfio_resnametable(const char *fname, char *lfname) -{ - char restable[] = "data/resnametable.txt"; - - FILE *fp = fopen_(restable, "rb"); - if (fp == NULL) - { - FPRINTF(stderr, "No resnametable, can't look for %s\n", fname); - strcpy(lfname, fname); - char* ext = lfname + strlen(lfname) - 4; - if (!strcmp(ext, ".gat")) - strcpy(ext, ".wlk"); - return; - } - - char line[512]; - while (fgets(line, sizeof(line), fp)) - { - char w1[256], w2[256]; - if ( - // line is of the form foo.gat#foo.wlk# - (sscanf(line, "%[^#]#%[^#]#", w1, w2) == 2) - // strip data/ from foo.gat before comparing - && (!strcmp(w1, fname + 5))) - { - strcpy(lfname, "data/"); - strcpy(lfname + 5, w2); - fclose_(fp); - return; - } - } - FPRINTF(stderr, "Unable to find resource: %s\n", fname); - fclose_(fp); - - strcpy(lfname, fname); - char* ext = lfname + strlen(lfname) - 4; - if (!strcmp(ext, ".gat")) - strcpy(ext, ".wlk"); - return; -} - -/// Size of resource -size_t grfio_size(const char *fname) -{ - FILELIST *entry = filelist_find(fname); - if (entry) - return entry->declen; - - char lfname[256]; - FILELIST lentry; - struct stat st; - - grfio_resnametable(fname, lfname); - - for (char *p = lfname; *p; p++) - if (*p == '\\') - *p = '/'; - - if (stat(lfname, &st) == 0) - { - strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1); - lentry.declen = st.st_size; - entry = filelist_modify(&lentry); - } - else - { - PRINTF("%s not found\n", fname); - return 0; - } - return entry->declen; -} - -void *grfio_reads(const char *fname, size_t *size) -{ - char lfname[256]; - grfio_resnametable(fname, lfname); - - for (char *p = &lfname[0]; *p != 0; p++) - if (*p == '\\') - *p = '/'; // * At the time of Unix - - FILE *in = fopen_(lfname, "rb"); - if (!in) - { - FPRINTF(stderr, "%s not found\n", fname); - return NULL; - } - FILELIST lentry; - FILELIST *entry = filelist_find(fname); - if (entry) - { - lentry.declen = entry->declen; - } - else - { - fseek(in, 0, SEEK_END); - lentry.declen = ftell(in); - fseek(in, 0, SEEK_SET); - strncpy(lentry.fn, fname, sizeof(lentry.fn) - 1); - entry = filelist_modify(&lentry); - } - uint8_t *buf2; - CREATE(buf2, uint8_t, lentry.declen + 1024); - if (fread(buf2, 1, lentry.declen, in) != lentry.declen) - exit(1); - fclose_(in); - in = NULL; - - if (size) - *size = entry->declen; - return buf2; -} diff --git a/src/common/grfio.hpp b/src/common/grfio.hpp deleted file mode 100644 index 7707b2b..0000000 --- a/src/common/grfio.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef GRFIO_HPP -#define GRFIO_HPP - -# include "sanity.hpp" - -/// Accessor to the .gat map virtual files -// Note .gat files are mapped to .wlk files by data/resnametable.txt -// Note that there currently is a 1-1 correlation between them, -// but it is possible for a single .wlk to have multiple .gats reference it - -/// Load file into memory and possibly record length -// For some reason, this allocates an extra 1024 bytes at the end -void *grfio_reads(const char *resourcename, size_t *size); - -/// Load file into memory -inline -void *grfio_read(const char *resourcename) -{ - return grfio_reads(resourcename, NULL); -} - -/// Get size of file -// This is only called once, and that is to check the existence of a file. -size_t grfio_size(const char *resourcename) __attribute__((deprecated)); - -#endif // GRFIO_HPP diff --git a/src/common/utils2.hpp b/src/common/utils2.hpp index cdf2069..5f02beb 100644 --- a/src/common/utils2.hpp +++ b/src/common/utils2.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #ifdef __clang__ @@ -208,4 +209,22 @@ typename std::common_type::type max(A a, B b) return b < a ? a : b; } +template +struct is_array_of_unknown_bound +: std::is_same::type[]> +{}; + +template +typename std::enable_if::value, std::unique_ptr>::type make_unique(A&&... a) +{ + return std::unique_ptr(new T(a...)); +} + +template +typename std::enable_if::value, std::unique_ptr>::type make_unique(size_t sz) +{ + typedef typename std::remove_extent::type E; + return std::unique_ptr(new E[sz]); +} + #endif // UTILS2_HPP -- cgit v1.2.3-70-g09d2