1 #include <stdlib.h>
2 #include <string.h>
3 #include <glib.h>
4
5 #include "elist.h"
6
7 #include "mru.h"
8
9
mru_new(guint max)10 MRUList* mru_new (guint max)
11 {
12 MRUList *mru = malloc(sizeof(MRUList));
13 mru->max = max;
14 mru->list = g_elist_new();
15 return mru;
16 }
17
mru_new_from_list(guint max,GEList * list)18 MRUList* mru_new_from_list (guint max, GEList *list)
19 {
20 MRUList *mru = malloc(sizeof(MRUList));
21 mru->max = max;
22 mru->list = list;
23 return mru;
24 }
25
26
mru_free(MRUList * mru)27 void mru_free (MRUList *mru)
28 {
29 g_elist_free_data(mru->list);
30 free(mru);
31 }
32
33
mru_add(MRUList * mru,const gchar * entry)34 void mru_add (MRUList *mru, const gchar *entry)
35 {
36 GList *found = g_list_find_custom(GLIST(mru->list), entry, (GCompareFunc)strcmp);
37
38 if (found) {
39 g_elist_remove_link(mru->list, found);
40 g_elist_prepend(mru->list, found->data);
41 g_list_free_1(found);
42 } else {
43 g_elist_prepend(mru->list, strdup(entry));
44 if (g_elist_length(mru->list) > mru->max) {
45 GList *last = g_elist_last(mru->list);
46 g_elist_remove_link(mru->list, last);
47 free(last->data);
48 g_list_free_1(last);
49 }
50 }
51 }
52