diff options
author | sleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2013-09-08 22:55:26 +0000 |
---|---|---|
committer | sleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2013-09-08 22:55:26 +0000 |
commit | afb855f06797db3724aec676378a2cfdd62c5673 (patch) | |
tree | 33ff06505f0ec6881291ff6d539ef965a45bf171 /navit/speech | |
parent | 2f3d390d421f9c1e480b9c0cc0ab6fb8ca43d18e (diff) | |
download | navit-afb855f06797db3724aec676378a2cfdd62c5673.tar.gz |
Refactor:speech_cmdline:Improve var names and simplify control flow in speech_cmdline_search ify control flow in
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5634 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/speech')
-rw-r--r-- | navit/speech/cmdline/speech_cmdline.c | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/navit/speech/cmdline/speech_cmdline.c b/navit/speech/cmdline/speech_cmdline.c index 745cc8149..2f1d1c933 100644 --- a/navit/speech/cmdline/speech_cmdline.c +++ b/navit/speech/cmdline/speech_cmdline.c @@ -19,6 +19,7 @@ #include <stdlib.h> #include <string.h> +#include <limits.h> #include <glib.h> #include "config.h" #include "debug.h" @@ -58,43 +59,44 @@ static char *urldecode(char *str) } static GList * -speech_cmdline_search(GList *l, int suffix_len, const char *s, int decode) +speech_cmdline_search(GList *samples, int suffix_len, const char *text, int decode) { - GList *li=l,*ret=NULL,*tmp; - int len=0; - while (li) { - char *snd=li->data; - int snd_len; + GList *loop_samples=samples,*result=NULL,*recursion_result; + int shortest_result_length=INT_MAX; + while (loop_samples) { + char *sample_name=loop_samples->data; + int sample_name_len; if (decode) - snd=urldecode(snd); - snd_len=strlen(snd)-suffix_len; + sample_name=urldecode(sample_name); + sample_name_len=strlen(sample_name)-suffix_len; // TODO: Here we compare UTF-8 text with a filename. - // It's unclear how a case-insensitive comparison should - // work in general, so for now we only do it for ASCII - // text. - if (!g_ascii_strncasecmp(s, snd, snd_len)) { - const char *ss=s+snd_len; - while (*ss == ' ' || *ss == ',') - ss++; - dbg(1,"found %s remaining %s\n",snd,ss); - if (*ss) - tmp=speech_cmdline_search(l, suffix_len, ss, decode); - else - tmp=NULL; - if (!ret || (tmp && g_list_length(tmp) < len)) { - len=g_list_length(tmp); - g_list_free(ret); - ret=tmp; - if (!*ss || tmp) - ret=g_list_prepend(ret, li->data); - } else - g_list_free(tmp); + // It's unclear how a case-insensitive comparison should work + // in general, so for now we only do it for ASCII text. + if (!g_ascii_strncasecmp(text, sample_name, sample_name_len)) { + const char *remaining_text=text+sample_name_len; + while (*remaining_text == ' ' || *remaining_text == ',') + remaining_text++; + if (*remaining_text) { + recursion_result=speech_cmdline_search(samples, suffix_len, remaining_text, decode); + if (recursion_result && g_list_length(recursion_result) < shortest_result_length) { + g_list_free(result); + result=recursion_result; + result=g_list_prepend(result, loop_samples->data); + shortest_result_length=g_list_length(result); + } else { + g_list_free(recursion_result); + } + } else { + g_list_free(result); + result=g_list_prepend(NULL, loop_samples->data); + break; + } } if (decode) - g_free(snd); - li=g_list_next(li); + g_free(sample_name); + loop_samples=g_list_next(loop_samples); } - return ret; + return result; } #if 0 |