Huub Schaeks fix for .schange
[swftools.git] / pdf2swf / xpdf / gmem.c
index cac386b..a0f2cf5 100644 (file)
@@ -3,9 +3,10 @@
  *
  * Memory routines with out-of-memory checking.
  *
- * Copyright 1996 Derek B. Noonburg
+ * Copyright 1996-2003 Glyph & Cog, LLC
  */
 
+#include <aconf.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stddef.h>
@@ -24,9 +25,9 @@ typedef struct _GMemHdr {
 #define gMemTrlSize (sizeof(long))
 
 #if gmemTrlSize==8
-#define gMemDeadVal 0xdeadbeefdeadbeef
+#define gMemDeadVal 0xdeadbeefdeadbeefUL
 #else
-#define gMemDeadVal 0xdeadbeef
+#define gMemDeadVal 0xdeadbeefUL
 #endif
 
 /* round data size so trailer will be aligned */
@@ -49,6 +50,7 @@ static GMemHdr *gMemList[gMemNLists] = {
 
 static int gMemIndex = 0;
 static int gMemAlloc = 0;
+static int gMemInUse = 0;
 
 #endif /* DEBUG_MEM */
 
@@ -59,7 +61,7 @@ void *gmalloc(int size) {
   GMemHdr *hdr;
   void *data;
   int lst;
-  long *trl, *p;
+  unsigned long *trl, *p;
 
   if (size == 0)
     return NULL;
@@ -70,14 +72,15 @@ void *gmalloc(int size) {
   }
   hdr = (GMemHdr *)mem;
   data = (void *)(mem + gMemHdrSize);
-  trl = (long *)(mem + gMemHdrSize + size1);
+  trl = (unsigned long *)(mem + gMemHdrSize + size1);
   hdr->size = size;
   hdr->index = gMemIndex++;
   lst = ((int)hdr >> gMemListShift) & gMemListMask;
   hdr->next = gMemList[lst];
   gMemList[lst] = hdr;
   ++gMemAlloc;
-  for (p = (long *)data; p <= trl; ++p)
+  gMemInUse += size;
+  for (p = (unsigned long *)data; p <= trl; ++p)
     *p = gMemDeadVal;
   return data;
 #else
@@ -134,13 +137,35 @@ void *grealloc(void *p, int size) {
 #endif
 }
 
+void *gmallocn(int nObjs, int objSize) {
+  int n;
+
+  n = nObjs * objSize;
+  if (objSize == 0 || n / objSize != nObjs) {
+    fprintf(stderr, "Bogus memory allocation size\n");
+    exit(1);
+  }
+  return gmalloc(n);
+}
+
+void *greallocn(void *p, int nObjs, int objSize) {
+  int n;
+
+  n = nObjs * objSize;
+  if (objSize == 0 || n / objSize != nObjs) {
+    fprintf(stderr, "Bogus memory allocation size\n");
+    exit(1);
+  }
+  return grealloc(p, n);
+}
+
 void gfree(void *p) {
 #ifdef DEBUG_MEM
   int size;
   GMemHdr *hdr;
   GMemHdr *prevHdr, *q;
   int lst;
-  long *trl, *clr;
+  unsigned long *trl, *clr;
 
   if (p) {
     hdr = (GMemHdr *)((char *)p - gMemHdrSize);
@@ -155,13 +180,14 @@ void gfree(void *p) {
       else
        gMemList[lst] = hdr->next;
       --gMemAlloc;
+      gMemInUse -= hdr->size;
       size = gMemDataSize(hdr->size);
-      trl = (long *)((char *)hdr + gMemHdrSize + size);
+      trl = (unsigned long *)((char *)hdr + gMemHdrSize + size);
       if (*trl != gMemDeadVal) {
        fprintf(stderr, "Overwrite past end of block %d at address %p\n",
                hdr->index, p);
       }
-      for (clr = (long *)hdr; clr <= trl; ++clr)
+      for (clr = (unsigned long *)hdr; clr <= trl; ++clr)
        *clr = gMemDeadVal;
       free(hdr);
     } else {