/* * xmalloc.c * Copyright (C) 1998-2005 A.J. van Os * * Description: * Extended malloc and friends */ #include #include #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 */