1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
34 /* our global datas */
35 extern struct HomeBank
*GLOBALS
;
38 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
40 void da_tag_free(Tag
*item
)
42 DB( g_print("da_tag_free\n") );
45 DB( g_print(" => %d, %s\n", item
->key
, item
->name
) );
53 Tag
*da_tag_malloc(void)
55 DB( g_print("da_tag_malloc\n") );
56 return rc_alloc(sizeof(Tag
));
60 void da_tag_destroy(void)
62 DB( g_print("da_tag_destroy\n") );
63 g_hash_table_destroy(GLOBALS
->h_tag
);
69 DB( g_print("da_tag_new\n") );
70 GLOBALS
->h_tag
= g_hash_table_new_full(g_int_hash
, g_int_equal
, (GDestroyNotify
)g_free
, (GDestroyNotify
)da_tag_free
);
74 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
75 static void da_tag_max_key_ghfunc(gpointer key
, Tag
*item
, guint32
*max_key
)
77 *max_key
= MAX(*max_key
, item
->key
);
80 static gboolean
da_tag_name_grfunc(gpointer key
, Tag
*item
, gchar
*name
)
82 if( name
&& item
->name
)
84 if(!strcasecmp(name
, item
->name
))
93 * Return value: the number of elements
95 guint
da_tag_length(void)
97 return g_hash_table_size(GLOBALS
->h_tag
);
103 * remove an tag from the GHashTable
105 * Return value: TRUE if the key was found and removed
108 gboolean
da_tag_remove(guint32 key
)
110 DB( g_print("da_tag_remove %d\n", key
) );
112 return g_hash_table_remove(GLOBALS
->h_tag
, &key
);
118 * insert an tag into the GHashTable
120 * Return value: TRUE if inserted
123 gboolean
da_tag_insert(Tag
*item
)
127 DB( g_print("da_tag_insert\n") );
129 new_key
= g_new0(guint32
, 1);
130 *new_key
= item
->key
;
131 g_hash_table_insert(GLOBALS
->h_tag
, new_key
, item
);
140 * append a new tag into the GHashTable
142 * Return value: TRUE if inserted
145 gboolean
da_tag_append(Tag
*item
)
150 DB( g_print("da_tag_append\n") );
152 if( item
->name
!= NULL
)
154 /* ensure no duplicate */
155 //g_strstrip(item->name);
156 existitem
= da_tag_get_by_name( item
->name
);
157 if( existitem
== NULL
)
159 new_key
= g_new0(guint32
, 1);
160 *new_key
= da_tag_get_max_key() + 1;
161 item
->key
= *new_key
;
163 DB( g_print(" -> append id: %d\n", *new_key
) );
165 g_hash_table_insert(GLOBALS
->h_tag
, new_key
, item
);
170 DB( g_print(" -> %s already exist: %d\n", item
->name
, item
->key
) );
176 * da_tag_get_max_key:
178 * Get the biggest key from the GHashTable
180 * Return value: the biggest key value
183 guint32
da_tag_get_max_key(void)
187 g_hash_table_foreach(GLOBALS
->h_tag
, (GHFunc
)da_tag_max_key_ghfunc
, &max_key
);
195 * da_tag_get_by_name:
197 * Get an tag structure by its name
199 * Return value: Tag * or NULL if not found
202 Tag
*da_tag_get_by_name(gchar
*name
)
204 DB( g_print("da_tag_get_by_name\n") );
206 return g_hash_table_find(GLOBALS
->h_tag
, (GHRFunc
)da_tag_name_grfunc
, name
);
214 * Get an tag structure by key
216 * Return value: Tag * or NULL if not found
219 Tag
*da_tag_get(guint32 key
)
221 DB( g_print("da_tag_get_tag\n") );
223 return g_hash_table_lookup(GLOBALS
->h_tag
, &key
);
230 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
235 da_tag_debug_list_ghfunc(gpointer key
, gpointer value
, gpointer user_data
)
240 DB( g_print(" %d :: %s\n", *id
, item
->name
) );
245 da_tag_debug_list(void)
248 DB( g_print("\n** debug **\n") );
250 g_hash_table_foreach(GLOBALS
->h_tag
, da_tag_debug_list_ghfunc
, NULL
);
252 DB( g_print("\n** end debug **\n") );
258 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
264 tag_glist_name_compare_func(Tag
*a
, Tag
*b
)
266 return hb_string_utf8_compare(a
->name
, b
->name
);
271 tag_glist_key_compare_func(Tag
*a
, Tag
*b
)
273 return a
->key
- b
->key
;
277 GList
*tag_glist_sorted(gint column
)
279 GList
*list
= g_hash_table_get_values(GLOBALS
->h_tag
);
282 return g_list_sort(list
, (GCompareFunc
)tag_glist_key_compare_func
);
284 return g_list_sort(list
, (GCompareFunc
)tag_glist_name_compare_func
);