libpurple/trie.c

Wed, 20 Jun 2018 02:13:44 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Wed, 20 Jun 2018 02:13:44 -0400
changeset 39181
f0cd633d86d4
parent 38813
9506fb3fe6a2
child 39364
54439db24429
permissions
-rw-r--r--

prefs: Add binding versions of pref widget functions.

These just bind settings to existing widgets and copy the saved value to
the widget, except for combos which are produced from runtime lists.
Those are populated in a similar way as before.

There are some extra _bind_ words that will probably be dropped once the
other functions are unused.

35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
1 /*
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
2 * Purple
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
3 *
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
4 * Purple is the legal property of its developers, whose names are too
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
5 * numerous to list here. Please refer to the COPYRIGHT file distributed
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
6 * with this source distribution
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
7 *
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or (at
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
11 * your option) any later version.
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
12 *
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful, but
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
16 * General Public License for more details.
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
17 *
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
21 */
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
22
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
23 #include "trie.h"
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
24
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
25 #include <string.h>
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
26
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
27 #include "debug.h"
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
28 #include "memorypool.h"
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
29
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
30 #define PURPLE_TRIE_GET_PRIVATE(obj) \
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
31 (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_TRIE, PurpleTriePrivate))
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
32
35667
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
33 /* A single internal (that don't have any children) consists
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
34 * of 256 + 4 pointers. That's 1040 bytes on 32-bit machine or 2080 bytes
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
35 * on 64-bit.
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
36 *
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
37 * Thus, in 10500-byte pool block we can hold about 5-10 internal states.
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
38 * Threshold of 100 states means, we'd need 10-20 "small" blocks before
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
39 * switching to ~1-2 large blocks.
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
40 */
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
41 #define PURPLE_TRIE_LARGE_THRESHOLD 100
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
42 #define PURPLE_TRIE_STATES_SMALL_POOL_BLOCK_SIZE 10880
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
43 #define PURPLE_TRIE_STATES_LARGE_POOL_BLOCK_SIZE 102400
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
44
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
45 typedef struct _PurpleTrieRecord PurpleTrieRecord;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
46 typedef struct _PurpleTrieState PurpleTrieState;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
47 typedef struct _PurpleTrieRecordList PurpleTrieRecordList;
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
48
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
49 typedef struct
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
50 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
51 gboolean reset_on_match;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
52
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
53 PurpleMemoryPool *records_str_mempool;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
54 PurpleMemoryPool *records_obj_mempool;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
55 PurpleTrieRecordList *records;
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
56 GHashTable *records_map;
35667
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
57 gsize records_total_size;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
58
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
59 PurpleMemoryPool *states_mempool;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
60 PurpleTrieState *root_state;
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
61 } PurpleTriePrivate;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
62
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
63 struct _PurpleTrieRecord
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
64 {
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
65 gchar *word;
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
66 guint word_len;
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
67 gpointer data;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
68 };
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
69
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
70 struct _PurpleTrieRecordList
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
71 {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
72 PurpleTrieRecord *rec;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
73 PurpleTrieRecordList *next;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
74 PurpleTrieRecordList *prev;
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
75
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
76 gpointer extra_data;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
77 };
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
78
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
79 struct _PurpleTrieState
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
80 {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
81 PurpleTrieState *parent;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
82 PurpleTrieState **children;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
83
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
84 PurpleTrieState *longest_suffix;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
85
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
86 PurpleTrieRecord *found_word;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
87 };
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
88
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
89 typedef struct
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
90 {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
91 PurpleTrieState *state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
92
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
93 PurpleTrieState *root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
94 gboolean reset_on_match;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
95
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
96 PurpleTrieReplaceCb replace_cb;
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
97 PurpleTrieFindCb find_cb;
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
98 gpointer user_data;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
99 } PurpleTrieMachine;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
100
35668
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
101 /* TODO: an option to make it eager or lazy (now, it's eager) */
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
102 enum
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
103 {
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
104 PROP_ZERO,
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
105 PROP_RESET_ON_MATCH,
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
106 PROP_LAST
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
107 };
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
108
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
109 static GObjectClass *parent_class = NULL;
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
110 static GParamSpec *properties[PROP_LAST];
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
111
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
112
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
113 /*******************************************************************************
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
114 * Records list
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
115 ******************************************************************************/
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
116
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
117 static PurpleTrieRecordList *
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
118 purple_record_list_new(PurpleMemoryPool *mpool, PurpleTrieRecord *rec)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
119 {
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
120 PurpleTrieRecordList *node;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
121
35662
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
122 node = purple_memory_pool_alloc0(mpool,
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
123 sizeof(PurpleTrieRecordList), sizeof(gpointer));
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
124 g_return_val_if_fail(node != NULL, NULL);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
125
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
126 node->rec = rec;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
127
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
128 return node;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
129 }
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
130
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
131 static PurpleTrieRecordList *
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
132 purple_record_list_prepend(PurpleMemoryPool *mpool,
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
133 PurpleTrieRecordList *old_head, PurpleTrieRecord *rec)
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
134 {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
135 PurpleTrieRecordList *new_head;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
136
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
137 new_head = purple_record_list_new(mpool, rec);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
138 g_return_val_if_fail(new_head != NULL, NULL);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
139
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
140 new_head->next = old_head;
35662
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
141 if (old_head)
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
142 old_head->prev = new_head;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
143
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
144 return new_head;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
145 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
146
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
147 static PurpleTrieRecordList *
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
148 purple_record_list_copy(PurpleMemoryPool *mpool,
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
149 const PurpleTrieRecordList *head)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
150 {
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
151 PurpleTrieRecordList *new_head = NULL, *new_tail = NULL;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
152
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
153 while (head) {
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
154 PurpleTrieRecordList *node;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
155
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
156 node = purple_record_list_new(mpool, head->rec);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
157 g_return_val_if_fail(node != NULL, NULL); /* there is no leak */
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
158
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
159 node->prev = new_tail;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
160 if (new_tail)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
161 new_tail->next = node;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
162 new_tail = node;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
163 if (!new_head)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
164 new_head = node;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
165
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
166 head = head->next;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
167 }
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
168
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
169 return new_head;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
170 }
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
171
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
172 static PurpleTrieRecordList *
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
173 purple_record_list_remove(PurpleTrieRecordList *head,
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
174 PurpleTrieRecordList *node)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
175 {
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
176 g_return_val_if_fail(head != NULL, NULL);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
177 g_return_val_if_fail(node != NULL, head);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
178 g_return_val_if_fail(head->prev == NULL, NULL);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
179
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
180 if (head == node) {
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
181 if (head->next != NULL)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
182 head->next->prev = NULL;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
183 return head->next;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
184 } else {
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
185 g_return_val_if_fail(node->prev != NULL, NULL);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
186 node->prev->next = node->next;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
187 if (node->next != NULL)
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
188 node->next->prev = node->prev;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
189 return head;
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
190 }
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
191 }
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
192
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
193
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
194 /*******************************************************************************
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
195 * States management
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
196 ******************************************************************************/
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
197
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
198 static void
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
199 purple_trie_states_cleanup(PurpleTrie *trie)
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
200 {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
201 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
202
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
203 g_return_if_fail(priv != NULL);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
204
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
205 if (priv->root_state != NULL) {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
206 purple_memory_pool_cleanup(priv->states_mempool);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
207 priv->root_state = NULL;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
208 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
209 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
210
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
211 /* Allocates a state and binds it to the parent. */
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
212 static PurpleTrieState *
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
213 purple_trie_state_new(PurpleTrie *trie, PurpleTrieState *parent, guchar character)
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
214 {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
215 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
216 PurpleTrieState *state;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
217
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
218 g_return_val_if_fail(priv != NULL, NULL);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
219
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
220 state = purple_memory_pool_alloc0(priv->states_mempool,
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
221 sizeof(PurpleTrieState), sizeof(gpointer));
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
222 g_return_val_if_fail(state != NULL, NULL);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
223
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
224 if (parent == NULL)
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
225 return state;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
226
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
227 state->parent = parent;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
228 if (parent->children == NULL) {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
229 parent->children = purple_memory_pool_alloc0(
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
230 priv->states_mempool,
35662
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
231 /* PurpleTrieState *children[G_MAXUCHAR + 1] */
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
232 256 * sizeof(gpointer),
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
233 sizeof(gpointer));
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
234 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
235
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
236 if (parent->children == NULL) {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
237 purple_memory_pool_free(priv->states_mempool, state);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
238 g_warn_if_reached();
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
239 return NULL;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
240 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
241
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
242 parent->children[character] = state;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
243
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
244 return state;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
245 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
246
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
247 static gboolean
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
248 purple_trie_states_build(PurpleTrie *trie)
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
249 {
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
250 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
251 PurpleTrieState *root;
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
252 PurpleMemoryPool *reclist_mpool;
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
253 PurpleTrieRecordList *reclist, *it;
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
254 gulong cur_len;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
255
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
256 g_return_val_if_fail(priv != NULL, FALSE);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
257
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
258 if (priv->root_state != NULL)
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
259 return TRUE;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
260
35667
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
261 if (priv->records_total_size < PURPLE_TRIE_LARGE_THRESHOLD) {
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
262 purple_memory_pool_set_block_size(priv->states_mempool,
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
263 PURPLE_TRIE_STATES_SMALL_POOL_BLOCK_SIZE);
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
264 } else {
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
265 purple_memory_pool_set_block_size(priv->states_mempool,
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
266 PURPLE_TRIE_STATES_LARGE_POOL_BLOCK_SIZE);
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
267 }
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
268
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
269 priv->root_state = root = purple_trie_state_new(trie, NULL, '\0');
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
270 g_return_val_if_fail(root != NULL, FALSE);
35663
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
271 g_assert(root->longest_suffix == NULL);
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
272
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
273 /* reclist is a list of words not yet added to the trie. Shorter words
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
274 * are removed from the list, when they are fully added to the trie. */
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
275 reclist_mpool = purple_memory_pool_new();
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
276 reclist = purple_record_list_copy(reclist_mpool, priv->records);
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
277
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
278 /* extra_data on every element of reclist will be a pointer to a trie
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
279 * node -- the prefix of the word with len of cur_len */
35663
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
280 for (it = reclist; it != NULL; it = it->next) {
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
281 it->extra_data = root;
35663
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
282 }
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
283
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
284 /* Iterate over indexes of words -- every loop iteration checks certain
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
285 * index of all remaining words. Loop finishes when there are no words
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
286 * longer than cur_len. */
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
287 for (cur_len = 0; reclist != NULL; cur_len++) {
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
288 for (it = reclist; it; it = it->next) {
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
289 PurpleTrieRecord *rec = it->rec;
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
290 guchar character = rec->word[cur_len];
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
291 PurpleTrieState *prefix = it->extra_data;
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
292 PurpleTrieState *lon_suf_parent;
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
293
35664
4a2cf3314f4b The empty word case was a bad idea
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35663
diff changeset
294 g_assert(character != '\0');
35663
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
295
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
296 if (prefix->children && prefix->children[character]) {
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
297 /* Word's prefix is already in the trie, added
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
298 * by the other word. */
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
299 prefix = prefix->children[character];
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
300 } else {
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
301 /* We need to create a new branch of trie. */
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
302 prefix = purple_trie_state_new(trie, prefix,
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
303 character);
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
304 if (!prefix) {
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
305 g_warn_if_reached();
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
306 g_object_unref(reclist_mpool);
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
307 return FALSE;
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
308 }
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
309 }
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
310 it->extra_data = prefix;
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
311 /* prefix is now of length increased by one character. */
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
312
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
313 /* The whole word is now added to the trie. */
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
314 if (rec->word[cur_len + 1] == '\0') {
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
315 if (prefix->found_word == NULL)
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
316 prefix->found_word = rec;
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
317 else {
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
318 purple_debug_warning("trie", "found "
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
319 "a collision of \"%s\" words",
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
320 rec->word);
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
321 }
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
322
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
323 /* "it" is not modified here, so it->next is
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
324 * still valid */
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
325 reclist = purple_record_list_remove(reclist, it);
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
326 }
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
327
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
328 /* We need to fill the longest_suffix field -- a longest
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
329 * complete suffix of the prefix we created. We look for
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
330 * that suffix in any path starting in root and ending
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
331 * in the (cur_len - 1) level of trie. */
35663
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
332 if (prefix->longest_suffix != NULL)
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
333 continue;
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
334 lon_suf_parent = prefix->parent->longest_suffix;
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
335 while (lon_suf_parent) {
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
336 if (lon_suf_parent->children &&
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
337 lon_suf_parent->children[character])
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
338 {
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
339 prefix->longest_suffix = lon_suf_parent->
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
340 children[character];
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
341 break;
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
342 }
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
343 lon_suf_parent = lon_suf_parent->longest_suffix;
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
344 }
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
345 if (prefix->longest_suffix == NULL)
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
346 prefix->longest_suffix = root;
35663
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
347 if (prefix->found_word == NULL) {
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
348 prefix->found_word =
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
349 prefix->longest_suffix->found_word;
6527214c491e Add testsuite for PurpleTrie and fix found bugs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35662
diff changeset
350 }
35655
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
351 }
94f0de42866d Trie: building the trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35654
diff changeset
352 }
35654
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
353
d8f3b538d6db Trie: PurpleTrieRecordList manipulation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35653
diff changeset
354 g_object_unref(reclist_mpool);
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
355
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
356 return TRUE;
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
357 }
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
358
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
359 /*******************************************************************************
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
360 * Searching
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
361 ******************************************************************************/
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
362
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
363 static void
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
364 purple_trie_advance(PurpleTrieMachine *m, const guchar character)
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
365 {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
366 /* change state after processing a character */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
367 while (TRUE) {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
368 /* Perfect fit - next character is the same, as the child of the
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
369 * prefix we reached so far. */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
370 if (m->state->children && m->state->children[character]) {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
371 m->state = m->state->children[character];
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
372 break;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
373 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
374
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
375 /* We reached root, that's a pity. */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
376 if (m->state == m->root_state)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
377 break;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
378
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
379 /* Let's try a bit shorter suffix. */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
380 m->state = m->state->longest_suffix;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
381 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
382 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
383
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
384 static gboolean
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
385 purple_trie_replace_do_replacement(PurpleTrieMachine *m, GString *out)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
386 {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
387 gboolean was_replaced = FALSE;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
388 gsize str_old_len;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
389
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
390 /* if we reached a "found" state, let's process it */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
391 if (!m->state->found_word)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
392 return FALSE;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
393
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
394 /* let's get back to the beginning of the word */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
395 g_assert(out->len >= m->state->found_word->word_len - 1);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
396 str_old_len = out->len;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
397 out->len -= m->state->found_word->word_len - 1;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
398
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
399 was_replaced = m->replace_cb(out, m->state->found_word->word,
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
400 m->state->found_word->data, m->user_data);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
401
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
402 /* output was untouched, revert to the previous position */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
403 if (!was_replaced)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
404 out->len = str_old_len;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
405
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
406 /* XXX */
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
407 if (was_replaced || m->reset_on_match)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
408 m->state = m->root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
409
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
410 return was_replaced;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
411 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
412
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
413 static gboolean
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
414 purple_trie_find_do_discovery(PurpleTrieMachine *m)
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
415 {
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
416 gboolean was_accepted;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
417
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
418 /* if we reached a "found" state, let's process it */
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
419 if (!m->state->found_word)
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
420 return FALSE;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
421
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
422 if (m->find_cb) {
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
423 was_accepted = m->find_cb(m->state->found_word->word,
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
424 m->state->found_word->data, m->user_data);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
425 } else {
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
426 was_accepted = TRUE;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
427 }
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
428
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
429 if (was_accepted && m->reset_on_match)
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
430 m->state = m->root_state;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
431
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
432 return was_accepted;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
433 }
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
434
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
435 gchar *
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
436 purple_trie_replace(PurpleTrie *trie, const gchar *src,
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
437 PurpleTrieReplaceCb replace_cb, gpointer user_data)
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
438 {
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
439 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
440 PurpleTrieMachine machine;
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
441 GString *out;
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
442 gsize i;
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
443
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
444 if (src == NULL)
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
445 return NULL;
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
446
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
447 g_return_val_if_fail(replace_cb != NULL, g_strdup(src));
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
448 g_return_val_if_fail(priv != NULL, NULL);
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
449
35662
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
450 purple_trie_states_build(trie);
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
451
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
452 machine.state = priv->root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
453 machine.root_state = priv->root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
454 machine.reset_on_match = priv->reset_on_match;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
455 machine.replace_cb = replace_cb;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
456 machine.user_data = user_data;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
457
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
458 out = g_string_new(NULL);
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
459 i = 0;
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
460 while (src[i] != '\0') {
35662
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
461 guchar character = src[i++];
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
462 gboolean was_replaced;
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
463
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
464 purple_trie_advance(&machine, character);
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
465 was_replaced = purple_trie_replace_do_replacement(&machine, out);
35659
f97feb9a67f2 Trie: better comments, fix a small flaw in algorithm
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35658
diff changeset
466
f97feb9a67f2 Trie: better comments, fix a small flaw in algorithm
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35658
diff changeset
467 /* We skipped a character without finding any records,
f97feb9a67f2 Trie: better comments, fix a small flaw in algorithm
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35658
diff changeset
468 * let's just copy it to the output. */
35662
33bfffdb9e63 Trie, memory pool: fix and make them actually working
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35659
diff changeset
469 if (!was_replaced)
35659
f97feb9a67f2 Trie: better comments, fix a small flaw in algorithm
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35658
diff changeset
470 g_string_append_c(out, character);
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
471 }
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
472
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
473 return g_string_free(out, FALSE);
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
474 }
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
475
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
476 gchar *
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
477 purple_trie_multi_replace(const GSList *tries, const gchar *src,
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
478 PurpleTrieReplaceCb replace_cb, gpointer user_data)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
479 {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
480 guint tries_count, m_idx;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
481 PurpleTrieMachine *machines;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
482 GString *out;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
483 gsize i;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
484
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
485 if (src == NULL)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
486 return NULL;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
487
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
488 g_return_val_if_fail(replace_cb != NULL, g_strdup(src));
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
489
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
490 tries_count = g_slist_length((GSList*)tries);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
491 if (tries_count == 0)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
492 return g_strdup(src);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
493
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
494 /* Initialize all machines. */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
495 machines = g_new(PurpleTrieMachine, tries_count);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
496 for (i = 0; i < tries_count; i++, tries = tries->next) {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
497 PurpleTrie *trie = tries->data;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
498 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
499
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
500 if (priv == NULL) {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
501 g_warn_if_reached();
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
502 g_free(machines);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
503 return NULL;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
504 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
505
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
506 purple_trie_states_build(trie);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
507
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
508 machines[i].state = priv->root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
509 machines[i].root_state = priv->root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
510 machines[i].reset_on_match = priv->reset_on_match;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
511 machines[i].replace_cb = replace_cb;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
512 machines[i].user_data = user_data;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
513 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
514
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
515 out = g_string_new(NULL);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
516 i = 0;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
517 while (src[i] != '\0') {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
518 guchar character = src[i++];
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
519 gboolean was_replaced = FALSE;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
520
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
521 /* Advance every machine and possibly perform a replacement. */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
522 for (m_idx = 0; m_idx < tries_count; m_idx++) {
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
523 purple_trie_advance(&machines[m_idx], character);
35665
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
524 if (was_replaced)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
525 continue;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
526 was_replaced = purple_trie_replace_do_replacement(
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
527 &machines[m_idx], out);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
528 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
529
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
530 /* We skipped a character without finding any records,
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
531 * let's just copy it to the output. */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
532 if (!was_replaced)
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
533 g_string_append_c(out, character);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
534
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
535 /* If we replaced a word, reset _all_ machines */
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
536 if (was_replaced) {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
537 for (m_idx = 0; m_idx < tries_count; m_idx++) {
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
538 machines[m_idx].state =
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
539 machines[m_idx].root_state;
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
540 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
541 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
542 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
543
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
544 g_free(machines);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
545 return g_string_free(out, FALSE);
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
546 }
f1310093e434 Implement and test multi-trie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35664
diff changeset
547
35756
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
548 gulong
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
549 purple_trie_find(PurpleTrie *trie, const gchar *src,
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
550 PurpleTrieFindCb find_cb, gpointer user_data)
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
551 {
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
552 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
553 PurpleTrieMachine machine;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
554 gulong found_count = 0;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
555 gsize i;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
556
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
557 if (src == NULL)
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
558 return 0;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
559
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
560 g_return_val_if_fail(priv != NULL, 0);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
561
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
562 purple_trie_states_build(trie);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
563
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
564 machine.state = priv->root_state;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
565 machine.root_state = priv->root_state;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
566 machine.reset_on_match = priv->reset_on_match;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
567 machine.find_cb = find_cb;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
568 machine.user_data = user_data;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
569
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
570 i = 0;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
571 while (src[i] != '\0') {
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
572 guchar character = src[i++];
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
573 gboolean was_found;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
574
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
575 purple_trie_advance(&machine, character);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
576
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
577 was_found = purple_trie_find_do_discovery(&machine);
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
578
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
579 if (was_found)
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
580 found_count++;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
581 }
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
582
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
583 return found_count;
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
584 }
fe6aba70046e Custom smileys: make it possible to find them by prpl
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35730
diff changeset
585
35790
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
586 gulong
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
587 purple_trie_multi_find(const GSList *tries, const gchar *src,
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
588 PurpleTrieFindCb find_cb, gpointer user_data)
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
589 {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
590 guint tries_count, m_idx;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
591 PurpleTrieMachine *machines;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
592 gulong found_count = 0;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
593 gsize i;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
594
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
595 if (src == NULL)
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
596 return 0;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
597
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
598 tries_count = g_slist_length((GSList*)tries);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
599 if (tries_count == 0)
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
600 return 0;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
601
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
602 /* Initialize all machines. */
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
603 machines = g_new(PurpleTrieMachine, tries_count);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
604 for (i = 0; i < tries_count; i++, tries = tries->next) {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
605 PurpleTrie *trie = tries->data;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
606 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
607
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
608 if (priv == NULL) {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
609 g_warn_if_reached();
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
610 g_free(machines);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
611 return 0;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
612 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
613
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
614 purple_trie_states_build(trie);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
615
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
616 machines[i].state = priv->root_state;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
617 machines[i].root_state = priv->root_state;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
618 machines[i].reset_on_match = priv->reset_on_match;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
619 machines[i].find_cb = find_cb;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
620 machines[i].user_data = user_data;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
621 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
622
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
623 i = 0;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
624 while (src[i] != '\0') {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
625 guchar character = src[i++];
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
626 gboolean was_found = FALSE;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
627
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
628 /* Advance every machine and possibly perform a replacement. */
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
629 for (m_idx = 0; m_idx < tries_count; m_idx++) {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
630 purple_trie_advance(&machines[m_idx], character);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
631 if (was_found)
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
632 continue;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
633 was_found =
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
634 purple_trie_find_do_discovery(&machines[m_idx]);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
635 if (was_found)
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
636 found_count++;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
637 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
638
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
639 /* If we replaced a word, reset _all_ machines */
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
640 if (was_found) {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
641 for (m_idx = 0; m_idx < tries_count; m_idx++) {
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
642 if (!machines[m_idx].reset_on_match)
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
643 continue;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
644 machines[m_idx].state =
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
645 machines[m_idx].root_state;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
646 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
647 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
648 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
649
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
650 g_free(machines);
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
651 return found_count;
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
652 }
3118fb87573e Trie: implement purple_trie_multi_find
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35773
diff changeset
653
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
654
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
655 /*******************************************************************************
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
656 * Records
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
657 ******************************************************************************/
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
658
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
659 gboolean
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
660 purple_trie_add(PurpleTrie *trie, const gchar *word, gpointer data)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
661 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
662 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
663 PurpleTrieRecord *rec;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
664
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
665 g_return_val_if_fail(priv != NULL, FALSE);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
666 g_return_val_if_fail(word != NULL, FALSE);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
667 g_return_val_if_fail(word[0] != '\0', FALSE);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
668
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
669 if (g_hash_table_lookup(priv->records_map, word) != NULL) {
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
670 purple_debug_warning("trie", "record exists: %s", word);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
671 return FALSE;
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
672 }
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
673
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
674 /* Every change in a trie invalidates longest_suffix map.
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
675 * These prefixes could be updated instead of cleaning the whole graph.
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
676 */
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
677 purple_trie_states_cleanup(trie);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
678
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
679 rec = purple_memory_pool_alloc(priv->records_obj_mempool,
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
680 sizeof(PurpleTrieRecord), sizeof(gpointer));
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
681 rec->word = purple_memory_pool_strdup(priv->records_str_mempool, word);
35658
799b62769bd3 Trie: implement search-and-replace (not yet tested)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35655
diff changeset
682 rec->word_len = strlen(word);
35664
4a2cf3314f4b The empty word case was a bad idea
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35663
diff changeset
683 g_assert(rec->word_len > 0);
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
684 rec->data = data;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
685
35667
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
686 priv->records_total_size += rec->word_len;
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
687 priv->records = purple_record_list_prepend(priv->records_obj_mempool,
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
688 priv->records, rec);
35730
07185c85c64c PurpleTrie: Fix a test
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35717
diff changeset
689 g_hash_table_insert(priv->records_map, rec->word, priv->records);
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
690
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
691 return TRUE;
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
692 }
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
693
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
694 void
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
695 purple_trie_remove(PurpleTrie *trie, const gchar *word)
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
696 {
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
697 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
698 PurpleTrieRecordList *it;
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
699
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
700 g_return_if_fail(priv != NULL);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
701 g_return_if_fail(word != NULL);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
702 g_return_if_fail(word[0] != '\0');
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
703
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
704 it = g_hash_table_lookup(priv->records_map, word);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
705 if (it == NULL)
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
706 return;
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
707
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
708 /* see purple_trie_add */
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
709 purple_trie_states_cleanup(trie);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
710
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
711 priv->records_total_size -= it->rec->word_len;
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
712 priv->records = purple_record_list_remove(priv->records, it);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
713 g_hash_table_remove(priv->records_map, it->rec->word);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
714
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
715 purple_memory_pool_free(priv->records_str_mempool, it->rec->word);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
716 purple_memory_pool_free(priv->records_obj_mempool, it->rec);
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
717 purple_memory_pool_free(priv->records_obj_mempool, it);
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
718 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
719
35717
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
720 guint
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
721 purple_trie_get_size(PurpleTrie *trie)
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
722 {
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
723 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
724
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
725 g_return_val_if_fail(priv != NULL, 0);
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
726
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
727 return g_hash_table_size(priv->records_map);
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
728 }
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
729
45bde03f86a6 Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35711
diff changeset
730
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
731 /*******************************************************************************
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
732 * API implementation
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
733 ******************************************************************************/
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
734
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
735 gboolean
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
736 purple_trie_get_reset_on_match(PurpleTrie *trie)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
737 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
738 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
739
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
740 g_return_val_if_fail(priv, FALSE);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
741
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
742 return priv->reset_on_match;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
743 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
744
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
745 void
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
746 purple_trie_set_reset_on_match(PurpleTrie *trie, gboolean reset)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
747 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
748 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
749
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
750 g_return_if_fail(priv);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
751
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
752 priv->reset_on_match = reset;
35668
ba76659ea73e Trie: add g_object_notify_by_pspec to the setter
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35667
diff changeset
753 g_object_notify_by_pspec(G_OBJECT(trie), properties[PROP_RESET_ON_MATCH]);
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
754 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
755
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
756 /*******************************************************************************
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
757 * Object stuff
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
758 ******************************************************************************/
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
759
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
760 PurpleTrie *
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
761 purple_trie_new(void)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
762 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
763 return g_object_new(PURPLE_TYPE_TRIE, NULL);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
764 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
765
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
766 static void
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
767 purple_trie_init(GTypeInstance *instance, gpointer klass)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
768 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
769 PurpleTrie *trie = PURPLE_TRIE(instance);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
770 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
771
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
772 priv->records_obj_mempool = purple_memory_pool_new();
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
773 priv->records_str_mempool = purple_memory_pool_new();
35666
ca4afaddaffa Memory pool: fix some issues
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35665
diff changeset
774 priv->states_mempool = purple_memory_pool_new();
ca4afaddaffa Memory pool: fix some issues
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35665
diff changeset
775 purple_memory_pool_set_block_size(priv->states_mempool,
35667
e198bddf2ef9 Trie: lower memory usage for smaller collections
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35666
diff changeset
776 PURPLE_TRIE_STATES_SMALL_POOL_BLOCK_SIZE);
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
777
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
778 priv->records_map = g_hash_table_new(g_str_hash, g_str_equal);
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
779 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
780
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
781 static void
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
782 purple_trie_finalize(GObject *obj)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
783 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
784 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(obj);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
785
35700
a032063e50c7 Trie: implement purple_trie_remove
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35668
diff changeset
786 g_hash_table_destroy(priv->records_map);
35653
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
787 g_object_unref(priv->records_obj_mempool);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
788 g_object_unref(priv->records_str_mempool);
b4a35c405e95 Trie: states allocation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35652
diff changeset
789 g_object_unref(priv->states_mempool);
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
790
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
791 G_OBJECT_CLASS(parent_class)->finalize(obj);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
792 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
793
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
794 static void
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
795 purple_trie_get_property(GObject *obj, guint param_id, GValue *value,
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
796 GParamSpec *pspec)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
797 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
798 PurpleTrie *trie = PURPLE_TRIE(obj);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
799 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
800
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
801 switch (param_id) {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
802 case PROP_RESET_ON_MATCH:
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
803 g_value_set_boolean(value, priv->reset_on_match);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
804 break;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
805 default:
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
806 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
807 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
808 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
809
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
810 static void
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
811 purple_trie_set_property(GObject *obj, guint param_id,
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
812 const GValue *value, GParamSpec *pspec)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
813 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
814 PurpleTrie *trie = PURPLE_TRIE(obj);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
815 PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
816
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
817 switch (param_id) {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
818 case PROP_RESET_ON_MATCH:
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
819 priv->reset_on_match = g_value_get_boolean(value);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
820 break;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
821 default:
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
822 G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
823 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
824 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
825
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
826 static void
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
827 purple_trie_class_init(PurpleTrieClass *klass)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
828 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
829 GObjectClass *obj_class = G_OBJECT_CLASS(klass);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
830
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
831 parent_class = g_type_class_peek_parent(klass);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
832
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
833 g_type_class_add_private(klass, sizeof(PurpleTriePrivate));
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
834
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
835 obj_class->finalize = purple_trie_finalize;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
836 obj_class->get_property = purple_trie_get_property;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
837 obj_class->set_property = purple_trie_set_property;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
838
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
839 properties[PROP_RESET_ON_MATCH] = g_param_spec_boolean("reset-on-match",
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
840 "Reset on match", "Determines, if the search state machine "
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
841 "should be reset to the initial state on every match. This "
35773
8c63d334ad44 Comments: PurpleTrie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35756
diff changeset
842 "ensures, that every match is distinct from each other. "
8c63d334ad44 Comments: PurpleTrie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35756
diff changeset
843 "Please note, that it's not well-defined for a replace "
8c63d334ad44 Comments: PurpleTrie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35756
diff changeset
844 "operation, so it's better to leave this value default, unless "
8c63d334ad44 Comments: PurpleTrie
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35756
diff changeset
845 "you perform only find operations.", TRUE,
35711
e27d0d775826 Trie: add missing G_PARAM_CONSTRUCT flag
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35700
diff changeset
846 G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
35651
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
847
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
848 g_object_class_install_properties(obj_class, PROP_LAST, properties);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
849 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
850
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
851 GType
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
852 purple_trie_get_type(void)
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
853 {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
854 static GType type = 0;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
855
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
856 if (G_UNLIKELY(type == 0)) {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
857 static const GTypeInfo info = {
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
858 .class_size = sizeof(PurpleTrieClass),
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
859 .class_init = (GClassInitFunc)purple_trie_class_init,
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
860 .instance_size = sizeof(PurpleTrie),
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
861 .instance_init = purple_trie_init,
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
862 };
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
863
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
864 type = g_type_register_static(G_TYPE_OBJECT,
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
865 "PurpleTrie", &info, 0);
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
866 }
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
867
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
868 return type;
95f34a3f4172 Initial trie class implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
869 }

mercurial