[ekg2-commit] r4064 - trunk/ekg: trunk/ekg/userlist.c

SVN commit svn w toxygen.net
Wto, 8 Lip 2008, 14:23:11 CEST


Author: darkjames
Date: 2008-07-08 14:23:10 +0200 (Tue, 08 Jul 2008)
New Revision: 4064

Modified:
   trunk/ekg/userlist.c
Log:
groups, userlist, resources. 



Modified: trunk/ekg/userlist.c
===================================================================
--- trunk/ekg/userlist.c	2008-07-08 09:17:36 UTC (rev 4063)
+++ trunk/ekg/userlist.c	2008-07-08 12:23:10 UTC (rev 4064)
@@ -61,6 +61,7 @@
 #include "log.h"
 
 #include "debug.h"
+#include "dynstuff_inline.h"
 #include "queries.h"
 
 struct ignore_label ignore_labels[IGNORE_LABELS_MAX] = {
@@ -74,34 +75,21 @@
 	{ 0, NULL }
 };
 
-/**
- * userlist_compare()
- *
- * wewnetrzna funkcja pomocna przy list_add_sorted().
- *
- * @param data1 - pierwszy wpis userlisty do porównania.
- * @param data2 - drugi wpis userlisty do porówniania.
- * @sa list_add_sorted
- *
- * @return zwraca wynik xstrcasecmp() na nazwach userów.
- */
+/* userlist: */
 static LIST_ADD_COMPARE(userlist_compare, userlist_t *) { return xstrcasecmp(data1->nickname, data2->nickname); }
 
-/**
- * userlist_resource_compare()
- *
- * internal function used to sort resources by prio and by name
- * used by list_add_sorted() 
- *
- * @param data1 - first ekg_resource_t to compare.
- * @param data2 - second ekg_resource_t to compare.
- * @sa userlist_resource_add
- * @sa list_add_sorted
- *
- * @return It returns result of prio subtraction if resource prio is diffrent.
- * 	Otherwise result of xstrcasecmp() by resources name
- */
+__DYNSTUFF_ADD_SORTED(userlists, userlist_t, userlist_compare);		/* userlists_add() */
 
+
+/* groups: */
+static LIST_ADD_COMPARE(group_compare, struct ekg_group *) { return xstrcasecmp(data1->name, data2->name); }
+static LIST_FREE_ITEM(group_item_free, struct ekg_group *) { xfree(data->name); }
+
+__DYNSTUFF_ADD_SORTED(ekg_groups, struct ekg_group, group_compare);		/* ekg_groups_add() */
+__DYNSTUFF_REMOVE_ITER(ekg_groups, struct ekg_group, group_item_free);		/* ekg_groups_removei() */
+__DYNSTUFF_DESTROY(ekg_groups, struct ekg_group, group_item_free);		/* ekg_groups_destroy() */
+
+/* resources: */
 static LIST_ADD_COMPARE(userlist_resource_compare, ekg_resource_t *) {
 	if (data1->prio != data2->prio)			
 		return (data2->prio - data1->prio);	/* sort by prio */
@@ -109,6 +97,13 @@
 	return xstrcasecmp(data1->name, data2->name);	/* sort by name */
 }
 
+static LIST_FREE_ITEM(list_userlist_resource_free, ekg_resource_t *) { xfree(data->name); xfree(data->descr); }
+
+__DYNSTUFF_ADD_SORTED(ekg_resources, ekg_resource_t, userlist_resource_compare);	/* ekg_resources_add() */
+__DYNSTUFF_REMOVE_SAFE(ekg_resources, ekg_resource_t, list_userlist_resource_free);	/* ekg_resources_remove() */
+__DYNSTUFF_DESTROY(ekg_resources, ekg_resource_t, list_userlist_resource_free);		/* ekg_resources_destroy() */
+
+
 /*
  * userlist_add_entry()
  *
@@ -163,7 +158,7 @@
 		NULL;
 	
 	array_free_count(entry, count);
-	LIST_ADD_SORTED2(&(session->userlist), u, userlist_compare);
+	userlists_add(&(session->userlist), u);
 }
 
 /**
@@ -364,10 +359,6 @@
 	userlist_free_u(&(session->userlist));
 }
 
-static LIST_FREE_ITEM(group_item_free, struct ekg_group *) {
-	xfree(data->name);
-}
-
 static LIST_FREE_ITEM(userlist_free_item, userlist_t *) {
 	userlist_t *u = data;
 
@@ -382,29 +373,19 @@
 	xfree(u->foreign);
 	xfree(u->last_descr);
 
-	LIST_DESTROY2(u->groups, group_item_free);
+	ekg_groups_destroy(&(u->groups));
 	userlist_resource_free(u);
 }
 
+__DYNSTUFF_DESTROY(userlists, userlist_t, userlist_free_item);		/* userlists_destroy() */
+
 /* 
  * userlist_free_u()
  *
  * clear and remove from memory given userlist
  */
-void userlist_free_u (userlist_t **userlist)
-{
-        if (!*userlist)
-                return;
+void userlist_free_u (userlist_t **userlist) { userlists_destroy(userlist); }		/* XXX, remove */
 
-        LIST_DESTROY2(*userlist, userlist_free_item);
-        *userlist = NULL;
-}
-
-static LIST_FREE_ITEM(list_userlist_resource_free, ekg_resource_t *) {
-	xfree(data->name);
-	xfree(data->descr);
-}
-
 /**
  * userlist_resource_add()
  *
@@ -422,14 +403,15 @@
 ekg_resource_t *userlist_resource_add(userlist_t *u, const char *name, int prio) {
 	ekg_resource_t *r;
 
-	if (!u) return NULL;
+	if (!u) 
+		return NULL;
 
 	r	= xmalloc(sizeof(ekg_resource_t));
-	r->name		= xstrdup(name);		/* resource name */
-	r->prio		= prio;				/* resource prio */
-	r->status	= EKG_STATUS_NA;		/* this is quite stupid but we must be legal with ekg2 ABI ? */
+	r->name		= xstrdup(name);
+	r->prio		= prio;
+	r->status	= EKG_STATUS_NA;
 
-	LIST_ADD_SORTED2(&(u->resources), r, userlist_resource_compare);	/* add to list sorted by prio && than by name */
+	ekg_resources_add(&(u->resources), r);
 	return r;
 }
 
@@ -465,9 +447,9 @@
  * @param u - user
  * @param r - resource
  */
-void userlist_resource_remove(userlist_t *u, ekg_resource_t *r) {
+void userlist_resource_remove(userlist_t *u, ekg_resource_t *r) {		/* XXX, remove */
 	if (!u || !r) return;
-	LIST_REMOVE2(&(u->resources), r, list_userlist_resource_free);
+	ekg_resources_remove(&(u->resources), r);
 }
 
 /**
@@ -479,11 +461,9 @@
  * @param u - user
  * @sa userlist_resource_remove - to remove given resource
  */
-void userlist_resource_free(userlist_t *u) {
-	if (!u || !(u->resources)) return;
-
-	LIST_DESTROY2(u->resources, list_userlist_resource_free);
-	u->resources = NULL;
+void userlist_resource_free(userlist_t *u) {					/* XXX, remove */
+	if (!u) return;
+	ekg_resources_destroy(&(u->resources));
 }
 
 /*
@@ -520,7 +500,8 @@
         u->nickname = xstrdup(nickname);
         u->status = EKG_STATUS_NA;
 
-        return LIST_ADD_SORTED2(userlist, u, userlist_compare);
+	userlists_add(userlist, u);
+	return u;
 }
 
 /*
@@ -567,8 +548,7 @@
 		return -1;
 	if (!LIST_UNLINK2(&(session->userlist), u) && (errno == ENOENT))
 		return -1;
-	if (!LIST_ADD_SORTED2(&(session->userlist), u, userlist_compare))
-		return -1;
+	userlists_add(&(session->userlist), u);
 
 	return 0;
 }
@@ -853,15 +833,13 @@
 	if (!(level = ignored_check(session,uid)))
 		return -1;
 
-	for (gl = u->groups; gl; ) {
+	for (gl = u->groups; gl; gl = gl->next) {
 		struct ekg_group *g = gl;
 
-		gl = gl->next;
-
 		if (xstrncasecmp(g->name, "__ignored", 9))
 			continue;
 
-		LIST_REMOVE2(&u->groups, g, group_item_free);
+		gl = ekg_groups_removei(&u->groups, g);
 	}
 
 	if (!u->nickname && !u->groups) {
@@ -1024,19 +1002,6 @@
 }
 
 /**
- * group_compare()
- *
- * wewnetrzna funkcja pomocna przy list_add_sorted().
- *
- * @param data1 - pierwszy wpis do porownania
- * @param data2 - drugi wpis do porownania
- * @sa list_add_sorted
- *
- * @return zwraca wynik xstrcasecmp() na nazwach grup.
- */
-static LIST_ADD_COMPARE(group_compare, struct ekg_group *) { return xstrcasecmp(data1->name, data2->name); }
-
-/**
  * ekg_group_add()
  *
  * dodaje użytkownika do podanej grupy.
@@ -1061,7 +1026,7 @@
 	g = xmalloc(sizeof(struct ekg_group));
 	g->name = xstrdup(group);
 
-	LIST_ADD_SORTED2(&u->groups, g, group_compare);
+	ekg_groups_add(&u->groups, g);
 
 	return 0;
 }
@@ -1086,7 +1051,7 @@
 		struct ekg_group *g = gl;
 
 		if (!xstrcasecmp(g->name, group)) {
-			LIST_REMOVE2(&u->groups, g, group_item_free);
+			(void) ekg_groups_removei(&u->groups, g);
 			
 			return 0;
 		}
@@ -1145,7 +1110,7 @@
 		struct ekg_group *g = xmalloc(sizeof(struct ekg_group));
 
 		g->name = groups[i];
-		LIST_ADD_SORTED2(&gl, g, group_compare);
+		ekg_groups_add(&gl, g);
 	}
 	/* NOTE: we don't call here array_free() cause we use items of this
 	 * 	array @ initing groups. We don't use strdup()



Więcej informacji o liście dyskusyjnej ekg2-commit