]>
git.ipfire.org Git - thirdparty/cups.git/blob - pdftops/gmem.c
4 * Memory routines with out-of-memory checking.
6 * Copyright 1996-2003 Glyph & Cog, LLC
19 typedef struct _GMemHdr
{
22 struct _GMemHdr
*next
;
25 #define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7)
26 #define gMemTrlSize (sizeof(long))
29 #define gMemDeadVal 0xdeadbeefdeadbeefUL
31 #define gMemDeadVal 0xdeadbeefUL
34 /* round data size so trailer will be aligned */
35 #define gMemDataSize(size) \
36 ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize)
39 #define gMemListShift 4
40 #define gMemListMask (gMemNLists - 1)
41 static GMemHdr
*gMemList
[gMemNLists
] = {
42 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
43 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
44 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
45 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
46 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
47 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
48 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
49 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
52 static int gMemIndex
= 0;
53 static int gMemAlloc
= 0;
54 static int gMemInUse
= 0;
56 #endif /* DEBUG_MEM */
58 void *gmalloc(int size
) {
65 unsigned long *trl
, *p
;
69 size1
= gMemDataSize(size
);
70 if (!(mem
= (char *)malloc(size1
+ gMemHdrSize
+ gMemTrlSize
))) {
71 fprintf(stderr
, "Out of memory\n");
75 data
= (void *)(mem
+ gMemHdrSize
);
76 trl
= (unsigned long *)(mem
+ gMemHdrSize
+ size1
);
78 hdr
->index
= gMemIndex
++;
79 lst
= ((int)hdr
>> gMemListShift
) & gMemListMask
;
80 hdr
->next
= gMemList
[lst
];
84 for (p
= (unsigned long *)data
; p
<= trl
; ++p
)
92 if (!(p
= malloc(size
))) {
93 fprintf(stderr
, "Out of memory\n");
100 void *grealloc(void *p
, int size
) {
112 hdr
= (GMemHdr
*)((char *)p
- gMemHdrSize
);
115 memcpy(q
, p
, size
< oldSize
? size
: oldSize
);
130 q
= realloc(p
, size
);
134 fprintf(stderr
, "Out of memory\n");
141 void *gmallocn(int nObjs
, int objSize
) {
148 if (objSize
<= 0 || nObjs
< 0 || nObjs
>= INT_MAX
/ objSize
) {
149 fprintf(stderr
, "Bogus memory allocation size\n");
155 void *greallocn(void *p
, int nObjs
, int objSize
) {
165 if (objSize
<= 0 || nObjs
< 0 || nObjs
>= INT_MAX
/ objSize
) {
166 fprintf(stderr
, "Bogus memory allocation size\n");
169 return grealloc(p
, n
);
172 void gfree(void *p
) {
176 GMemHdr
*prevHdr
, *q
;
178 unsigned long *trl
, *clr
;
181 hdr
= (GMemHdr
*)((char *)p
- gMemHdrSize
);
182 lst
= ((int)hdr
>> gMemListShift
) & gMemListMask
;
183 for (prevHdr
= NULL
, q
= gMemList
[lst
]; q
; prevHdr
= q
, q
= q
->next
) {
189 prevHdr
->next
= hdr
->next
;
191 gMemList
[lst
] = hdr
->next
;
193 gMemInUse
-= hdr
->size
;
194 size
= gMemDataSize(hdr
->size
);
195 trl
= (unsigned long *)((char *)hdr
+ gMemHdrSize
+ size
);
196 if (*trl
!= gMemDeadVal
) {
197 fprintf(stderr
, "Overwrite past end of block %d at address %p\n",
200 for (clr
= (unsigned long *)hdr
; clr
<= trl
; ++clr
)
204 fprintf(stderr
, "Attempted to free bad address %p\n", p
);
214 void gMemReport(FILE *f
) {
218 fprintf(f
, "%d memory allocations in all\n", gMemIndex
);
220 fprintf(f
, "%d memory blocks left allocated:\n", gMemAlloc
);
221 fprintf(f
, " index size\n");
222 fprintf(f
, "-------- --------\n");
223 for (lst
= 0; lst
< gMemNLists
; ++lst
) {
224 for (p
= gMemList
[lst
]; p
; p
= p
->next
)
225 fprintf(f
, "%8d %8d\n", p
->index
, p
->size
);
228 fprintf(f
, "No memory blocks left allocated\n");
233 char *copyString(char *s
) {
236 s1
= (char *)gmalloc(strlen(s
) + 1);