annotate mcabber/src/compl.c @ 147:7571de4aed73

[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
author mikael
date Fri, 29 Apr 2005 19:56:28 +0000
parents 94b251102069
children d5ae42cbe1fa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
1 /*
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
2 * compl.c -- Completion system
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
3 *
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
5 *
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
10 *
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
15 *
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
19 * USA
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
20 */
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
21
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
22 /* Usage, basically:
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
23 * - new_completion(); // 1. Initialization
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
24 * - complete(); // 2. 1st completion
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
25 * - cancel_completion(); // 3a. 2nd completion / cancel previous
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
26 * - complete(); // 3b. 2nd completion / complete
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
27 * ...
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
28 * - done_completion(); // n. finished -- free allocated areas
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
29 *
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
30 */
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
31
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
32 #include <string.h>
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
33
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
34 #include "compl.h"
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
35
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
36 // Completion structure
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
37 typedef struct {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
38 GSList *list; // list of matches
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
39 guint len_prefix; // length of text already typed by the user
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
40 guint len_compl; // length of the last completion
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
41 GSList *next; // pointer to next completion to try
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
42 } compl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
43
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
44 // Category structure
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
45 typedef struct {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
46 guint flag;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
47 GSList *words;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
48 } category;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
49
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
50 static GSList *Categories;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
51 static compl *InputCompl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
52
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
53 // XXX Should not be there (?)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
54 // jid_list(type)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
55 // Returns a list of jid's. If type is COMPL_URLJID, urls are surrounded with
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
56 // '<' and '>'.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
57 GSList *jid_list(guint type) // bool urlstyle?
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
58 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
59 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
60
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
61 // new_completion(prefix, compl_cat)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
62 // . prefix = beginning of the word, typed by the user
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
63 // . compl_cat = pointer to a completion category list (list of *char)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
64 // Returns a pointer to an allocated compl structure. This structure should
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
65 // be freed by the caller when not used anymore.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
66 //compl *new_completion(char *prefix, GSList *compl_cat)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
67 void new_completion(char *prefix, GSList *compl_cat)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
68 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
69 compl *c;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
70 GSList *sl_cat;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
71 int len = strlen(prefix);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
72
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
73 if (InputCompl) { // This should not happen, but hey...
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
74 cancel_completion();
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
75 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
76
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
77 c = g_new0(compl, 1);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
78 // Build the list of matches
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
79 for (sl_cat=compl_cat; sl_cat; sl_cat = g_slist_next(sl_cat)) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
80 char *word = sl_cat->data;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
81 if (!strncasecmp(prefix, word, len)) {
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
82 if (strlen(word) != len)
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
83 c->list = g_slist_append(c->list, g_strdup(word+len)); // TODO sort
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
84 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
85 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
86 c->next = c->list;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
87 InputCompl = c;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
88 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
89
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
90 // done_completion();
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
91 void done_completion(void)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
92 {
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
93 if (!InputCompl) return;
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
94
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
95 // TODO free everything
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
96 g_slist_free(InputCompl->list);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
97 g_free(InputCompl);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
98 InputCompl = NULL;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
99 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
100
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
101 // cancel_completion()
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
102 // Returns the number of chars to delete to cancel the completion
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
103 //guint cancel_completion(compl *c)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
104 guint cancel_completion(void)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
105 {
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
106 if (!InputCompl) return 0;
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
107 return InputCompl->len_compl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
108 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
109
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
110 // Returns pointer to text to insert, NULL if no completion.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
111 const char *complete()
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
112 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
113 compl* c = InputCompl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
114 char *r;
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
115
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
116 if (!InputCompl) return NULL;
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
117
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
118 if (!c->next) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
119 c->next = c->list; // back to the beginning
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
120 c->len_compl = 0;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
121 return NULL;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
122 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
123 r = (char*)c->next->data;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
124 c->next = g_slist_next(c->next);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
125 c->len_compl = strlen(r);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
126 return r;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
127 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
128
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
129
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
130 /* Categories functions */
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
131
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
132 // compl_add_category_word(categ, command)
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
133 // Adds a keyword as a possible completion in category categ.
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
134 void compl_add_category_word(guint categ, const char *word)
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
135 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
136 GSList *sl_cat;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
137 category *cat;
121
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
138 char *nword;
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
139 // Look for category
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
140 for (sl_cat=Categories; sl_cat; sl_cat = g_slist_next(sl_cat)) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
141 if (categ == ((category*)sl_cat->data)->flag)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
142 break;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
143 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
144 if (!sl_cat) { // Category not found, let's create it
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
145 cat = g_new0(category, 1);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
146 cat->flag = categ;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
147 Categories = g_slist_append(Categories, cat);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
148 } else
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
149 cat = (category*)sl_cat->data;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
150
121
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
151 // If word is not space-terminated, we add one trailing space
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
152 for (nword = (char*)word; *nword; nword++)
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
153 ;
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
154 if (nword > word) nword--;
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
155 if (*nword != ' ') { // Add a space
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
156 nword = g_new(char, strlen(word)+2);
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
157 strcpy(nword, word);
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
158 strcat(nword, " ");
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
159 } else { // word is fine
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
160 nword = g_strdup(word);
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
161 }
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
162
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
163 // TODO Check word does not already exist
121
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
164 cat->words = g_slist_append(cat->words, nword); // TODO sort
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
165 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
166
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
167 // compl_get_category_list()
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
168 // Returns a slist of all words in the categories specified by the given flags
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
169 GSList *compl_get_category_list(guint cat_flags)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
170 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
171 GSList *sl_cat;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
172 // Look for category
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
173 // XXX Actually that's not that simple... cat_flags can be a combination
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
174 // of several flags!
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
175 for (sl_cat=Categories; sl_cat; sl_cat = g_slist_next(sl_cat)) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
176 if (cat_flags == ((category*)sl_cat->data)->flag)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
177 break;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
178 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
179 if (sl_cat) // Category was found, easy...
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
180 return ((category*)sl_cat->data)->words;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
181
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
182 // TODO handle dynamic SLists :)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
183 return NULL;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
184 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
185