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