Mercurial > hg > dmlib
diff dmres.c @ 721:bb14d7907eb2
Rename many pack & resource handling functions.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 21 Apr 2013 16:40:45 +0300 |
parents | 6e2b53f2878b |
children | ad3965b93ef1 |
line wrap: on
line diff
--- a/dmres.c Thu Apr 18 00:01:50 2013 +0300 +++ b/dmres.c Sun Apr 21 16:40:45 2013 +0300 @@ -2,7 +2,7 @@ * dmlib * -- Resource management * Programmed and designed by Matti 'ccr' Hamalainen - * (C) Copyright 2003-2012 Tecnic Software productions (TNSP) + * (C) Copyright 2003-2013 Tecnic Software productions (TNSP) */ #include "dmres.h" #include <time.h> @@ -15,7 +15,7 @@ #endif -DMResource *dmres_new(DMResourceLib *lib, const char *filename, int flags, size_t size) +DMResource *dmResourceNew(DMResourceLib *lib, const char *filename, const size_t size) { DMResource *node = dmMalloc0(sizeof(DMResource)); if (node == NULL) @@ -23,57 +23,55 @@ node->lib = lib; node->filename = dm_strdup(filename); - node->flags = flags; - node->dataSize = size; + node->rawSize = size; return node; } -void dmres_free_res_data(DMResource *node) +void dmResourceFreeResData(DMResource *node) { - if (node->rdata != NULL && + if (node->resData != NULL && node->rops != NULL && node->rops->free != NULL) { node->rops->free(node); } - node->rdata = NULL; + node->resData = NULL; node->flags &= !DMF_LOADED_RES; } -void dmres_free_raw_data(DMResource *node) +void dmResourceFreeRawData(DMResource *node) { - dmFree(node->data); - node->data = NULL; + dmFree(node->rawData); + node->rawData = NULL; node->flags &= !DMF_LOADED_RAW; } -void dmres_purge_raw_data(DMResource *node) +void dmResourcePurge_raw_data(DMResource *node) { - if ((node->flags & DMF_PRELOAD_RAW) == 0 && - (node->flags & DMF_LOADED_RAW) && - node->data != NULL) - dmres_free_raw_data(node); + if ((node->flags & DMF_LOADED_RAW) && + node->rawData != NULL) + dmResourceFreeRawData(node); } -void dmres_free(DMResource *node) +void dmResourceFree(DMResource *node) { if (node != NULL) { - dmres_free_res_data(node); - dmres_free_raw_data(node); + dmResourceFreeResData(node); + dmResourceFreeRawData(node); dmFree(node->filename); dmFree(node); } } -void dmres_insert(DMResourceLib *lib, DMResource * node) +void dmResourceInsert(DMResourceLib *lib, DMResource * node) { if (lib == NULL || node == NULL) return; @@ -95,7 +93,7 @@ } -void dmres_delete(DMResourceLib *lib, DMResource * node) +void dmResourceDelete(DMResourceLib *lib, DMResource * node) { if (lib == NULL) return; @@ -112,7 +110,7 @@ } -DMResource * dmres_find(DMResourceLib *lib, const char *filename) +DMResource * dmResourceFind(DMResourceLib *lib, const char *filename) { DMResource *node, *found = NULL; @@ -182,8 +180,8 @@ off_t savePos, fileSize; // Check if the size is cached - if (f->dataSize != 0) - return f->dataSize; + if (f->rawSize != 0) + return f->rawSize; // Get file size savePos = ftello(f->fh); @@ -200,7 +198,7 @@ return -1; } - f->dataSize = fileSize; + f->rawSize = fileSize; return fileSize; } @@ -257,11 +255,11 @@ dm_stdio_fsize(handle); - handle->data = dmMalloc(handle->dataSize); - if (handle->data == NULL) + handle->rawData = dmMalloc(handle->rawSize); + if (handle->rawData == NULL) return DMERR_MALLOC; - if (dm_stdio_fread(handle->data, sizeof(Uint8), handle->dataSize, handle) != handle->dataSize) + if (dm_stdio_fread(handle->rawData, sizeof(Uint8), handle->rawSize, handle) != handle->rawSize) return DMERR_FREAD; return DMERR_OK; @@ -326,7 +324,7 @@ return DMERR_NULLPTR; // Search PACK nodelist for file - if ((node = dm_pack_find(handle->lib->packFile->entries, handle->filename)) == NULL) + if ((node = dmPackFind(handle->lib->packFile->entries, handle->filename)) == NULL) { dmError("Entry '%s' not found in PACK file.\n", handle->filename); res = DMERR_NOT_FOUND; @@ -350,10 +348,10 @@ } // Initialize fields - handle->dataOffset = 0; - handle->dataSize = node->size; - handle->data = (Uint8 *) dmMalloc(node->size); - if (handle->data == NULL) + handle->rawOffset = 0; + handle->rawSize = node->size; + handle->rawData = (Uint8 *) dmMalloc(node->size); + if (handle->rawData == NULL) { res = DMERR_MALLOC; goto error; @@ -363,8 +361,8 @@ cstream.zalloc = (alloc_func) Z_NULL; cstream.zfree = (free_func) Z_NULL; cstream.opaque = (voidpf) Z_NULL; - cstream.next_out = handle->data; - cstream.avail_out = handle->dataSize; + cstream.next_out = handle->rawData; + cstream.avail_out = handle->rawSize; cdataLeft = node->length; cres = inflateInit(&(cstream)); if (cres != Z_OK) @@ -399,10 +397,10 @@ static void dm_pack_fclose(DMResource * f) { - f->dataSize = 0; - f->dataOffset = 0; - dmFree(f->data); - f->data = NULL; + f->rawSize = 0; + f->rawOffset = 0; + dmFree(f->rawData); + f->rawData = NULL; } #endif @@ -425,11 +423,11 @@ break; case SEEK_CUR: - newPos = f->dataOffset + offset; + newPos = f->rawOffset + offset; break; case SEEK_END: - newPos = f->dataSize + offset; + newPos = f->rawSize + offset; break; default: @@ -437,10 +435,10 @@ } // Set the new position - f->dataOffset = newPos; + f->rawOffset = newPos; // Check the new position - if (newPos < 0 && (size_t) newPos >= f->dataSize) + if (newPos < 0 && (size_t) newPos >= f->rawSize) return -1; return 0; @@ -449,20 +447,20 @@ static off_t dm_mem_fsize(DMResource * f) { - return f->dataSize; + return f->rawSize; } static off_t dm_mem_ftell(DMResource * f) { - return f->dataOffset; + return f->rawOffset; } static BOOL dm_mem_feof(DMResource * f) { // Check for EOF - if ((size_t) f->dataOffset <= f->dataSize) + if ((size_t) f->rawOffset <= f->rawSize) return FALSE; else return TRUE; @@ -472,8 +470,8 @@ static int dm_mem_fgetc(DMResource * f) { // Check for EOF - if ((size_t) f->dataOffset < f->dataSize) - return f->data[f->dataOffset++]; + if ((size_t) f->rawOffset < f->rawSize) + return f->rawData[f->rawOffset++]; else return EOF; } @@ -484,14 +482,14 @@ size_t length = (size * nmemb); // Check if we can read the whole chunk - if (((size_t) f->dataOffset + length) >= f->dataSize) + if (((size_t) f->rawOffset + length) >= f->rawSize) { - nmemb = (f->dataSize - f->dataOffset) / size; + nmemb = (f->rawSize - f->rawOffset) / size; length = size * nmemb; } - memcpy(buf, f->data + f->dataOffset, length); - f->dataOffset += length; + memcpy(buf, f->rawData + f->rawOffset, length); + f->rawOffset += length; return nmemb; } @@ -499,9 +497,9 @@ static int dm_mem_fputc(int ch, DMResource * f) { // Check for EOF - if ((size_t) f->dataOffset < f->dataSize) + if ((size_t) f->rawOffset < f->rawSize) { - f->data[f->dataOffset++] = ch; + f->rawData[f->rawOffset++] = ch; return ch; } else @@ -514,16 +512,16 @@ size_t length = (size * nmemb); // Check if we can write the whole chunk - if (((size_t) f->dataOffset + length) >= f->dataSize) + if (((size_t) f->rawOffset + length) >= f->rawSize) { - nmemb = (f->dataSize - f->dataOffset) / size; + nmemb = (f->rawSize - f->rawOffset) / size; length = size * nmemb; } if (length > 0) { - memcpy(f->data + f->dataOffset, buf, length); - f->dataOffset += length; + memcpy(f->rawData + f->rawOffset, buf, length); + f->rawOffset += length; } return nmemb; } @@ -606,8 +604,7 @@ int ret = DMERR_INIT_FAIL; // Check if we want to preload raw data? - if ((handle->flags & DMF_PRELOAD_RAW) || - (handle->lib->flags & DRF_PRELOAD_ALL)) + if (handle->lib->flags & DRF_PRELOAD_RAW) { if (handle->flags & DMF_LOADED_RAW) ret = DMERR_OK; @@ -632,7 +629,7 @@ // Check if resource data is to be preloaded - if ((handle->flags & DMF_PRELOAD_RES) || (handle->lib->flags & DRF_PRELOAD_RES)) + if (handle->lib->flags & DRF_PRELOAD_RES) { if (handle->flags & DMF_LOADED_RES) ret = DMERR_OK; @@ -648,7 +645,7 @@ // Check if we can purge the raw data now if ((handle->flags & DMF_PERSIST) == 0) - dmres_purge_raw_data(handle); + dmResourcePurge_raw_data(handle); } dmf_reset(handle); @@ -665,13 +662,13 @@ DMResource *handle; // Check master directory for resource - if ((handle = dmres_find(lib, filename)) == NULL) + if ((handle = dmResourceFind(lib, filename)) == NULL) { #ifdef DM_USE_STDIO if (lib->flags & DRF_USE_STDIO) { // Hmm.. does not exist? Fall back to a stdio file - handle = dmres_new(lib, filename, 0, 0); + handle = dmResourceNew(lib, filename, 0); if (handle == NULL) return NULL; @@ -691,7 +688,7 @@ // Check if the data is preloaded if (handle->flags & DMF_LOADED_RAW) { - dmres_ref(handle); + dmResourceRef(handle); return handle; } @@ -700,7 +697,7 @@ if (ret == DMERR_OK) { - dmres_ref(handle); + dmResourceRef(handle); return handle; } @@ -708,25 +705,25 @@ } -DMResource * dmf_create_memio(DMResourceLib *lib, const char *filename, Uint8 *buf, size_t len) +DMResource * dmf_create_memio(DMResourceLib *lib, const char *filename, Uint8 *buf, const size_t size) { DMResource *handle; // Check master directory for resource - if ((handle = dmres_find(lib, filename)) == NULL) + if ((handle = dmResourceFind(lib, filename)) == NULL) { - // Hmm.. does not exist? Fall back to a stdio file - handle = dmres_new(lib, filename, DMF_LOADED_RAW, len); + handle = dmResourceNew(lib, filename, size); if (handle == NULL) return NULL; - handle->fops = &dfMemIOFileOps; - handle->data = buf; - dmres_insert(lib, handle); + handle->flags = DMF_LOADED_RAW; + handle->fops = &dfMemIOFileOps; + handle->rawData = buf; + dmResourceInsert(lib, handle); } // Increase refcount - dmres_ref(handle); + dmResourceRef(handle); dmf_reset(handle); return handle; @@ -736,23 +733,22 @@ #ifdef DM_USE_STDIO DMResource * dmf_create_stdio(const char *filename, const char *mode) { - DMResource *handle = dmres_new(NULL, filename, 0, 0); + DMResource *handle = dmResourceNew(NULL, filename, 0); if (handle == NULL) return NULL; - handle->fops = &dfStdioFileOps; - - handle->fh = fopen(filename, mode); + handle->fops = &dfStdioFileOps; + handle->fh = fopen(filename, mode); handle->error = dmGetErrno(); if (handle->fh != NULL) { - dmres_ref(handle); + dmResourceRef(handle); return handle; } else { - dmres_free(handle); + dmResourceFree(handle); return NULL; } } @@ -760,13 +756,13 @@ DMResource * dmf_create_stdio_stream(FILE *fh) { - DMResource *handle = dmres_new(NULL, "", 0, 0); + DMResource *handle = dmResourceNew(NULL, "", 0); if (handle == NULL) return NULL; handle->fops = &dfStdioFHOps; - handle->fh = fh; - dmres_ref(handle); + handle->fh = fh; + dmResourceRef(handle); return handle; } #endif @@ -780,7 +776,7 @@ if (f->fops->fclose != NULL) f->fops->fclose(f); - dmres_unref(f); + dmResourceUnref(f); } @@ -858,7 +854,7 @@ } -int dmres_ref(DMResource *node) +int dmResourceRef(DMResource *node) { if (node->lib != NULL) dmMutexLock(node->lib->mutex); node->atime = time(NULL); @@ -869,7 +865,7 @@ } -int dmres_unref(DMResource *node) +int dmResourceUnref(DMResource *node) { if (node->lib != NULL) dmMutexLock(node->lib->mutex); node->refcount--; @@ -879,44 +875,8 @@ } -#define NADDFLAG(flg, ch) \ - do { \ - if ((flags & (flg)) && offs < size - 1) \ - str[offs++] = ch; \ - } while (0) - -void dmres_flags_to_symbolic(char *str, size_t size, int flags) -{ - size_t offs = 0; - NADDFLAG(DMF_PRELOAD_RAW, 'r'); - NADDFLAG(DMF_PRELOAD_RES, 'e'); - NADDFLAG(DMF_PERSIST, 'p'); - NADDFLAG(DMF_STREAM, 's'); - if (offs < size) - str[offs] = 0; -} - -#undef NADDFLAG - - -int dmres_symbolic_to_flags(const char *str) -{ - int offs, flags; - - for (flags = offs = 0; str[offs]; offs++) - switch (tolower(str[offs])) - { - case 'r': flags |= DMF_PRELOAD_RAW; break; - case 'e': flags |= DMF_PRELOAD_RES; break; - case 'p': flags |= DMF_PERSIST; break; - case 's': flags |= DMF_STREAM; break; - } - return flags; -} - - #ifdef DM_USE_STDIO -static int dmres_load_directory(DMResourceLib *lib, const char *path) +static int dmResourceLoad_directory(DMResourceLib *lib, const char *path) { int res = DMERR_OK; struct dirent *dh; @@ -944,13 +904,13 @@ } if (S_ISREG(sbuf.st_mode)) - node = dmres_new(lib, dh->d_name, 0, sbuf.st_size); + node = dmResourceNew(lib, dh->d_name, sbuf.st_size); } if (node != NULL) { node->fops = &dfStdioFileOps; - dmres_insert(lib, node); + dmResourceInsert(lib, node); } } while (dh != NULL); @@ -969,7 +929,7 @@ /* Resources subsystem initialization and shutdown routines */ -int dmres_init(DMResourceLib **plib, const char *filename, const char *path, const int flags, int (*classifier)(DMResource *)) +int dmResourcesInit(DMResourceLib **plib, const char *filename, const char *path, const int flags, int (*classifier)(DMResource *)) { DMResourceLib *lib; BOOL initialized = FALSE; @@ -993,7 +953,7 @@ lib->packFilename = dm_strdup((filename != NULL) ? filename : DMRES_DATA_PACK); // Initialize PACK, open as read-only - ret = dm_pack_open(lib->packFilename, &lib->packFile, TRUE); + ret = dmPackOpen(lib->packFilename, &lib->packFile, TRUE); if (ret != DMERR_OK) { if ((flags & DRF_USE_STDIO) == 0) @@ -1009,15 +969,15 @@ // Initialize resources from a PACK file for (node = lib->packFile->entries; node != NULL; node = node->next) { - DMResource *res = dmres_new(lib, node->filename, node->resFlags & DMF_MASK, node->size); + DMResource *res = dmResourceNew(lib, node->filename, node->size); if (res == NULL) { dmError("Could not allocate memory for resource node '%s' [0x%08x], %d.\n", - node->filename, node->resFlags, node->size); + node->filename, node->flags, node->size); return DMERR_INIT_FAIL; } - dmres_insert(lib, res); + dmResourceInsert(lib, res); } initialized = TRUE; @@ -1029,7 +989,7 @@ if (!initialized && (flags & DRF_USE_STDIO)) { // Initialize resources from a resource directory - int ret = dmres_load_directory(lib, lib->resPath); + int ret = dmResourceLoad_directory(lib, lib->resPath); if (ret != DMERR_OK) return ret; initialized = TRUE; @@ -1056,7 +1016,7 @@ } -int dmres_close(DMResourceLib *lib) +int dmResourcesClose(DMResourceLib *lib) { DMResource *node; @@ -1069,11 +1029,11 @@ #ifdef DM_USE_PACKFS if (lib->flags & DRF_USE_PACK) { - int res = dm_pack_close(lib->packFile); + int res = dmPackClose(lib->packFile); if (res != DMERR_OK) { dmError("Error closing PACK, #%i: %s\n", - res, dmErrorStr(res)); + res, dmErrorStr(res)); } dmFree(lib->packFilename); @@ -1085,7 +1045,7 @@ while (node != NULL) { DMResource *next = node->next; - dmres_free(node); + dmResourceFree(node); node = next; } @@ -1097,7 +1057,7 @@ } -int dmres_preload(DMResourceLib *lib, BOOL start, int *loaded, int *total) +int dmResourcesPreload(DMResourceLib *lib, BOOL start, int *loaded, int *total) { int ret = DMERR_OK; @@ -1113,10 +1073,9 @@ *total = 0; // Calculate total number of resources to be preloaded - for (node = lib->resources; node != NULL; node = node->next) + if (lib->flags & (DRF_PRELOAD_RAW | DRF_PRELOAD_RES)) { - if ((lib->flags & (DRF_PRELOAD_ALL | DRF_PRELOAD_RES)) || - (node->flags & (DMF_PRELOAD_RAW | DMF_PRELOAD_RES))) + for (node = lib->resources; node != NULL; node = node->next) (*total)++; } } @@ -1145,10 +1104,10 @@ } -void dmres_prune(DMResourceLib *lib, int agems, int flags) +void dmResourcePrune(DMResourceLib *lib, const int agems, int const flags) { DMResource *node; - int currtime = time(NULL); + const int stamp = time(NULL); dmMutexLock(lib->mutex); for (node = lib->resources; node != NULL; node = node->next) @@ -1159,14 +1118,11 @@ (node->flags & DMF_PERSIST) == 0 && (node->flags & (DMF_LOADED_RES | DMF_LOADED_RAW))) { - // Check if we match either one of atime or mtime - if (((flags & DMPRUNE_ATIME) && - currtime - node->atime >= agems) || - ((flags & DMPRUNE_MTIME) && - currtime - node->mtime >= agems)) + if (((flags & DMPRUNE_ATIME) && stamp - node->atime >= agems) || + ((flags & DMPRUNE_MTIME) && stamp - node->mtime >= agems)) { - dmres_free_res_data(node); - dmres_free_raw_data(node); + dmResourceFreeResData(node); + dmResourceFreeRawData(node); } } }