Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * xmalloc.c
 * Copyright (C) 1998-2005 A.J. van Os
 *
 * Description:
 * Extended malloc and friends
 */

#include <stdlib.h>
#include <string.h>
#include "antiword.h"

static char *szMessage =
        "Memory allocation failed, unable to continue";
#if defined(__dos) && !defined(__DJGPP__)
static char *szDosMessage =
        "DOS can't allocate this kind of memory, unable to continue";
#endif /* __dos && !__DJGPP__ */


/*
 * xmalloc - Allocates dynamic memory
 *
 * See malloc(3), but unlike malloc(3) xmalloc does not return in case
 * of error.
 */
void *
xmalloc(size_t tSize)
{
        void    *pvTmp;

        TRACE_MSG("xmalloc");

        if (tSize == 0) {
                tSize = 1;
        }
        pvTmp = malloc(tSize);
        if (pvTmp == NULL) {
                DBG_MSG("xmalloc returned NULL");
                DBG_DEC(tSize);
                werr(1, szMessage);
        }
        return pvTmp;
} /* end of xmalloc */

/*
 * xcalloc - Allocates and zeros dynamic memory
 *
 * See calloc(3), but unlike calloc(3) xcalloc does not return in case of error
 */
void *
xcalloc(size_t tNmemb, size_t tSize)
{
        void    *pvTmp;

        TRACE_MSG("xcalloc");

#if defined(__dos) && !defined(__DJGPP__)
        if ((ULONG)tNmemb * (ULONG)tSize > 0xffffUL) {
                DBG_DEC((ULONG)tNmemb * (ULONG)tSize);
                werr(1, szDosMessage);
        }
#endif /* __dos && !__DJGPP__ */

        if (tNmemb == 0 || tSize == 0) {
                tNmemb = 1;
                tSize = 1;
        }
        pvTmp = calloc(tNmemb, tSize);
        if (pvTmp == NULL) {
                DBG_MSG("xcalloc returned NULL");
                werr(1, szMessage);
        }
        return pvTmp;
} /* end of xcalloc */

/*
 * xrealloc - Changes the size of a memory object
 *
 * See realloc(3), but unlike realloc(3) xrealloc does not return in case
 * of error.
 */
void *
xrealloc(void *pvArg, size_t tSize)
{
        void    *pvTmp;

        TRACE_MSG("xrealloc");

        pvTmp = realloc(pvArg, tSize);
        if (pvTmp == NULL) {
                DBG_MSG("realloc returned NULL");
                werr(1, szMessage);
        }
        return pvTmp;
} /* end of xrealloc */

/*
 * xstrdup - Duplicate a string
 *
 * See strdup(3), but unlike strdup(3) xstrdup does not return in case
 * of error.
 *
 * NOTE:
 * Does not use strdup(3), because some systems don't have it.
 */
char *
xstrdup(const char *szArg)
{
        char    *szTmp;

        TRACE_MSG("xstrdup");

        szTmp = xmalloc(strlen(szArg) + 1);
        strcpy(szTmp, szArg);
        return szTmp;
} /* end of xstrdup */

/*
 * xfree - Deallocates dynamic memory
 *
 * See free(3).
 *
 * returns NULL;
 * This makes p=xfree(p) possible, free memory and overwrite the pointer to it.
 */
void *
xfree(void *pvArg)
{
        TRACE_MSG("xfree");

        if (pvArg != NULL) {
                free(pvArg);
        }
        return NULL;
} /* end of xfree */