changeset 730:3d813c81f33c

More work on resources API.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 21 Apr 2013 19:29:00 +0300
parents e09b7fbedf8c
children 0e164aaa7409
files dmq3d.c dmres.c dmres.h dmsimple.c tests/plrtest.c tools/fontconv.c tools/mod2wav.c tools/ppl.c tools/viewmod.c tools/xm2jss.c
diffstat 10 files changed, 120 insertions(+), 105 deletions(-) [+]
line wrap: on
line diff
--- a/dmq3d.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/dmq3d.c	Sun Apr 21 19:29:00 2013 +0300
@@ -299,14 +299,16 @@
     rbmp = &(model->bitmaps[index]);
     if (rbmp->img == NULL)
     {
-        DMResource *res = dmf_open(lib, rbmp->name);
-        if (res == NULL)
+        DMResource *fh;
+        int res;
+        if ((res = dmf_open(lib, rbmp->name, &fh)) != DMERR_OK)
         {
-            dmError("Could not open resource file '%s'.\n", rbmp->name);
+            dmError("Could not open resource file '%s', #%d: %s.\n",
+                rbmp->name, res, dmErrorStr(res));
             return FALSE;
         }
-        rbmp->img = dmLoadImage(res);
-        dmf_close(res);
+        rbmp->img = dmLoadImage(fh);
+        dmf_close(fh);
         if (rbmp->img == NULL)
         {
             dmError("Could not load image file '%s'.\n", rbmp->name);
--- a/dmres.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/dmres.c	Sun Apr 21 19:29:00 2013 +0300
@@ -578,7 +578,7 @@
     dm_mem_fwrite,
     
     NULL,
-    NULL,
+    dmResourceFree,
     NULL
 };
 
@@ -586,7 +586,7 @@
 /* FS file handling functions. These functions call the actual
  * functions depending on where the file is located.
  */
-static void dmf_reset(DMResource *handle)
+static void dmResourceReset(DMResource *handle)
 {
     if (handle != NULL && handle->fops != NULL)
         dmfseek(handle, 0, SEEK_SET);
@@ -597,9 +597,6 @@
 {
     int ret = DMERR_INIT_FAIL;
 
-    // Initialize file ops
-    dmf_init_fops(handle);
-
     // Check if we want to preload raw data?
     if (handle->lib->flags & DRF_PRELOAD_RAW)
     {
@@ -613,7 +610,7 @@
                 handle->flags |= DMF_LOADED_RAW | DMF_PERSIST;
         }
 
-        dmf_reset(handle);
+        dmResourceReset(handle);
     }
 
     // Check if resource data is to be preloaded
@@ -635,56 +632,70 @@
                 handle->flags |= DMF_LOADED_RES;
         }
 
-        dmf_reset(handle);
+        dmResourceReset(handle);
     }
 
     return ret;
 }
 
 
-int dmf_open(DMResourceLib *lib, const char *filename, DMResource **handle)
+int dmf_open(DMResourceLib *lib, const char *filename, DMResource **phandle)
 {
+    DMResource *handle;
     int res;
 
     // Check master directory for resource
-    if ((*handle = dmResourceFind(lib, filename)) == NULL)
+    if ((*phandle = 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 = dmResourceNew(lib, filename, 0);
-            if (*handle == NULL)
-                return NULL;
+            *phandle = handle = dmResourceNew(lib, filename, 0);
+            if (handle == NULL)
+                return DMERR_MALLOC;
 
-            (*handle)->fops = &dfStdioFileOps;
+            handle->fops   = &dfStdioFileOps;
         }
         else
-            return NULL;
+            return DMERR_INIT_FAIL;
 #else
         // Stdio not enabled, fail
-        return NULL;
+        return DMERR_INIT_FAIL;
 #endif
     }
 
     // Check if the data is preloaded
     if ((res = handle->fops->fopen(handle)) == DMERR_OK)
+    {
         dmResourceRef(handle);
+        if (handle->flags & DMF_TEMPORARY)
+        {
+            handle->flags &= ~DMF_TEMPORARY;
+            dmResourceInsert(lib, handle);
+        }
+    }
+    else
+    if (handle->flags & DMF_TEMPORARY)
+    {
+        dmResourceFree(handle);
+        *phandle = handle = NULL;
+    }
 
     return res;
 }
 
 
-DMResource * dmf_create_memio(DMResourceLib *lib, const char *filename, Uint8 *buf, const size_t size)
+int dmf_create_memio(DMResourceLib *lib, const char *filename,
+    Uint8 *buf, const size_t size, DMResource **phandle)
 {
     DMResource *handle;
 
     // Check master directory for resource
-    if ((handle = dmResourceFind(lib, filename)) == NULL)
+    if ((*phandle = handle = dmResourceFind(lib, filename)) == NULL)
     {
-        handle = dmResourceNew(lib, filename, size);
-        if (handle == NULL)
-            return NULL;
+        if ((*phandle = handle = dmResourceNew(lib, filename, size)) == NULL)
+            return DMERR_MALLOC;
 
         handle->flags   = DMF_LOADED_RAW;
         handle->fops    = &dfMemIOFileOps;
@@ -694,46 +705,43 @@
 
     // Increase refcount
     dmResourceRef(handle);
-
-    dmf_reset(handle);
-    return handle;
+    dmResourceReset(handle);
+    return DMERR_OK;
 }
 
 
 #ifdef DM_USE_STDIO
-DMResource * dmf_create_stdio(const char *filename, const char *mode)
+int dmf_create_stdio(const char *filename, const char *mode, DMResource **phandle)
 {
-    DMResource *handle = dmResourceNew(NULL, filename, 0);
-    if (handle == NULL)
-        return NULL;
+    DMResource *handle;
+    if ((*phandle = handle = dmResourceNew(NULL, filename, 0)) == NULL)
+        return DMERR_MALLOC;
 
     handle->fops  = &dfStdioFileOps;
     handle->fh    = fopen(filename, mode);
     handle->error = dmGetErrno();
     
-    if (handle->fh != NULL)
-    {
-        dmResourceRef(handle);
-        return handle;
-    }
-    else
+    if (handle->fh == NULL)
     {
         dmResourceFree(handle);
-        return NULL;
+        return handle->error;
     }
+
+    dmResourceRef(handle);
+    return DMERR_OK;
 }
 
 
-DMResource * dmf_create_stdio_stream(FILE *fh)
+int dmf_create_stdio_stream(FILE *fh, DMResource **phandle)
 {
-    DMResource *handle = dmResourceNew(NULL, "", 0);
-    if (handle == NULL)
-        return NULL;
+    DMResource *handle;
+    if ((*phandle = handle = dmResourceNew(NULL, "", 0)) == NULL)
+        return DMERR_MALLOC;
 
     handle->fops = &dfStdioFHOps;
     handle->fh   = fh;
     dmResourceRef(handle);
-    return handle;
+    return DMERR_OK;
 }
 #endif
 
--- a/dmres.h	Sun Apr 21 18:34:13 2013 +0300
+++ b/dmres.h	Sun Apr 21 19:29:00 2013 +0300
@@ -37,6 +37,7 @@
 enum
 {
     DMF_PERSIST     = 0x0001, // Persist loaded RAW resource
+    DMF_TEMPORARY   = 0x0002,
     DMF_LOADED_RAW  = 0x1000, // Raw data has been loaded
     DMF_LOADED_RES  = 0x2000, // Resource has been loaded
 };
@@ -141,11 +142,11 @@
 
 
 // Opening and closing resources
-DMResource * dmf_open(DMResourceLib *lib, const char *);
-DMResource * dmf_create_memio(DMResourceLib *lib, const char *, Uint8 *buf, size_t len);
+int          dmf_open(DMResourceLib *lib, const char *, DMResource **handle);
+int          dmf_create_memio(DMResourceLib *lib, const char *, Uint8 *buf, size_t len, DMResource **phandle);
 #ifdef DM_USE_STDIO
-DMResource * dmf_create_stdio(const char *filename, const char *mode);
-DMResource * dmf_create_stdio_stream(FILE *);
+int          dmf_create_stdio(const char *filename, const char *mode, DMResource **phandle);
+int          dmf_create_stdio_stream(FILE *, DMResource **phandle);
 #endif
 void         dmf_close(DMResource *);
 
--- a/dmsimple.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/dmsimple.c	Sun Apr 21 19:29:00 2013 +0300
@@ -249,10 +249,10 @@
 int engineParseSetupConfig(const char *filename)
 {
     DMResource *file = NULL;
-    int res = DMERR_OK;
+    int res;
     char buf[128];
 
-    if ((file = dmf_open(engine.resources, filename)) == NULL)
+    if ((res = dmf_open(engine.resources, filename, &file)) != DMERR_OK)
         return DMERR_FOPEN;
 
     while (dmfgets(buf, sizeof(buf), file) != NULL)
@@ -353,19 +353,19 @@
     }
 
     // Fetch and decompress setup image, try regular resources first
-    file = dmf_open(engine.resources, engineSetupImageName);
-    if (file == NULL)
-        file = dmf_create_memio(NULL, engineSetupImageName, engineSetupImage, sizeof(engineSetupImage));
-
-    menuBgImage = dmLoadImage(file);
-    dmf_close(file);
+    if ((result = dmf_open(engine.resources, engineSetupImageName, &file)) == DMERR_OK ||
+        (result = dmf_create_memio(NULL, engineSetupImageName, engineSetupImage, sizeof(engineSetupImage), &file)) == DMERR_OK)
+    {
+        menuBgImage = dmLoadImage(file);
+        dmf_close(file);
+    }
 
-    file = dmf_open(engine.resources, engineSetupMenuBarName);
-    if (file == NULL)
-        file = dmf_create_memio(NULL, engineSetupMenuBarName, engineSetupMenuBar, sizeof(engineSetupMenuBar));
-
-    menuBarImage = dmLoadImage(file);
-    dmf_close(file);
+    if ((result = dmf_open(engine.resources, engineSetupMenuBarName, &file)) == DMERR_OK ||
+        (result = dmf_create_memio(NULL, engineSetupMenuBarName, engineSetupMenuBar, sizeof(engineSetupMenuBar), &file)) == DMERR_OK)
+    {
+        menuBarImage = dmLoadImage(file);
+        dmf_close(file);
+    }
 
     if (menuBgImage == NULL || menuBarImage == NULL)
     {
@@ -386,12 +386,12 @@
 
 
     // Load up the bitmap font
-    file = dmf_open(engine.resources, engineSetupFontName);
-    if (file == NULL)
-        file = dmf_create_memio(NULL, engineSetupFontName, engineSetupFont, sizeof(engineSetupFont));
-
-    result = dmLoadBitmapFont(file, &menuFont);
-    dmf_close(file);
+    if ((result = dmf_open(engine.resources, engineSetupFontName, &file)) == DMERR_OK ||
+        (result = dmf_create_memio(NULL, engineSetupFontName, engineSetupFont, sizeof(engineSetupFont), &file)) == DMERR_OK)
+    {
+        result = dmLoadBitmapFont(file, &menuFont);
+        dmf_close(file);
+    }
     if (result != DMERR_OK)
     {
         dmError("Could not instantiate setup screen font, %d: %s\n",
--- a/tests/plrtest.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/tests/plrtest.c	Sun Apr 21 19:29:00 2013 +0300
@@ -2,7 +2,6 @@
 #include "jssmod.h"
 #include "jssmix.h"
 #include "jssplr.h"
-#include <errno.h>
 #include <string.h>
 #include <unistd.h>
 #include <SDL.h>
@@ -111,22 +110,25 @@
 {
     SDL_AudioSpec afmt;
     DMResource *file = NULL;
-    char *sname = NULL;
+    char *inFilename = NULL;
     int result = -1;
     JSSModule *mod = NULL;
     JSSMixer *dev = NULL;
     JSSPlayer *plr = NULL;
 
     if (argc > 1)
-        sname = argv[1];
+        inFilename = argv[1];
 
     // Open the files
-    if (sname == NULL)
-        file = dmf_create_stdio_stream(stdin);
-    else if ((file = dmf_create_stdio(sname, "rb")) == NULL)
+    if (inFilename == NULL)
+        result = dmf_create_stdio_stream(stdin, &file);
+    else
+        result = dmf_create_stdio(inFilename, "rb", &file);
+    
+    if (result != DMERR_OK)
     {
-        fprintf(stderr, "Error opening input file '%s'. (%s)\n",
-            sname, strerror(errno));
+        fprintf(stderr, "Error opening input file '%s', #%d: %s\n",
+            inFilename, result, dmErrorStr(result));
         return 1;
     }
         
@@ -136,7 +138,7 @@
 
     
     // Read module file
-    fprintf(stderr, "Reading file: %s\n", sname);
+    fprintf(stderr, "Reading file: %s\n", inFilename);
 #ifdef JSS_SUP_XM
     fprintf(stderr, "* Trying XM...\n");
     result = jssLoadXM(file, &mod);
--- a/tools/fontconv.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/tools/fontconv.c	Sun Apr 21 19:29:00 2013 +0300
@@ -6,7 +6,6 @@
  * Please read file 'COPYING' for information on license and distribution.
  */
 #include <stdio.h>
-#include <errno.h>
 #include "dmlib.h"
 #include "dmargs.h"
 #include "dmfile.h"
@@ -303,10 +302,10 @@
 #endif
     
     // Open the source file
-    if ((inFile = dmf_create_stdio(optInFilename, "rb")) == NULL)
+    if ((res = dmf_create_stdio(optInFilename, "rb", &inFile)) != DMERR_OK)
     {
         dmError("Error opening input file '%s', %d: %s\n",
-            optInFilename, errno, strerror(errno));
+            optInFilename, res, dmErrorStr(res));
         return 1;
     }
 
@@ -369,10 +368,10 @@
     
     dmMsg(1, "Outputting a DMFONT format bitmap font.\n");
 
-    if ((outFile = dmf_create_stdio(optOutFilename, "wb")) == NULL)
+    if ((res = dmf_create_stdio(optOutFilename, "wb", &outFile)) != DMERR_OK)
     {
         dmError("Error creating file '%s', %d: %s\n",
-            optInFilename, errno, strerror(errno));
+            optInFilename, res, dmErrorStr(res));
         goto error_exit;
     }
 
--- a/tools/mod2wav.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/tools/mod2wav.c	Sun Apr 21 19:29:00 2013 +0300
@@ -153,10 +153,10 @@
     jssInit();
     
     // Open the source file
-    if ((inFile = dmf_create_stdio(optInFilename, "rb")) == NULL)
+    if ((result = dmf_create_stdio(optInFilename, "rb", &inFile)) != DMERR_OK)
     {
         dmError("Error opening input file '%s', %d: %s\n",
-            optInFilename, errno, strerror(errno));
+            optInFilename, result, dmErrorStr(result));
         return 1;
     }
 
@@ -250,7 +250,8 @@
     // Open output file
     if ((outFile = fopen(optOutFilename, "wb")) == NULL)
     {
-        dmError("Error opening output file '%s'. (%s)\n", optInFilename, strerror(errno));
+        dmError("Error opening output file '%s'. (%s)\n",
+            optInFilename, strerror(errno));
         return 7;
     }
 
--- a/tools/ppl.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/tools/ppl.c	Sun Apr 21 19:29:00 2013 +0300
@@ -581,11 +581,10 @@
         return 1;
     }
     
-    if ((file = dmf_create_stdio(optFilename, "rb")) == NULL)
+    if ((result = dmf_create_stdio(optFilename, "rb", &file)) != DMERR_OK)
     {
-        int err = dmGetErrno();
         dmError("Error opening file '%s', %d: (%s)\n",
-            optFilename, err, dmErrorStr(err));
+            optFilename, result, dmErrorStr(result));
         return 1;
     }
 
@@ -634,11 +633,11 @@
     }
 
     // Get font
-//    file = dmf_create_stdio("fnsmall.fnt", "rb");
-    file = dmf_create_memio(NULL, "pplfont.fnt", engineSetupFont, sizeof(engineSetupFont));
-    if (file == NULL)
+    result = dmf_create_memio(NULL, "pplfont.fnt", engineSetupFont, sizeof(engineSetupFont), &file);
+    if (result != DMERR_OK)
     {
-        dmError("Error opening font file 'pplfont.fnt'.\n");
+        dmError("Error opening font file 'pplfont.fnt', #%d: %s\n",
+            result, dmErrorStr(result));
         goto error_exit;
     }
     result = dmLoadBitmapFont(file, &font);
--- a/tools/viewmod.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/tools/viewmod.c	Sun Apr 21 19:29:00 2013 +0300
@@ -388,11 +388,14 @@
     // Open the file
     dmMsg(1, "Reading module file '%s'\n", optFilename);
     if (optFilename == NULL)
-        file = dmf_create_stdio_stream(stdin);
-    else if ((file = dmf_create_stdio(optFilename, "rb")) == NULL)
+        result = dmf_create_stdio_stream(stdin, &file);
+    else
+        result = dmf_create_stdio(optFilename, "rb", &file);
+    
+    if (result != DMERR_OK)
     {
-        dmError("Error opening input file '%s'. (%s)\n",
-            optFilename, strerror(errno));
+        dmError("Error opening input file '%s', #%d: %s\n",
+            optFilename, result, dmErrorStr(result));
         return 1;
     }
 
--- a/tools/xm2jss.c	Sun Apr 21 18:34:13 2013 +0300
+++ b/tools/xm2jss.c	Sun Apr 21 19:29:00 2013 +0300
@@ -912,8 +912,8 @@
 
 int main(int argc, char *argv[])
 {
-    DMResource *sfile = NULL;
-    FILE *dfile = NULL;
+    DMResource *inFile = NULL;
+    FILE *outFile = NULL;
     JSSModule *sm, *dm;
     int result;
 
@@ -933,10 +933,10 @@
     }
 
     // Read the source file
-    if ((sfile = dmf_create_stdio(optInFilename, "rb")) == NULL)
+    if ((result = dmf_create_stdio(optInFilename, "rb", &inFile)) != DMERR_OK)
     {
         dmError("Error opening input file '%s', %d: %s\n",
-            optInFilename, errno, strerror(errno));
+            optInFilename, result, dmErrorStr(result));
         return 1;
     }
 
@@ -945,8 +945,8 @@
 
     // Read file
     dmMsg(1, "Reading XM-format file ...\n");
-    result = jssLoadXM(sfile, &sm);
-    dmf_close(sfile);
+    result = jssLoadXM(inFile, &sm);
+    dmf_close(inFile);
     if (result != 0)
     {
         dmError("Error while loading XM file (%i), ", result);
@@ -1012,7 +1012,7 @@
         dm = sm;
 
     // Write output file
-    if ((dfile = fopen(optOutFilename, "wb")) == NULL)
+    if ((outFile = fopen(optOutFilename, "wb")) == NULL)
     {
         dmError("Error creating output file '%s', %d: %s\n",
             optOutFilename, errno, strerror(errno));
@@ -1022,9 +1022,9 @@
     dmMsg(1, "Writing JSSMOD-format file [patMode=0x%04x, samp8=0x%02x, samp16=0x%02x]\n",
         optPatternMode, optSampMode8, optSampMode16);
     
-    result = jssSaveJSSMOD(dfile, dm, optPatternMode, optSampMode8, optSampMode16);
+    result = jssSaveJSSMOD(outFile, dm, optPatternMode, optSampMode8, optSampMode16);
     
-    fclose(dfile);
+    fclose(outFile);
     
     if (result != 0)
     {