upgrade to xpdf 3.00.
[swftools.git] / pdf2swf / xpdf / GHash.cc
index dc09f71..1dd0e26 100644 (file)
@@ -2,15 +2,16 @@
 //
 // GHash.cc
 //
-// Copyright 2001-2002 Glyph & Cog, LLC
+// Copyright 2001-2003 Glyph & Cog, LLC
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include "gmem.h"
 #include "GString.h"
 #include "GHash.h"
 
 struct GHashBucket {
   GString *key;
-  void *val;
+  union {
+    void *p;
+    int i;
+  } val;
   GHashBucket *next;
 };
 
@@ -60,35 +64,37 @@ GHash::~GHash() {
 }
 
 void GHash::add(GString *key, void *val) {
-  GHashBucket **oldTab;
   GHashBucket *p;
-  int oldSize, i, h;
+  int h;
 
   // expand the table if necessary
   if (len >= size) {
-    oldSize = size;
-    oldTab = tab;
-    size = 2*size + 1;
-    tab = (GHashBucket **)gmalloc(size * sizeof(GHashBucket *));
-    for (h = 0; h < size; ++h) {
-      tab[h] = NULL;
-    }
-    for (i = 0; i < oldSize; ++i) {
-      while (oldTab[i]) {
-       p = oldTab[i];
-       oldTab[i] = oldTab[i]->next;
-       h = hash(p->key);
-       p->next = tab[h];
-       tab[h] = p;
-      }
-    }
-    gfree(oldTab);
+    expand();
   }
 
   // add the new symbol
   p = new GHashBucket;
   p->key = key;
-  p->val = val;
+  p->val.p = val;
+  h = hash(key);
+  p->next = tab[h];
+  tab[h] = p;
+  ++len;
+}
+
+void GHash::add(GString *key, int val) {
+  GHashBucket *p;
+  int h;
+
+  // expand the table if necessary
+  if (len >= size) {
+    expand();
+  }
+
+  // add the new symbol
+  p = new GHashBucket;
+  p->key = key;
+  p->val.i = val;
   h = hash(key);
   p->next = tab[h];
   tab[h] = p;
@@ -102,7 +108,17 @@ void *GHash::lookup(GString *key) {
   if (!(p = find(key, &h))) {
     return NULL;
   }
-  return p->val;
+  return p->val.p;
+}
+
+int GHash::lookupInt(GString *key) {
+  GHashBucket *p;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  return p->val.i;
 }
 
 void *GHash::lookup(char *key) {
@@ -112,7 +128,17 @@ void *GHash::lookup(char *key) {
   if (!(p = find(key, &h))) {
     return NULL;
   }
-  return p->val;
+  return p->val.p;
+}
+
+int GHash::lookupInt(char *key) {
+  GHashBucket *p;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  return p->val.i;
 }
 
 void *GHash::remove(GString *key) {
@@ -132,7 +158,30 @@ void *GHash::remove(GString *key) {
   if (deleteKeys) {
     delete p->key;
   }
-  val = p->val;
+  val = p->val.p;
+  delete p;
+  --len;
+  return val;
+}
+
+int GHash::removeInt(GString *key) {
+  GHashBucket *p;
+  GHashBucket **q;
+  int val;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  q = &tab[h];
+  while (*q != p) {
+    q = &((*q)->next);
+  }
+  *q = p->next;
+  if (deleteKeys) {
+    delete p->key;
+  }
+  val = p->val.i;
   delete p;
   --len;
   return val;
@@ -155,7 +204,30 @@ void *GHash::remove(char *key) {
   if (deleteKeys) {
     delete p->key;
   }
-  val = p->val;
+  val = p->val.p;
+  delete p;
+  --len;
+  return val;
+}
+
+int GHash::removeInt(char *key) {
+  GHashBucket *p;
+  GHashBucket **q;
+  int val;
+  int h;
+
+  if (!(p = find(key, &h))) {
+    return 0;
+  }
+  q = &tab[h];
+  while (*q != p) {
+    q = &((*q)->next);
+  }
+  *q = p->next;
+  if (deleteKeys) {
+    delete p->key;
+  }
+  val = p->val.i;
   delete p;
   --len;
   return val;
@@ -183,7 +255,27 @@ GBool GHash::getNext(GHashIter **iter, GString **key, void **val) {
     (*iter)->p = tab[(*iter)->h];
   }
   *key = (*iter)->p->key;
-  *val = (*iter)->p->val;
+  *val = (*iter)->p->val.p;
+  return gTrue;
+}
+
+GBool GHash::getNext(GHashIter **iter, GString **key, int *val) {
+  if (!*iter) {
+    return gFalse;
+  }
+  if ((*iter)->p) {
+    (*iter)->p = (*iter)->p->next;
+  }
+  while (!(*iter)->p) {
+    if (++(*iter)->h == size) {
+      delete *iter;
+      *iter = NULL;
+      return gFalse;
+    }
+    (*iter)->p = tab[(*iter)->h];
+  }
+  *key = (*iter)->p->key;
+  *val = (*iter)->p->val.i;
   return gTrue;
 }
 
@@ -192,6 +284,30 @@ void GHash::killIter(GHashIter **iter) {
   *iter = NULL;
 }
 
+void GHash::expand() {
+  GHashBucket **oldTab;
+  GHashBucket *p;
+  int oldSize, h, i;
+
+  oldSize = size;
+  oldTab = tab;
+  size = 2*size + 1;
+  tab = (GHashBucket **)gmalloc(size * sizeof(GHashBucket *));
+  for (h = 0; h < size; ++h) {
+    tab[h] = NULL;
+  }
+  for (i = 0; i < oldSize; ++i) {
+    while (oldTab[i]) {
+      p = oldTab[i];
+      oldTab[i] = oldTab[i]->next;
+      h = hash(p->key);
+      p->next = tab[h];
+      tab[h] = p;
+    }
+  }
+  gfree(oldTab);
+}
+
 GHashBucket *GHash::find(GString *key, int *h) {
   GHashBucket *p;