1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier * xmalloc.c
3*25b329d5SDavid du Colombier * Copyright (C) 1998-2005 A.J. van Os
4f5736e95SDavid du Colombier *
5f5736e95SDavid du Colombier * Description:
6f5736e95SDavid du Colombier * Extended malloc and friends
7f5736e95SDavid du Colombier */
8f5736e95SDavid du Colombier
9f5736e95SDavid du Colombier #include <stdlib.h>
10f5736e95SDavid du Colombier #include <string.h>
11f5736e95SDavid du Colombier #include "antiword.h"
12f5736e95SDavid du Colombier
13*25b329d5SDavid du Colombier static char *szMessage =
14f5736e95SDavid du Colombier "Memory allocation failed, unable to continue";
15*25b329d5SDavid du Colombier #if defined(__dos) && !defined(__DJGPP__)
16*25b329d5SDavid du Colombier static char *szDosMessage =
17f5736e95SDavid du Colombier "DOS can't allocate this kind of memory, unable to continue";
18*25b329d5SDavid du Colombier #endif /* __dos && !__DJGPP__ */
19f5736e95SDavid du Colombier
20f5736e95SDavid du Colombier
21f5736e95SDavid du Colombier /*
22f5736e95SDavid du Colombier * xmalloc - Allocates dynamic memory
23f5736e95SDavid du Colombier *
24f5736e95SDavid du Colombier * See malloc(3), but unlike malloc(3) xmalloc does not return in case
25f5736e95SDavid du Colombier * of error.
26f5736e95SDavid du Colombier */
27f5736e95SDavid du Colombier void *
xmalloc(size_t tSize)28f5736e95SDavid du Colombier xmalloc(size_t tSize)
29f5736e95SDavid du Colombier {
30f5736e95SDavid du Colombier void *pvTmp;
31f5736e95SDavid du Colombier
32*25b329d5SDavid du Colombier TRACE_MSG("xmalloc");
33*25b329d5SDavid du Colombier
34f5736e95SDavid du Colombier if (tSize == 0) {
35f5736e95SDavid du Colombier tSize = 1;
36f5736e95SDavid du Colombier }
37f5736e95SDavid du Colombier pvTmp = malloc(tSize);
38f5736e95SDavid du Colombier if (pvTmp == NULL) {
39*25b329d5SDavid du Colombier DBG_MSG("xmalloc returned NULL");
40*25b329d5SDavid du Colombier DBG_DEC(tSize);
41*25b329d5SDavid du Colombier werr(1, szMessage);
42f5736e95SDavid du Colombier }
43f5736e95SDavid du Colombier return pvTmp;
44f5736e95SDavid du Colombier } /* end of xmalloc */
45f5736e95SDavid du Colombier
46f5736e95SDavid du Colombier /*
47f5736e95SDavid du Colombier * xcalloc - Allocates and zeros dynamic memory
48f5736e95SDavid du Colombier *
49f5736e95SDavid du Colombier * See calloc(3), but unlike calloc(3) xcalloc does not return in case of error
50f5736e95SDavid du Colombier */
51f5736e95SDavid du Colombier void *
xcalloc(size_t tNmemb,size_t tSize)52f5736e95SDavid du Colombier xcalloc(size_t tNmemb, size_t tSize)
53f5736e95SDavid du Colombier {
54f5736e95SDavid du Colombier void *pvTmp;
55f5736e95SDavid du Colombier
56*25b329d5SDavid du Colombier TRACE_MSG("xcalloc");
57*25b329d5SDavid du Colombier
58*25b329d5SDavid du Colombier #if defined(__dos) && !defined(__DJGPP__)
59f5736e95SDavid du Colombier if ((ULONG)tNmemb * (ULONG)tSize > 0xffffUL) {
60*25b329d5SDavid du Colombier DBG_DEC((ULONG)tNmemb * (ULONG)tSize);
61*25b329d5SDavid du Colombier werr(1, szDosMessage);
62f5736e95SDavid du Colombier }
63*25b329d5SDavid du Colombier #endif /* __dos && !__DJGPP__ */
64f5736e95SDavid du Colombier
65f5736e95SDavid du Colombier if (tNmemb == 0 || tSize == 0) {
66f5736e95SDavid du Colombier tNmemb = 1;
67f5736e95SDavid du Colombier tSize = 1;
68f5736e95SDavid du Colombier }
69f5736e95SDavid du Colombier pvTmp = calloc(tNmemb, tSize);
70f5736e95SDavid du Colombier if (pvTmp == NULL) {
71*25b329d5SDavid du Colombier DBG_MSG("xcalloc returned NULL");
72*25b329d5SDavid du Colombier werr(1, szMessage);
73f5736e95SDavid du Colombier }
74f5736e95SDavid du Colombier return pvTmp;
75f5736e95SDavid du Colombier } /* end of xcalloc */
76f5736e95SDavid du Colombier
77f5736e95SDavid du Colombier /*
78f5736e95SDavid du Colombier * xrealloc - Changes the size of a memory object
79f5736e95SDavid du Colombier *
80f5736e95SDavid du Colombier * See realloc(3), but unlike realloc(3) xrealloc does not return in case
81f5736e95SDavid du Colombier * of error.
82f5736e95SDavid du Colombier */
83f5736e95SDavid du Colombier void *
xrealloc(void * pvArg,size_t tSize)84f5736e95SDavid du Colombier xrealloc(void *pvArg, size_t tSize)
85f5736e95SDavid du Colombier {
86f5736e95SDavid du Colombier void *pvTmp;
87f5736e95SDavid du Colombier
88*25b329d5SDavid du Colombier TRACE_MSG("xrealloc");
89*25b329d5SDavid du Colombier
90f5736e95SDavid du Colombier pvTmp = realloc(pvArg, tSize);
91f5736e95SDavid du Colombier if (pvTmp == NULL) {
92*25b329d5SDavid du Colombier DBG_MSG("realloc returned NULL");
93*25b329d5SDavid du Colombier werr(1, szMessage);
94f5736e95SDavid du Colombier }
95f5736e95SDavid du Colombier return pvTmp;
96f5736e95SDavid du Colombier } /* end of xrealloc */
97f5736e95SDavid du Colombier
98f5736e95SDavid du Colombier /*
99f5736e95SDavid du Colombier * xstrdup - Duplicate a string
100f5736e95SDavid du Colombier *
101f5736e95SDavid du Colombier * See strdup(3), but unlike strdup(3) xstrdup does not return in case
102f5736e95SDavid du Colombier * of error.
103f5736e95SDavid du Colombier *
104f5736e95SDavid du Colombier * NOTE:
105f5736e95SDavid du Colombier * Does not use strdup(3), because some systems don't have it.
106f5736e95SDavid du Colombier */
107f5736e95SDavid du Colombier char *
xstrdup(const char * szArg)108f5736e95SDavid du Colombier xstrdup(const char *szArg)
109f5736e95SDavid du Colombier {
110f5736e95SDavid du Colombier char *szTmp;
111f5736e95SDavid du Colombier
112*25b329d5SDavid du Colombier TRACE_MSG("xstrdup");
113*25b329d5SDavid du Colombier
114f5736e95SDavid du Colombier szTmp = xmalloc(strlen(szArg) + 1);
115f5736e95SDavid du Colombier strcpy(szTmp, szArg);
116f5736e95SDavid du Colombier return szTmp;
117f5736e95SDavid du Colombier } /* end of xstrdup */
118f5736e95SDavid du Colombier
119f5736e95SDavid du Colombier /*
120f5736e95SDavid du Colombier * xfree - Deallocates dynamic memory
121f5736e95SDavid du Colombier *
122f5736e95SDavid du Colombier * See free(3).
123f5736e95SDavid du Colombier *
124f5736e95SDavid du Colombier * returns NULL;
125f5736e95SDavid du Colombier * This makes p=xfree(p) possible, free memory and overwrite the pointer to it.
126f5736e95SDavid du Colombier */
127f5736e95SDavid du Colombier void *
xfree(void * pvArg)128f5736e95SDavid du Colombier xfree(void *pvArg)
129f5736e95SDavid du Colombier {
130*25b329d5SDavid du Colombier TRACE_MSG("xfree");
131*25b329d5SDavid du Colombier
132f5736e95SDavid du Colombier if (pvArg != NULL) {
133f5736e95SDavid du Colombier free(pvArg);
134f5736e95SDavid du Colombier }
135f5736e95SDavid du Colombier return NULL;
136f5736e95SDavid du Colombier } /* end of xfree */
137