diff options
author | sleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2014-07-07 14:28:25 +0000 |
---|---|---|
committer | sleske <sleske@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2014-07-07 14:28:25 +0000 |
commit | a62ee7ff675945fd3882b2a1f7667ddee1758dd4 (patch) | |
tree | 5e9ec9bbf9e347cb6769f22db9138c80d79dd24a /navit/search.c | |
parent | c2a2d6c357208b045d379af41789716065d13392 (diff) | |
download | navit-a62ee7ff675945fd3882b2a1f7667ddee1758dd4.tar.gz |
Refactor:core:Extract house number interpolation to search_houseno_interpol.c
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5807 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/search.c')
-rw-r--r-- | navit/search.c | 237 |
1 files changed, 1 insertions, 236 deletions
diff --git a/navit/search.c b/navit/search.c index 5efea7221..30eeb0e5b 100644 --- a/navit/search.c +++ b/navit/search.c @@ -34,6 +34,7 @@ #include "linguistics.h" #include "geom.h" #include "util.h" +#include "search_houseno_interpol.h" #ifdef HAVE_API_ANDROID #include "android.h" @@ -57,52 +58,6 @@ struct search_list_level { GList *list,*curr,*last; }; -enum include_end_nodes { - end_nodes_yes, - end_nodes_no, -}; - -struct hn_interpol_attr { - enum attr_type house_number_interpol_attr; - int interpol_increment; - enum include_end_nodes include_end_nodes; -}; - -#define house_number_interpol_attr_END -1 -/** - * Attributes that indicate a house number interpolation, - * along with interpolation information. - */ -struct hn_interpol_attr house_number_interpol_attrs[] = { - { attr_house_number_left, 1, end_nodes_yes }, - { attr_house_number_left_odd, 2, end_nodes_yes }, - { attr_house_number_left_even, 2, end_nodes_yes }, - { attr_house_number_right, 1, end_nodes_yes }, - { attr_house_number_right_odd, 2, end_nodes_yes }, - { attr_house_number_right_even, 2, end_nodes_yes }, - { attr_house_number_interpolation_no_ends_incrmt_1, 1, end_nodes_no }, - { attr_house_number_interpolation_no_ends_incrmt_2, 2, end_nodes_no }, - { house_number_interpol_attr_END, -1, -1 }, -}; - -/** Data for a house number interpolation. */ -struct house_number_interpolation { - /** Index of interpolation attribute currently used. */ - int curr_interpol_attr_idx; - /** Interpolation increment */ - int increment; - /** Reverse interpolation? (0/1) */ - int rev; - /** First number. */ - char *first; - /** Last number. */ - char *last; - /** Include first and last node in interpolation results? */ - enum include_end_nodes include_end_nodes; - /** Current number in running interpolation. */ - char *curr; -}; - struct search_list { struct mapset *ms; struct item *item; @@ -188,23 +143,6 @@ search_list_level(enum attr_type attr_type) } } -static void -house_number_interpolation_clear_current(struct house_number_interpolation *inter) -{ - g_free(inter->first); - g_free(inter->last); - g_free(inter->curr); - inter->first=inter->last=inter->curr=NULL; - inter->increment=inter->include_end_nodes=-1; -} - -static void -house_number_interpolation_clear_all(struct house_number_interpolation *inter) -{ - inter->curr_interpol_attr_idx=0; - house_number_interpolation_clear_current(inter); -} - static char * search_fix_spaces(char *str) { @@ -701,179 +639,6 @@ search_list_street_destroy(struct search_list_street *this_) g_free(this_); } -static char * -search_next_house_number_curr_interpol_with_ends(struct house_number_interpolation *inter) -{ - dbg(1,"interpolate %s-%s %s\n",inter->first,inter->last,inter->curr); - if (!inter->first || !inter->last) - return NULL; - if (!inter->curr) - inter->curr=g_strdup(inter->first); - else { - if (strcmp(inter->curr, inter->last)) { - int next=atoi(inter->curr)+(inter->increment); - g_free(inter->curr); - if (next == atoi(inter->last)) - inter->curr=g_strdup(inter->last); - else - inter->curr=g_strdup_printf("%d",next); - } else { - g_free(inter->curr); - inter->curr=NULL; - } - } - dbg(1,"interpolate result %s\n",inter->curr); - return inter->curr; -} - -static int -house_number_is_end_number(char* house_number, struct house_number_interpolation *inter) { - return ( (!strcmp(house_number, inter->first)) - || (!strcmp(house_number, inter->last)) ); -} - -static char * -search_next_house_number_curr_interpol(struct house_number_interpolation *inter) -{ - char* hn=NULL; - switch (inter->include_end_nodes) { - case end_nodes_yes: - hn=search_next_house_number_curr_interpol_with_ends(inter); - break; - case end_nodes_no: - do { - hn=search_next_house_number_curr_interpol_with_ends(inter); - } while (hn!=NULL && house_number_is_end_number(hn, inter)); - break; - } - return hn; -} - -static void -search_house_number_interpolation_split(char *str, struct house_number_interpolation *inter) -{ - char *pos=strchr(str,'-'); - char *first,*last; - int len; - if (!pos) { - inter->first=g_strdup(str); - inter->last=g_strdup(str); - inter->rev=0; - return; - } - len=pos-str; - first=g_malloc(len+1); - strncpy(first, str, len); - first[len]='\0'; - last=g_strdup(pos+1); - dbg(1,"%s = %s - %s\n",str, first, last); - if (atoi(first) > atoi(last)) { - inter->first=last; - inter->last=first; - inter->rev=1; - } else { - inter->first=first; - inter->last=last; - inter->rev=0; - } -} - -static int -search_match(char *str, char *search, int partial) -{ - if (!partial) - return (!g_ascii_strcasecmp(str, search)); - else - return (!g_ascii_strncasecmp(str, search, strlen(search))); -} - -static struct pcoord * -search_house_number_coordinate(struct item *item, struct house_number_interpolation *inter) -{ - struct pcoord *ret=g_new(struct pcoord, 1); - ret->pro = map_projection(item->map); - dbg(1,"%s\n",item_to_name(item->type)); - if (!inter) { - struct coord c; - if (item_coord_get(item, &c, 1)) { - ret->x=c.x; - ret->y=c.y; - } else { - g_free(ret); - ret=NULL; - } - } else { - int count,max=1024; - int hn_pos,hn_length; - int inter_increment=inter->increment; - struct coord *c=g_alloca(sizeof(struct coord)*max); - item_coord_rewind(item); - count=item_coord_get(item, c, max); - hn_length=atoi(inter->last)-atoi(inter->first); - if (inter->rev) - hn_pos=atoi(inter->last)-atoi(inter->curr); - else - hn_pos=atoi(inter->curr)-atoi(inter->first); - if (count) { - int i,distance_sum=0,hn_distance; - int *distances=g_alloca(sizeof(int)*(count-1)); - dbg(1,"count=%d hn_length=%d hn_pos=%d (%s of %s-%s)\n",count,hn_length,hn_pos,inter->curr,inter->first,inter->last); - if (!hn_length) { - hn_length=2; - hn_pos=1; - } - if (count == max) - dbg(0,"coordinate overflow\n"); - for (i = 0 ; i < count-1 ; i++) { - distances[i]=navit_sqrt(transform_distance_sq(&c[i],&c[i+1])); - distance_sum+=distances[i]; - dbg(1,"distance[%d]=%d\n",i,distances[i]); - } - dbg(1,"sum=%d\n",distance_sum); -#if 0 - hn_distance=distance_sum*hn_pos/hn_length; -#else - hn_distance=(distance_sum*hn_pos+distance_sum*inter_increment/2)/(hn_length+inter_increment); -#endif - dbg(1,"hn_distance=%d\n",hn_distance); - i=0; - while (i < count-1 && hn_distance > distances[i]) - hn_distance-=distances[i++]; - dbg(1,"remaining distance=%d from %d\n",hn_distance,distances[i]); - ret->x=(c[i+1].x-c[i].x)*hn_distance/distances[i]+c[i].x; - ret->y=(c[i+1].y-c[i].y)*hn_distance/distances[i]+c[i].y; - } - } - return ret; -} - -static char * -search_next_interpolated_house_number(struct item *item, struct house_number_interpolation *inter, char *inter_match, int inter_partial) -{ - while (1) { - char *hn; - struct attr attr; - struct hn_interpol_attr curr_interpol_attr; - while((hn=search_next_house_number_curr_interpol(inter))){ - if (search_match(hn, inter_match, inter_partial)) { - return map_convert_string(item->map, hn); - } - } - - house_number_interpolation_clear_current(inter); - curr_interpol_attr=house_number_interpol_attrs[inter->curr_interpol_attr_idx]; - if (curr_interpol_attr.house_number_interpol_attr==house_number_interpol_attr_END) { - return NULL; - } - if (item_attr_get(item, curr_interpol_attr.house_number_interpol_attr, &attr)) { - search_house_number_interpolation_split(attr.u.str, inter); - inter->increment=curr_interpol_attr.interpol_increment; - inter->include_end_nodes=curr_interpol_attr.include_end_nodes; - } - inter->curr_interpol_attr_idx++; - } -} - static struct search_list_house_number * search_list_house_number_new(struct item *item, struct house_number_interpolation *inter, char *inter_match, int inter_partial) { |