summaryrefslogtreecommitdiff
path: root/vchat-user.c
diff options
context:
space:
mode:
authorDirk Engling <erdgeist@erdgeist.org>2014-01-05 21:23:39 +0100
committerDirk Engling <erdgeist@erdgeist.org>2014-01-05 21:23:39 +0100
commitb6fdcbeb3ea50e0051749dc552ffb7a736d3c8e1 (patch)
tree09171f25965722a710b7a8ed50c173ee372f7d79 /vchat-user.c
parentf409a5e841d91237fe4034818955dd88167a679b (diff)
Dict handling to allow custom completion from user dictionary
Diffstat (limited to 'vchat-user.c')
-rwxr-xr-xvchat-user.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/vchat-user.c b/vchat-user.c
index ce36220..d7261d6 100755
--- a/vchat-user.c
+++ b/vchat-user.c
@@ -30,6 +30,9 @@ static char *g_nick; //< own nick
30static int g_channel; //< own channel 30static int g_channel; //< own channel
31unsigned int ul_case_first = 0; 31unsigned int ul_case_first = 0;
32 32
33static char **g_dict;
34static size_t g_dict_len;
35
33static int ul_nick_lookup( const char *nick, int *exact_match ) { 36static int ul_nick_lookup( const char *nick, int *exact_match ) {
34 int i; 37 int i;
35 38
@@ -206,6 +209,15 @@ void ul_public_action(char *name) {
206 g_users[base].last_public = ul_now(); 209 g_users[base].last_public = ul_now();
207} 210}
208 211
212void ul_add_to_dict(char *dict_items) {
213 char *i;
214 for(i=strtok(dict_items," ");i;i=strtok(0," ")) {
215 g_dict = realloc( g_dict, sizeof(char*) * ( 1 + g_dict_len ) );
216 if( !g_dict ) exit(1);
217 g_dict[g_dict_len++] = strdup(i);
218 }
219}
220
209/* Finding users ul_finduser? */ 221/* Finding users ul_finduser? */
210char * ul_match_user(char *regex) { 222char * ul_match_user(char *regex) {
211 char *dest = tmpstr; 223 char *dest = tmpstr;
@@ -327,15 +339,21 @@ static int ul_compare_middle_case( const void *a, const void *b ) {
327/* Nick completion function for readline */ 339/* Nick completion function for readline */
328char **ul_complete_user(char *text, int start, int end ) { 340char **ul_complete_user(char *text, int start, int end ) {
329 char **result = 0; 341 char **result = 0;
330 int i, result_count = 0; 342 int i, result_count = 0, dict_result_count = 0;
331 343
332 /* Never want readline to complete filenames */ 344 /* Never want readline to complete filenames */
333 rl_attempted_completion_over = 1; 345 rl_attempted_completion_over = 1;
334 346
347 /* Check for amount of custom dict matches */
348 if( end && ( start != end ) )
349 for( i=0; i<g_dict_len; ++i )
350 if( !strncasecmp( g_dict[i], text+start, end-start ) )
351 ++dict_result_count;
352
335 /* Prepare return array ... of max g_users_count (char*) 353 /* Prepare return array ... of max g_users_count (char*)
336 Plus least common prefix in [0] and null terminator 354 Plus least common prefix in [0] and null terminator
337 */ 355 */
338 result = malloc( sizeof(char*) * ( 2 + g_users_count ) ); 356 result = malloc( sizeof(char*) * ( 2 + g_users_count + dict_result_count ) );
339 if( !result ) return 0; 357 if( !result ) return 0;
340 358
341 if( start == 0 && end == 0 ) { 359 if( start == 0 && end == 0 ) {
@@ -365,6 +383,14 @@ char **ul_complete_user(char *text, int start, int end ) {
365 snprintf( tmpstr, TMPSTRSIZE, "%s:", g_users[i].nick ); 383 snprintf( tmpstr, TMPSTRSIZE, "%s:", g_users[i].nick );
366 result[++result_count] = strdup(tmpstr); 384 result[++result_count] = strdup(tmpstr);
367 } 385 }
386
387 /* Copy matches from personal dict to the end */
388 for( i=0; i<g_dict_len; ++i )
389 if( !strncasecmp( g_dict[i], tmpstr, end-start ) ) {
390 snprintf( tmpstr, TMPSTRSIZE, "%s:", g_dict[i] );
391 result[++result_count] = strdup(tmpstr);
392 }
393
368 /* Copy common prefix */ 394 /* Copy common prefix */
369 if( result_count ) result[0] = strndup(text, end); 395 if( result_count ) result[0] = strndup(text, end);
370 } else if( start != end ) { 396 } else if( start != end ) {
@@ -380,6 +406,12 @@ char **ul_complete_user(char *text, int start, int end ) {
380 for( i=0; i<g_users_count; ++i ) 406 for( i=0; i<g_users_count; ++i )
381 if( !strncasecmp( g_users[i].nick, tmpstr, end - start ) ) 407 if( !strncasecmp( g_users[i].nick, tmpstr, end - start ) )
382 result[++result_count] = strdup(g_users[i].nick); 408 result[++result_count] = strdup(g_users[i].nick);
409
410 /* Copy matches from personal dict to the end */
411 for( i=0; i<g_dict_len; ++i )
412 if( !strncasecmp( g_dict[i], tmpstr, end-start ) )
413 result[++result_count] = strdup(g_dict[i]);
414
383 /* Copy common prefix */ 415 /* Copy common prefix */
384 if( result_count ) result[0] = strndup(text, end - start); 416 if( result_count ) result[0] = strndup(text, end - start);
385 } /* else: completion of an empty word in the middle yields nothing */ 417 } /* else: completion of an empty word in the middle yields nothing */