Wed, 20 Jun 2018 02:13:44 -0400
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 | } |