mcabber/src/compl.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 27 Aug 2005 11:21:27 +0200
changeset 403 17aa60c6dc63
parent 393 f8f3c7493457
child 501 7c1ca00070e8
permissions -rw-r--r--
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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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