view src/dmfile.c @ 2227:5046458d6c34

Remove unnecessary error message.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 14 Jun 2019 18:32:45 +0300
parents ce3e56cfa9b9
children 36edd316184a
line wrap: on
line source

/*
 * DMLib
 * -- Standard I/O (stdio) file write/read endianess helpers
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2011 Tecnic Software productions (TNSP)
 */
#include "dmfile.h"


BOOL dm_fread_str(FILE *f, void *buf, const size_t len)
{
    return fread(buf, len, 1, f) == 1;
}


BOOL dm_fread_byte(FILE *f, Uint8 *val)
{
    int tmp = fgetc(f);
    *val = tmp;
    return tmp != EOF;
}


#define DM_DEFINE_FFUNC(xname, xtype, xmacro)         \
BOOL dm_fread_ ## xname (FILE *f, xtype *v) {         \
    xtype result;                                     \
    if (fread(&result, sizeof( xtype ), 1, f) != 1)   \
        return FALSE;                                 \
    *v = DM_ ## xmacro ## _TO_NATIVE (result);        \
    return TRUE;                                      \
}

#include "dmfiletmpl.h"

#undef DM_DEFINE_FFUNC


BOOL dm_fwrite_str(FILE *f, const void *buf, const size_t len)
{
    return fwrite(buf, len, 1, f) == 1;
}


BOOL dm_fwrite_byte(FILE *f, const Uint8 val)
{
    return fputc(val, f) == val;
}


#define DM_DEFINE_FFUNC(xname, xtype, xmacro)         \
BOOL dm_fwrite_ ## xname (FILE *f, const xtype v) {   \
    xtype result = DM_NATIVE_TO_ ## xmacro (v);       \
    return fwrite(&result, sizeof( xtype ), 1, f) == 1;  \
}

#include "dmfiletmpl.h"

#undef DM_DEFINE_FFUNC


int dmWriteDataFile(FILE *fh, const char *filename, const Uint8 *buf, const size_t bufSize)
{
    int res = DMERR_OK;

    if (fh == NULL && filename != NULL &&
        (fh = fopen(filename, "wb")) == NULL)
    {
        res = dmGetErrno();
        return dmError(res,
            "Could not open '%s' for writing: %s.\n",
            filename, dmErrorStr(res));
    }

    if (fh == NULL)
    {
        res = dmError(DMERR_NULLPTR,
            "NULL filename and stream pointers.\n");
        goto error;
    }

    if (fwrite(buf, 1, bufSize, fh) != bufSize)
    {
        res = dmGetErrno();
        dmError(res,
            "Error writing data to '%s': %s\n",
            filename, dmErrorStr(res));
    }

error:
    if (fh != NULL)
        fclose(fh);

    return res;
}


#define BUF_SIZE_INITIAL   (16*1024)
#define BUF_SIZE_GROW      (4*1024)

int dmReadDataFile(FILE *ffh, const char *filename, Uint8 **pbuf, size_t *pbufSize)
{
    FILE *fh = NULL;
    int res = DMERR_OK;
    Uint8 *dataBuf = NULL;
    size_t readSize, dataSize, dataRead, dataPos;

    if (ffh != NULL)
        fh = ffh;
    else
    if (filename != NULL)
    {
        if ((fh = fopen(filename, "rb")) == NULL)
            return DMERR_FOPEN;
    }

    if (fh == NULL)
    {
        return dmError(DMERR_NULLPTR,
            "NULL filename and stream pointers.\n");
    }

    // Allocate initial data buffer
    readSize = dataSize = BUF_SIZE_INITIAL;
    if ((dataBuf = dmMalloc(dataSize)) == NULL)
    {
        res = dmError(DMERR_MALLOC,
            "Error allocating memory for data, %d bytes.\n", dataSize);
        goto error;
    }

    // Read the data
    dataPos = dataRead = 0;
    while (!feof(fh) && !ferror(fh))
    {
        size_t read = fread(dataBuf + dataPos, 1, readSize, fh);
        dataPos += read;
        dataRead += read;

        if (dataRead >= dataSize)
        {
            readSize = BUF_SIZE_GROW;
            dataSize += BUF_SIZE_GROW;
            if ((dataBuf = dmRealloc(dataBuf, dataSize)) == NULL)
            {
                res = dmError(DMERR_MALLOC,
                    "Error reallocating memory for data, %d bytes.\n",
                    dataSize);
                goto error;
            }
        }
        else
            break;
    }

    *pbufSize = dataRead;
    *pbuf = dataBuf;

error:
    if (ffh != fh)
        fclose(fh);

    return res;
}