annotate mcabber/src/compl.c @ 403:17aa60c6dc63

Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 27 Aug 2005 11:21:27 +0200
parents f8f3c7493457
children 7c1ca00070e8
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
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 284
diff changeset
3 *
94
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"
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
35 #include "roster.h"
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
36
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
37 // Completion structure
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
38 typedef struct {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
39 GSList *list; // list of matches
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
40 guint len_prefix; // length of text already typed by the user
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
41 guint len_compl; // length of the last completion
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
42 GSList *next; // pointer to next completion to try
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
43 } compl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
44
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
45 // Category structure
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
46 typedef struct {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
47 guint flag;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
48 GSList *words;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
49 } category;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
50
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
51 static GSList *Categories;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
52 static compl *InputCompl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
53
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
54 // new_completion(prefix, compl_cat)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
55 // . prefix = beginning of the word, typed by the user
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
56 // . compl_cat = pointer to a completion category list (list of *char)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
57 // Returns a pointer to an allocated compl structure. This structure should
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
58 // be freed by the caller when not used anymore.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
59 void new_completion(char *prefix, GSList *compl_cat)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
60 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
61 compl *c;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
62 GSList *sl_cat;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
63 int len = strlen(prefix);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
64
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
65 if (InputCompl) { // This should not happen, but hey...
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
66 cancel_completion();
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
67 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
68
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
69 c = g_new0(compl, 1);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
70 // Build the list of matches
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
71 for (sl_cat=compl_cat; sl_cat; sl_cat = g_slist_next(sl_cat)) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
72 char *word = sl_cat->data;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
73 if (!strncasecmp(prefix, word, len)) {
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
74 if (strlen(word) != len)
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
75 c->list = g_slist_append(c->list, g_strdup(word+len)); // TODO sort
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
76 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
77 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
78 c->next = c->list;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
79 InputCompl = c;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
80 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
81
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
82 // done_completion();
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
83 void done_completion(void)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
84 {
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
85 if (!InputCompl) return;
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
86
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
87 // TODO free everything
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
88 g_slist_free(InputCompl->list);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
89 g_free(InputCompl);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
90 InputCompl = NULL;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
91 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
92
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
93 // cancel_completion()
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
94 // Returns the number of chars to delete to cancel the completion
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
95 //guint cancel_completion(compl *c)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
96 guint cancel_completion(void)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
97 {
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
98 if (!InputCompl) return 0;
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
99 return InputCompl->len_compl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
100 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
101
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
102 // Returns pointer to text to insert, NULL if no completion.
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
103 const char *complete()
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
104 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
105 compl* c = InputCompl;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
106 char *r;
98
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
107
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
108 if (!InputCompl) return NULL;
f20831f7d349 [/trunk] Changeset 112 by mikael
mikael
parents: 95
diff changeset
109
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
110 if (!c->next) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
111 c->next = c->list; // back to the beginning
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
112 c->len_compl = 0;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
113 return NULL;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
114 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
115 r = (char*)c->next->data;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
116 c->next = g_slist_next(c->next);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
117 c->len_compl = strlen(r);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
118 return r;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
119 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
120
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
121
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
122 /* Categories functions */
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
123
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
124 // compl_add_category_word(categ, command)
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
125 // Adds a keyword as a possible completion in category categ.
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
126 void compl_add_category_word(guint categ, const char *word)
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
127 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
128 GSList *sl_cat;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
129 category *cat;
121
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
130 char *nword;
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
131 // Look for category
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
132 for (sl_cat=Categories; sl_cat; sl_cat = g_slist_next(sl_cat)) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
133 if (categ == ((category*)sl_cat->data)->flag)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
134 break;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
135 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
136 if (!sl_cat) { // Category not found, let's create it
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
137 cat = g_new0(category, 1);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
138 cat->flag = categ;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
139 Categories = g_slist_append(Categories, cat);
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
140 } else
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
141 cat = (category*)sl_cat->data;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
142
121
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
143 // If word is not space-terminated, we add one trailing space
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
144 for (nword = (char*)word; *nword; nword++)
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
145 ;
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
146 if (nword > word) nword--;
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
147 if (*nword != ' ') { // Add a space
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
148 nword = g_new(char, strlen(word)+2);
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
149 strcpy(nword, word);
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
150 strcat(nword, " ");
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
151 } else { // word is fine
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
152 nword = g_strdup(word);
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
153 }
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
154
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
155 // TODO Check word does not already exist
121
94b251102069 [/trunk] Changeset 134 by mikael
mikael
parents: 104
diff changeset
156 cat->words = g_slist_append(cat->words, nword); // TODO sort
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
157 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
158
284
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
159 // compl_del_category_word(categ, command)
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
160 // Removes a keyword from category categ in completion list.
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
161 void compl_del_category_word(guint categ, const char *word)
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
162 {
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
163 GSList *sl_cat, *sl_elt;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
164 category *cat;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
165 char *nword;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
166 // Look for category
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
167 for (sl_cat=Categories; sl_cat; sl_cat = g_slist_next(sl_cat)) {
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
168 if (categ == ((category*)sl_cat->data)->flag)
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
169 break;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
170 }
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
171 if (!sl_cat) return; // Category not found, finished!
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
172
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
173 cat = (category*)sl_cat->data;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
174
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
175 // If word is not space-terminated, we add one trailing space
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
176 for (nword = (char*)word; *nword; nword++)
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
177 ;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
178 if (nword > word) nword--;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
179 if (*nword != ' ') { // Add a space
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
180 nword = g_new(char, strlen(word)+2);
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
181 strcpy(nword, word);
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
182 strcat(nword, " ");
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
183 } else { // word is fine
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
184 nword = g_strdup(word);
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
185 }
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
186
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
187 sl_elt = cat->words;
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
188 while (sl_elt) {
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
189 if (!strcasecmp((char*)sl_elt->data, nword)) {
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
190 g_free(sl_elt->data);
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
191 cat->words = g_slist_delete_link(cat->words, sl_elt);
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
192 break; // Only remove first occurence
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
193 }
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
194 sl_elt = g_slist_next(sl_elt);
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
195 }
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
196 }
f879b17ecb8e Add compl_del_category_word()
Mikael Berthe <mikael@lilotux.net>
parents: 225
diff changeset
197
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
198 // compl_get_category_list()
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
199 // 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
200 GSList *compl_get_category_list(guint cat_flags)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
201 {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
202 GSList *sl_cat;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
203 // Look for category
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
204 // XXX Actually that's not that simple... cat_flags can be a combination
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
205 // of several flags!
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
206 for (sl_cat=Categories; sl_cat; sl_cat = g_slist_next(sl_cat)) {
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
207 if (cat_flags == ((category*)sl_cat->data)->flag)
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
208 break;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
209 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
210 if (sl_cat) // Category was found, easy...
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
211 return ((category*)sl_cat->data)->words;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
212
225
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
213 // Handle dynamic SLists
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
214 if (cat_flags == COMPL_GROUPNAME) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
215 return compl_list(ROSTER_TYPE_GROUP);
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
216 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
217 if (cat_flags == COMPL_JID) {
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
218 return compl_list(ROSTER_TYPE_USER);
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
219 }
d5ae42cbe1fa [/trunk] Changeset 237 by mikael
mikael
parents: 121
diff changeset
220
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
221 return NULL;
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
222 }
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents:
diff changeset
223