xref: /haiku/src/add-ons/translators/gif/SFHash.cpp (revision f3780ae8b2dcd5ae3b30bb9c4ffc36cbac58f3fe)
19949213aSStephan Aßmus ////////////////////////////////////////////////////////////////////////////////
29949213aSStephan Aßmus //
39949213aSStephan Aßmus //	File: SFHash.cpp
49949213aSStephan Aßmus //
59949213aSStephan Aßmus //	Date: December 1999
69949213aSStephan Aßmus //
79949213aSStephan Aßmus //	Author: Daniel Switkin
89949213aSStephan Aßmus //
99949213aSStephan Aßmus //	Copyright 2003 (c) by Daniel Switkin. This file is made publically available
109949213aSStephan Aßmus //	under the BSD license, with the stipulations that this complete header must
119949213aSStephan Aßmus //	remain at the top of the file indefinitely, and credit must be given to the
129949213aSStephan Aßmus //	original author in any about box using this software.
139949213aSStephan Aßmus //
149949213aSStephan Aßmus ////////////////////////////////////////////////////////////////////////////////
159949213aSStephan Aßmus 
169949213aSStephan Aßmus // Additional authors:	Stephan Aßmus, <superstippi@gmx.de>
179949213aSStephan Aßmus 
189949213aSStephan Aßmus #include "SFHash.h"
199949213aSStephan Aßmus #include <stdlib.h>
209949213aSStephan Aßmus #include <stdio.h>
219949213aSStephan Aßmus 
229949213aSStephan Aßmus SFHash::SFHash(int size) {
239949213aSStephan Aßmus 	fatalerror = false;
249949213aSStephan Aßmus 	this->size = size;
259949213aSStephan Aßmus 	iterate_pos = iterate_depth = 0;
26*f3780ae8SAlex Smith 	main_array = (HashItem **)malloc(this->size * sizeof(HashItem *));
279949213aSStephan Aßmus 
289949213aSStephan Aßmus     if (main_array == NULL) {
299949213aSStephan Aßmus 		fatalerror = true;
309949213aSStephan Aßmus 		return;
319949213aSStephan Aßmus 	}
329949213aSStephan Aßmus 	for (int x = 0; x < this->size; x++) {
339949213aSStephan Aßmus 		main_array[x] = NULL;
349949213aSStephan Aßmus 	}
359949213aSStephan Aßmus }
369949213aSStephan Aßmus 
379949213aSStephan Aßmus void SFHash::AddItem(HashItem *item) {
389949213aSStephan Aßmus 	item->next = NULL;
399949213aSStephan Aßmus 	int pos = item->key % size;
409949213aSStephan Aßmus 
419949213aSStephan Aßmus 	if (main_array[pos] == NULL) {
429949213aSStephan Aßmus 		main_array[pos] = item;
439949213aSStephan Aßmus 	}
449949213aSStephan Aßmus 	else {
459949213aSStephan Aßmus 		HashItem *temp = main_array[pos];
469949213aSStephan Aßmus 		while (temp->next != NULL) temp = temp->next;
479949213aSStephan Aßmus 		temp->next = item;
489949213aSStephan Aßmus 	}
499949213aSStephan Aßmus }
509949213aSStephan Aßmus 
519949213aSStephan Aßmus HashItem*
529949213aSStephan Aßmus SFHash::GetItem(unsigned int key)
539949213aSStephan Aßmus {
549949213aSStephan Aßmus 	int pos = key % size;
559949213aSStephan Aßmus 	HashItem *item = main_array[pos];
569949213aSStephan Aßmus 
579949213aSStephan Aßmus 	while (item != NULL) {
589949213aSStephan Aßmus 		if (item->key == key) return item;
599949213aSStephan Aßmus 		item = item->next;
609949213aSStephan Aßmus 	}
619949213aSStephan Aßmus 	return NULL;
629949213aSStephan Aßmus }
639949213aSStephan Aßmus 
649949213aSStephan Aßmus unsigned int
659949213aSStephan Aßmus SFHash::CountItems()
669949213aSStephan Aßmus {
679949213aSStephan Aßmus     unsigned int count = 0;
689949213aSStephan Aßmus     for (int x = 0; x < this->size; x++) {
699949213aSStephan Aßmus         HashItem *item = main_array[x];
709949213aSStephan Aßmus         while (item != NULL) {
719949213aSStephan Aßmus             count++;
729949213aSStephan Aßmus             item = item->next;
739949213aSStephan Aßmus         }
749949213aSStephan Aßmus     }
759949213aSStephan Aßmus     return count;
769949213aSStephan Aßmus }
779949213aSStephan Aßmus 
789949213aSStephan Aßmus HashItem*
799949213aSStephan Aßmus SFHash::NextItem()
809949213aSStephan Aßmus {
819949213aSStephan Aßmus     if (iterate_pos >= size) {
829949213aSStephan Aßmus         Rewind();
839949213aSStephan Aßmus         return NULL;
849949213aSStephan Aßmus     }
859949213aSStephan Aßmus     HashItem *item;
869949213aSStephan Aßmus     while ((item = main_array[iterate_pos]) == NULL) iterate_pos++;
879949213aSStephan Aßmus     for (int d = 0; d < iterate_depth; d++) {
889949213aSStephan Aßmus         item = item->next;
899949213aSStephan Aßmus     }
909949213aSStephan Aßmus 
919949213aSStephan Aßmus     if (item->next != NULL) iterate_depth++;
929949213aSStephan Aßmus     else {
939949213aSStephan Aßmus         iterate_pos++;
949949213aSStephan Aßmus         iterate_depth = 0;
959949213aSStephan Aßmus     }
969949213aSStephan Aßmus     return item;
979949213aSStephan Aßmus }
989949213aSStephan Aßmus 
999949213aSStephan Aßmus void SFHash::Rewind() {
1009949213aSStephan Aßmus     iterate_pos = 0;
1019949213aSStephan Aßmus     iterate_depth = 0;
1029949213aSStephan Aßmus }
1039949213aSStephan Aßmus 
1049949213aSStephan Aßmus SFHash::~SFHash() {
1059949213aSStephan Aßmus 	for (int x = 0; x < size; x++) {
1069949213aSStephan Aßmus 		HashItem *item = main_array[x];
1079949213aSStephan Aßmus 		while (item != NULL) {
1089949213aSStephan Aßmus 			HashItem *t = item->next;
1099949213aSStephan Aßmus 			delete item;
1109949213aSStephan Aßmus 			item = t;
1119949213aSStephan Aßmus 		}
1129949213aSStephan Aßmus 	}
1139949213aSStephan Aßmus     free(main_array);
1149949213aSStephan Aßmus }
1159949213aSStephan Aßmus 
116