From b2db01d39cf696795edd2bb300cd766cfa1c6d0e Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 16 Jun 2013 21:27:38 +0000 Subject: [PATCH] fixed searching.. --- ChangeLog | 4 +++ main/gui_search.c | 47 +++++++++++++++++++++----- mapsys/map_searchhash.c | 73 ++++++++++++++++++++++++++++++----------- 3 files changed, 95 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd5920f..76ee897 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ Version 0.0.2: name changed to spOSMroute, since on there had been another OSMroute already. ============================================================================= +(2013-06-16): +- fixed: searching for citys is back working again and this time it seems + working fine. + (2013-06-09): - fixed: utf8 will now also work in gui entry, delete and cursor movement is also working now. diff --git a/main/gui_search.c b/main/gui_search.c index 8f3deb3..d1b6a58 100644 --- a/main/gui_search.c +++ b/main/gui_search.c @@ -35,7 +35,15 @@ void gui_search_prev (); void gui_search_city (); void gui_search_switch (int pos); +struct map_search_dataex { + float distance; + char text[GUI_TEXTLEN]; +}; + struct map_search_data search_data[SEARCH_MAXRESULT]; +struct map_search_dataex search_dataex[SEARCH_MAXRESULT]; +char *search_chars[SEARCH_MAXRESULT+1]; +struct map_pos search_pos; int search_data_cnt = 0; int search_data_cur = -1; static GUIWindow wsearch = {0}; @@ -50,6 +58,8 @@ GUIItem *ws_list = NULL; GUIItem *ws_map = NULL; /* need to finish working on: gui_images and map_view */ void gui_search_show () { + int i; + if (wsearch.screen == NULL) gui_window_new (&wsearch, 220, 260, _("Search..")); wsearch.screen_changed = 1; wsearch.style = WGUI_S_VCENTER | WGUI_S_HCENTER; @@ -80,8 +90,21 @@ void gui_search_show () { /* result list */ if (ws_list == NULL) ws_list = gui_list_new (5, 55, 210, 100); + GUI_LIST_T(ws_list)->callback_selectitem = (void*) gui_search_switch; gui_window_item_add (&wsearch, ws_list); + if (gps_isrunning()) { + struct gps_data *gpsdata = gps_getposition (); + search_pos.lon = gpsdata->lon; + search_pos.lat = gpsdata->lat; + } + else { + search_pos.lon = view_lon; + search_pos.lat = view_lat; + } + + for (i = 0; i < SEARCH_MAXRESULT+1; i++) search_chars[i] = NULL; + gui_show (&wsearch); }; @@ -93,10 +116,20 @@ void gui_search_close () { void gui_search_city () { int i; + struct map_pos pos; search_data_cnt = map_search (GUI_ENTRY_T(ws_entryname)->text, search_data, SEARCH_MAXRESULT); - for (i = 0; i < search_data_cnt; i++) - d_printf (" %-3d:%s",i , search_data->name[i]); + for (i = 0; i < search_data_cnt && i < SEARCH_MAXRESULT; i++) { + pos.lon = search_data[i].lon; + pos.lat = search_data[i].lat; + search_dataex[i].distance = map_getdistance (pos, search_pos); + snprintf (search_dataex[i].text, GUI_TEXTLEN, "%4.0fkm %s", search_dataex[i].distance, search_data[i].name); + search_chars[i] = search_dataex[i].text; + + d_printf (" %-3d:%s distance:%f '%s'",i , search_data[i].name, search_dataex[i].distance, search_dataex[i].text); + } + search_chars[i] = NULL; + GUI_LIST_T(ws_list)->data = search_chars; }; @@ -106,15 +139,11 @@ void gui_search_switch (int pos) { if (search_data_cnt <= 0) search_data_cur = -1; else if (search_data_cur >= search_data_cnt) search_data_cur = 0; else if (search_data_cur < 0) search_data_cur = search_data_cnt - 1; -/* - if (search_data_cur == -1) strncpy (wsearch.labels[0].text, _("0"), GUI_TEXTLEN); - else { - snprintf (wsearch.labels[0].text, GUI_TEXTLEN, _("%d of %d"), search_data_cur+1, search_data_cnt); - strncpy (wsearch.entrys[0].text, search_data[search_data_cur].name, GUI_TEXTLEN); + + if (search_data_cur >= 0) { view_lon = search_data[search_data_cur].lon; view_lat = search_data[search_data_cur].lat; wsearch.screen_changed = 1; - wsearch.entrys[0].curpos = strlen (wsearch.entrys[0].text); draw (); - } */ + } }; diff --git a/mapsys/map_searchhash.c b/mapsys/map_searchhash.c index bd0c64a..5cca14b 100644 --- a/mapsys/map_searchhash.c +++ b/mapsys/map_searchhash.c @@ -496,33 +496,37 @@ unsigned long int maps_readpos (unsigned long int pos, struct map_search_data *d if (readsize <= 0) return -1; /* search where the current line starts (go to the left) */ - for (start = pos-realpos; start > 0; start--) +// d_printf ("start at: pos:%ld realpos:%d start:%d", pos, realpos, pos-realpos); + for (start = pos-realpos; start > 0; start--) { +// d_printf (" found:start:%-4d %x '%c' delta:%d", start, maps_line[start], maps_line[start], realpos+start-pos); if (maps_line[start] == '\n') { start++; break; } + } if (start < 0) { /* underrun buffer? */ d_printf ("maps_readpos: found no start. pos:%ld realpos:%lld", pos, realpos); return -1; } -// d_printf ("start:%d", start); +// d_printf (" maps_readpos pos:%ld start:%d delta:%d", pos, start, (realpos+start)-pos); /* search where the current line ends */ for (end = start; end < readsize && maps_line[end] != '\n'; end++); if (end >= readsize) { -// d_printf ("maps_readpos: found no end."); + d_printf ("maps_readpos: found no end."); return -1; } *data = map_search_line2data (maps_line+start); *size = end-start; +// d_printf (" size:%d", *size); - return start; + return realpos+start; }; int map_search (char *name, struct map_search_data *data, int datasize) { - uint64_t blocksize, blockstart; + uint64_t blocksize, blockstart, realstart; struct stat buf; int i, j, cmpres, k; @@ -535,34 +539,63 @@ int map_search (char *name, struct map_search_data *data, int datasize) { blocksize = buf.st_size; blockstart = 0; + /* search for name inside the data */ do { - i = maps_readpos (blocksize/2+blockstart, data, &j); - if (i < 0) { - d_printf ("map_search something went wrong. i < 0 name:%s", name); + realstart = maps_readpos (blocksize/2+blockstart, data, &j); + if (realstart < 0) { + d_printf ("map_search something went wrong. realstart < 0 name:%s", name); return 0; } - d_printf ("search blocksize:%lld blockstart:%lld i:%d j:%d", blocksize, blockstart, i, j, data->name); - d_printf ("compare: '%s' with '%s'", name, data->name); + d_printf ("search blocksize:%lld blockstart:%lld realstart:%d j:%d", blocksize, blockstart, realstart, j, data->name); if ((cmpres = strncasecmp (name, data->name, strlen (name)))> 0) { /* name is lager than data */ - blocksize = blocksize - ((i+j) - blockstart); - blockstart = i+j; + blocksize = blocksize - (realstart+j-blockstart); + blockstart = realstart+j+1; } else if (cmpres < 0) { /* name is smaller than data */ - blocksize = i - blockstart; + blocksize = realstart - blockstart; } - d_printf ("cmpres: %d", cmpres); + d_printf ("compare: '%s' with '%s' returns:%d", name, data->name, cmpres); } while (cmpres != 0 && blocksize > MAP_SEARCHLINE_LEN*2); - d_printf ("found blockstart:%lld datasize:%d, i:%d text:'%-12s'", blockstart, datasize, i, data->name); - blockstart = i-MAP_SEARCHLINE_LEN; + + /* find first data inside list, go backwards until no match found */ + d_printf ("found blockstart:%lld blocksize:%d, realstart:%ld text:'%-12s'", blockstart, blocksize, realstart, data->name); + j = 0; + if (cmpres <= 0) { + blockstart = realstart; + d_printf ("<=0 blockstart:%ld realstart:%ld name:%s", blockstart, realstart, name); + do { + realstart = maps_readpos (blockstart, data, &j); + d_printf ("blockstart:%ld realstart:%ld data->name:%s", blockstart, realstart, data->name); + blockstart = realstart-2; + cmpres = strncasecmp (name, data->name, strlen (name)); + d_printf (" cmpres:%d", cmpres); + } while (blockstart >= 0 && cmpres <= 0 && realstart >= 0); + blockstart = realstart+j; + } + else if (cmpres > 0) { + blockstart = realstart; + d_printf (">0 blockstart:%ld realstart:%ld name:%s", blockstart, realstart, name); + do { + realstart = maps_readpos (blockstart, data, &j); + d_printf ("blockstart:%ld realstart:%ld data->name:%s", blockstart, realstart, data->name); + blockstart = realstart+j; + cmpres = strncasecmp (name, data->name, strlen (name)); + d_printf (" cmpres:%d", cmpres); + } while (cmpres > 0 && realstart >= 0); + blockstart = realstart; + } + + if (realstart < 0) return 0; + if (blockstart < 0) blockstart = 0; for (i = 0, k = 0; i < datasize*2 && k < datasize; i++) { - blockstart = maps_readpos (blockstart, data+k, &j); - d_printf ("create list: k:%d i:%d blockstart:%lld j:%d", k, i, blockstart, j); - if (blockstart < 0) break; - blockstart += j; + realstart = maps_readpos (blockstart, data+k, &j); + d_printf ("create list: k:%d i:%d blockstart:%lld j:%d '%s'", k, i, blockstart, j, data[k].name); + if (realstart < 0) break; + blockstart = realstart + j; if (strncasecmp (name, data[k].name, strlen (name)) == 0) k++; }