summaryrefslogtreecommitdiff
path: root/gif_hash.c
diff options
context:
space:
mode:
authorKeith Platfoot <kplatfoot@google.com>2015-01-07 10:16:21 -0800
committerKeith Platfoot <kplatfoot@google.com>2015-01-07 10:16:21 -0800
commit9b8f8602a74a943ddc356bb11c55b4998b2b386d (patch)
tree1e1879d85a9e48140108b961b67d1672e18af5c0 /gif_hash.c
parentb5a8e44648685070f146ff8456d36013c502f7a1 (diff)
downloadgiflib-marshmallow-mr3-release.tar.gz
Adds the encoding module to giflib.android-cts-6.0_r9android-cts-6.0_r8android-cts-6.0_r7android-cts-6.0_r6android-cts-6.0_r5android-cts-6.0_r4android-cts-6.0_r32android-cts-6.0_r31android-cts-6.0_r30android-cts-6.0_r3android-cts-6.0_r29android-cts-6.0_r28android-cts-6.0_r27android-cts-6.0_r26android-cts-6.0_r25android-cts-6.0_r24android-cts-6.0_r23android-cts-6.0_r22android-cts-6.0_r21android-cts-6.0_r20android-cts-6.0_r2android-cts-6.0_r19android-cts-6.0_r18android-cts-6.0_r17android-cts-6.0_r16android-cts-6.0_r15android-cts-6.0_r14android-cts-6.0_r13android-cts-6.0_r12android-cts-6.0_r1android-6.0.1_r9android-6.0.1_r8android-6.0.1_r79android-6.0.1_r78android-6.0.1_r77android-6.0.1_r74android-6.0.1_r73android-6.0.1_r72android-6.0.1_r70android-6.0.1_r7android-6.0.1_r69android-6.0.1_r68android-6.0.1_r67android-6.0.1_r66android-6.0.1_r65android-6.0.1_r63android-6.0.1_r62android-6.0.1_r61android-6.0.1_r60android-6.0.1_r59android-6.0.1_r58android-6.0.1_r57android-6.0.1_r56android-6.0.1_r55android-6.0.1_r54android-6.0.1_r53android-6.0.1_r52android-6.0.1_r51android-6.0.1_r50android-6.0.1_r5android-6.0.1_r49android-6.0.1_r48android-6.0.1_r47android-6.0.1_r46android-6.0.1_r45android-6.0.1_r43android-6.0.1_r42android-6.0.1_r41android-6.0.1_r40android-6.0.1_r4android-6.0.1_r33android-6.0.1_r32android-6.0.1_r31android-6.0.1_r30android-6.0.1_r3android-6.0.1_r28android-6.0.1_r27android-6.0.1_r26android-6.0.1_r25android-6.0.1_r24android-6.0.1_r22android-6.0.1_r21android-6.0.1_r20android-6.0.1_r18android-6.0.1_r17android-6.0.1_r16android-6.0.1_r13android-6.0.1_r12android-6.0.1_r11android-6.0.1_r10android-6.0.1_r1android-6.0.0_r7android-6.0.0_r6android-6.0.0_r5android-6.0.0_r41android-6.0.0_r4android-6.0.0_r3android-6.0.0_r26android-6.0.0_r25android-6.0.0_r24android-6.0.0_r23android-6.0.0_r2android-6.0.0_r13android-6.0.0_r12android-6.0.0_r11android-6.0.0_r1marshmallow-releasemarshmallow-mr3-releasemarshmallow-mr1-releasemarshmallow-mr1-devmarshmallow-dr1.6-releasemarshmallow-dr1.5-releasemarshmallow-dr1.5-devmarshmallow-dr-releasemarshmallow-dr-dragon-releasemarshmallow-dr-devmarshmallow-devmarshmallow-cts-release
Change-Id: Ia175f09ca16a1a57e821db8d54f755c6a7c143ba
Diffstat (limited to 'gif_hash.c')
-rw-r--r--gif_hash.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/gif_hash.c b/gif_hash.c
new file mode 100644
index 0000000..61a4d13
--- /dev/null
+++ b/gif_hash.c
@@ -0,0 +1,132 @@
+/*****************************************************************************
+
+gif_hash.c -- module to support the following operations:
+
+1. InitHashTable - initialize hash table.
+2. ClearHashTable - clear the hash table to an empty state.
+2. InsertHashTable - insert one item into data structure.
+3. ExistsHashTable - test if item exists in data structure.
+
+This module is used to hash the GIF codes during encoding.
+
+*****************************************************************************/
+
+#include <unistd.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "gif_lib.h"
+#include "gif_hash.h"
+#include "gif_lib_private.h"
+
+/* #define DEBUG_HIT_RATE Debug number of misses per hash Insert/Exists. */
+
+#ifdef DEBUG_HIT_RATE
+static long NumberOfTests = 0,
+ NumberOfMisses = 0;
+#endif /* DEBUG_HIT_RATE */
+
+static int KeyItem(uint32_t Item);
+
+/******************************************************************************
+ Initialize HashTable - allocate the memory needed and clear it. *
+******************************************************************************/
+GifHashTableType *_InitHashTable(void)
+{
+ GifHashTableType *HashTable;
+
+ if ((HashTable = (GifHashTableType *) malloc(sizeof(GifHashTableType)))
+ == NULL)
+ return NULL;
+
+ _ClearHashTable(HashTable);
+
+ return HashTable;
+}
+
+/******************************************************************************
+ Routine to clear the HashTable to an empty state. *
+ This part is a little machine depended. Use the commented part otherwise. *
+******************************************************************************/
+void _ClearHashTable(GifHashTableType *HashTable)
+{
+ memset(HashTable -> HTable, 0xFF, HT_SIZE * sizeof(uint32_t));
+}
+
+/******************************************************************************
+ Routine to insert a new Item into the HashTable. The data is assumed to be *
+ new one. *
+******************************************************************************/
+void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code)
+{
+ int HKey = KeyItem(Key);
+ uint32_t *HTable = HashTable -> HTable;
+
+#ifdef DEBUG_HIT_RATE
+ NumberOfTests++;
+ NumberOfMisses++;
+#endif /* DEBUG_HIT_RATE */
+
+ while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) {
+#ifdef DEBUG_HIT_RATE
+ NumberOfMisses++;
+#endif /* DEBUG_HIT_RATE */
+ HKey = (HKey + 1) & HT_KEY_MASK;
+ }
+ HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code);
+}
+
+/******************************************************************************
+ Routine to test if given Key exists in HashTable and if so returns its code *
+ Returns the Code if key was found, -1 if not. *
+******************************************************************************/
+int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key)
+{
+ int HKey = KeyItem(Key);
+ uint32_t *HTable = HashTable -> HTable, HTKey;
+
+#ifdef DEBUG_HIT_RATE
+ NumberOfTests++;
+ NumberOfMisses++;
+#endif /* DEBUG_HIT_RATE */
+
+ while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) {
+#ifdef DEBUG_HIT_RATE
+ NumberOfMisses++;
+#endif /* DEBUG_HIT_RATE */
+ if (Key == HTKey) return HT_GET_CODE(HTable[HKey]);
+ HKey = (HKey + 1) & HT_KEY_MASK;
+ }
+
+ return -1;
+}
+
+/******************************************************************************
+ Routine to generate an HKey for the hashtable out of the given unique key. *
+ The given Key is assumed to be 20 bits as follows: lower 8 bits are the *
+ new postfix character, while the upper 12 bits are the prefix code. *
+ Because the average hit ratio is only 2 (2 hash references per entry), *
+ evaluating more complex keys (such as twin prime keys) does not worth it! *
+******************************************************************************/
+static int KeyItem(uint32_t Item)
+{
+ return ((Item >> 12) ^ Item) & HT_KEY_MASK;
+}
+
+#ifdef DEBUG_HIT_RATE
+/******************************************************************************
+ Debugging routine to print the hit ratio - number of times the hash table *
+ was tested per operation. This routine was used to test the KeyItem routine *
+******************************************************************************/
+void HashTablePrintHitRatio(void)
+{
+ printf("Hash Table Hit Ratio is %ld/%ld = %ld%%.\n",
+ NumberOfMisses, NumberOfTests,
+ NumberOfMisses * 100 / NumberOfTests);
+}
+#endif /* DEBUG_HIT_RATE */
+
+/* end */