summaryrefslogtreecommitdiff
path: root/navit/speech
diff options
context:
space:
mode:
authorsleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-09-08 22:55:26 +0000
committersleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-09-08 22:55:26 +0000
commitafb855f06797db3724aec676378a2cfdd62c5673 (patch)
tree33ff06505f0ec6881291ff6d539ef965a45bf171 /navit/speech
parent2f3d390d421f9c1e480b9c0cc0ab6fb8ca43d18e (diff)
downloadnavit-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.c64
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