changeset 3282:6d5f47f5b05b HEAD

Linked list -> array
author Timo Sirainen <tss@iki.fi>
date Fri, 08 Apr 2005 18:17:51 +0300
parents bbb22ca660e0
children 21f30709ead8
files src/lib-storage/mail-storage.c
diffstat 1 files changed, 44 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage.c	Fri Apr 08 18:08:53 2005 +0300
+++ b/src/lib-storage/mail-storage.c	Fri Apr 08 18:17:51 2005 +0300
@@ -13,106 +13,98 @@
 	"Internal error occured. Refer to server log for more information."
 #define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
 
-struct mail_storage_list {
-	struct mail_storage_list *next;
-	struct mail_storage *storage;
-};
-
 unsigned int mail_storage_module_id = 0;
 
-static struct mail_storage_list *storages = NULL;
+static array_t ARRAY_DEFINE(storages, struct mail_storage *);
 
 void mail_storage_init(void)
 {
+	ARRAY_CREATE(&storages, default_pool, struct mail_storage *, 8);
 }
 
 void mail_storage_deinit(void)
 {
-	struct mail_storage_list *next;
-
-	while (storages != NULL) {
-		next = storages->next;
-
-		i_free(storages);
-                storages = next;
-	}
+	if (array_is_created(&storages))
+		array_free(&storages);
 }
 
 void mail_storage_class_register(struct mail_storage *storage_class)
 {
-	struct mail_storage_list *list, **pos;
-
-	list = i_new(struct mail_storage_list, 1);
-	list->storage = storage_class;
-
 	/* append it after the list, so the autodetection order is correct */
-	pos = &storages;
-	while (*pos != NULL)
-		pos = &(*pos)->next;
-	*pos = list;
+	array_append(&storages, &storage_class, 1);
 }
 
 void mail_storage_class_unregister(struct mail_storage *storage_class)
 {
-	struct mail_storage_list **list, *next;
+	struct mail_storage *const *classes;
+	unsigned int i, count;
 
-	for (list = &storages; *list != NULL; list = &(*list)->next) {
-		if ((*list)->storage == storage_class) {
-			next = (*list)->next;
-
-			mail_storage_destroy((*list)->storage);
-			i_free(*list);
-
-			*list = next;
+	classes = array_get(&storages, &count);
+	for (i = 0; i < count; i++) {
+		if (classes[i] == storage_class) {
+			array_delete(&storages, i, 1);
+			break;
 		}
 	}
 }
 
+static struct mail_storage *mail_storage_find(const char *name)
+{
+	struct mail_storage *const *classes;
+	unsigned int i, count;
+
+	i_assert(name != NULL);
+
+	classes = array_get(&storages, &count);
+	for (i = 0; i < count; i++) {
+		if (strcasecmp(classes[i]->name, name) == 0)
+			return classes[i];
+	}
+	return NULL;
+}
+
 struct mail_storage *
 mail_storage_create(const char *name, const char *data, const char *user,
 		    enum mail_storage_flags flags,
 		    enum mail_storage_lock_method lock_method)
 {
-	struct mail_storage_list *list;
-
-	i_assert(name != NULL);
+	struct mail_storage *storage;
 
-	for (list = storages; list != NULL; list = list->next) {
-		if (strcasecmp(list->storage->name, name) == 0)
-			return list->storage->v.create(data, user, flags,
-						       lock_method);
-	}
-
-	return NULL;
+	storage = mail_storage_find(name);
+	if (storage != NULL)
+		return storage->v.create(data, user, flags, lock_method);
+	else
+		return NULL;
 }
 
 struct mail_storage *
 mail_storage_create_default(const char *user, enum mail_storage_flags flags,
 			    enum mail_storage_lock_method lock_method)
 {
-	struct mail_storage_list *list;
+	struct mail_storage *const *classes;
 	struct mail_storage *storage;
+	unsigned int i, count;
 
-	for (list = storages; list != NULL; list = list->next) {
-		storage = list->storage->v.create(NULL, user, flags,
-						  lock_method);
+	classes = array_get(&storages, &count);
+	for (i = 0; i < count; i++) {
+		storage = classes[i]->v.create(NULL, user, flags, lock_method);
 		if (storage != NULL)
 			return storage;
 	}
-
 	return NULL;
 }
 
 static struct mail_storage *
 mail_storage_autodetect(const char *data, enum mail_storage_flags flags)
 {
-	struct mail_storage_list *list;
+	struct mail_storage *const *classes;
+	unsigned int i, count;
 
-	for (list = storages; list != NULL; list = list->next) {
-		if (list->storage->v.autodetect(data, flags))
-			return list->storage;
+	classes = array_get(&storages, &count);
+	for (i = 0; i < count; i++) {
+		if (classes[i]->v.autodetect(data, flags))
+			return classes[i];
 	}
-
 	return NULL;
 }