diff options
author | Martin Kretzschmar <mkretzschmar@src.gnome.org> | 2004-05-17 19:37:57 (GMT) |
---|---|---|
committer | Martin Kretzschmar <mkretzschmar@src.gnome.org> | 2004-05-17 19:37:57 (GMT) |
commit | 6c85243ff859071be4fd2a3847b0fc2086206d31 (patch) | |
tree | 68b85384564a33061b32d5668c0eff7067a39ffc /pdf/goo | |
parent | af15b57b30fcf442262f3a797d169d6bc3c1a44a (diff) |
Imported Xpdf 3.00 and fixed build.
* ANNOUNCE:
* CHANGES:
* Makefile.am:
* README:
* aconf-win32.h:
* configure.in:
* dj_make.bat:
* doc/pdffonts.1:
* doc/pdffonts.cat:
* doc/pdffonts.hlp:
* doc/pdfimages.1:
* doc/pdfimages.cat:
* doc/pdfimages.hlp:
* doc/pdfinfo.1:
* doc/pdfinfo.cat:
* doc/pdfinfo.hlp:
* doc/pdftopbm.1:
* doc/pdftopbm.cat:
* doc/pdftopbm.hlp:
* doc/pdftops.1:
* doc/pdftops.cat:
* doc/pdftops.hlp:
* doc/pdftotext.1:
* doc/pdftotext.cat:
* doc/pdftotext.hlp:
* doc/xpdf.1:
* doc/xpdf.cat:
* doc/xpdf.hlp:
* doc/xpdfrc.5:
* doc/xpdfrc.cat:
* doc/xpdfrc.hlp:
* fofi/Makefile.in:
* goo/GHash.cc:
* goo/GHash.h:
* ms_make.bat:
* splash/Makefile.in:
* xpdf/DisplayFontTable.h:
* xpdf/ErrorCodes.h:
* xpdf/FTFont.cc:
* xpdf/FTFont.h:
* xpdf/FontFile.cc:
* xpdf/FontFile.h:
* xpdf/Function.h:
* xpdf/GPOutputDev.cc:
* xpdf/Gfx.cc:
* xpdf/Gfx.h:
* xpdf/GfxFont.cc:
* xpdf/GfxFont.h:
* xpdf/GfxState.cc:
* xpdf/GfxState.h:
* xpdf/GlobalParams.cc:
* xpdf/GlobalParams.h:
* xpdf/Makefile.am:
* xpdf/Object.cc:
* xpdf/Object.h:
* xpdf/Outline.cc:
* xpdf/OutputDev.cc:
* xpdf/OutputDev.h:
* xpdf/PBMOutputDev.cc:
* xpdf/PBMOutputDev.h:
* xpdf/PDFDoc.cc:
* xpdf/PDFDoc.h:
* xpdf/PSOutputDev.cc:
* xpdf/PSOutputDev.h:
* xpdf/Page.cc:
* xpdf/Page.h:
* xpdf/Parser.cc:
* xpdf/SFont.cc:
* xpdf/SFont.h:
* xpdf/Stream.cc:
* xpdf/Stream.h:
* xpdf/T1Font.cc:
* xpdf/T1Font.h:
* xpdf/TTFont.cc:
* xpdf/TTFont.h:
* xpdf/TextOutputDev.cc:
* xpdf/TextOutputDev.h:
* xpdf/XOutputDev.cc:
* xpdf/XOutputDev.h:
* xpdf/XPixmapOutputDev.cc:
* xpdf/XPixmapOutputDev.h:
* xpdf/XRef.cc:
* xpdf/XRef.h:
* xpdf/config.h:
* xpdf/gpdf-control.cc:
* xpdf/pdffonts.cc:
* xpdf/pdfimages.cc:
* xpdf/pdfinfo.cc:
* xpdf/pdftopbm.cc:
* xpdf/pdftops.cc:
* xpdf/pdftotext.cc:
* xpdf/tests/Makefile.am:
* xpdf/vms_make.com:
* xpdf/xpdf.cc: Imported Xpdf 3.00 and fixed build.
Diffstat (limited to 'pdf/goo')
-rw-r--r-- | pdf/goo/GHash.cc | 167 | ||||
-rw-r--r-- | pdf/goo/GHash.h | 7 |
2 files changed, 148 insertions, 26 deletions
diff --git a/pdf/goo/GHash.cc b/pdf/goo/GHash.cc index 7036316..1dd0e26 100644 --- a/pdf/goo/GHash.cc +++ b/pdf/goo/GHash.cc @@ -20,7 +20,10 @@ struct GHashBucket { GString *key; - void *val; + union { + void *p; + int i; + } val; GHashBucket *next; }; @@ -61,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.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 = val; + p->val.i = val; h = hash(key); p->next = tab[h]; tab[h] = p; @@ -103,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) { @@ -113,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) { @@ -133,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; @@ -156,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; @@ -184,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; } @@ -193,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; diff --git a/pdf/goo/GHash.h b/pdf/goo/GHash.h index 69c767b..4a6e08d 100644 --- a/pdf/goo/GHash.h +++ b/pdf/goo/GHash.h @@ -29,17 +29,24 @@ public: GHash(GBool deleteKeysA = gFalse); ~GHash(); void add(GString *key, void *val); + void add(GString *key, int val); void *lookup(GString *key); + int lookupInt(GString *key); void *lookup(char *key); + int lookupInt(char *key); void *remove(GString *key); + int removeInt(GString *key); void *remove(char *key); + int removeInt(char *key); int getLength() { return len; } void startIter(GHashIter **iter); GBool getNext(GHashIter **iter, GString **key, void **val); + GBool getNext(GHashIter **iter, GString **key, int *val); void killIter(GHashIter **iter); private: + void expand(); GHashBucket *find(GString *key, int *h); GHashBucket *find(char *key, int *h); int hash(GString *key); |