fixed searching..

master
steffen 13 years ago
parent 9ecdcbcd13
commit b2db01d39c

@ -1,6 +1,10 @@
Version 0.0.2: name changed to spOSMroute, since on there had been another Version 0.0.2: name changed to spOSMroute, since on there had been another
OSMroute already. OSMroute already.
============================================================================= =============================================================================
(2013-06-16):
- fixed: searching for citys is back working again and this time it seems
working fine.
(2013-06-09): (2013-06-09):
- fixed: utf8 will now also work in gui entry, delete and cursor movement - fixed: utf8 will now also work in gui entry, delete and cursor movement
is also working now. is also working now.

@ -35,7 +35,15 @@ void gui_search_prev ();
void gui_search_city (); void gui_search_city ();
void gui_search_switch (int pos); 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_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_cnt = 0;
int search_data_cur = -1; int search_data_cur = -1;
static GUIWindow wsearch = {0}; 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 */ GUIItem *ws_map = NULL; /* need to finish working on: gui_images and map_view */
void gui_search_show () { void gui_search_show () {
int i;
if (wsearch.screen == NULL) gui_window_new (&wsearch, 220, 260, _("Search..")); if (wsearch.screen == NULL) gui_window_new (&wsearch, 220, 260, _("Search.."));
wsearch.screen_changed = 1; wsearch.screen_changed = 1;
wsearch.style = WGUI_S_VCENTER | WGUI_S_HCENTER; wsearch.style = WGUI_S_VCENTER | WGUI_S_HCENTER;
@ -80,8 +90,21 @@ void gui_search_show () {
/* result list */ /* result list */
if (ws_list == NULL) ws_list = gui_list_new (5, 55, 210, 100); 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); 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); gui_show (&wsearch);
}; };
@ -93,10 +116,20 @@ void gui_search_close () {
void gui_search_city () { void gui_search_city () {
int i; int i;
struct map_pos pos;
search_data_cnt = map_search (GUI_ENTRY_T(ws_entryname)->text, search_data, SEARCH_MAXRESULT); search_data_cnt = map_search (GUI_ENTRY_T(ws_entryname)->text, search_data, SEARCH_MAXRESULT);
for (i = 0; i < search_data_cnt; i++) for (i = 0; i < search_data_cnt && i < SEARCH_MAXRESULT; i++) {
d_printf (" %-3d:%s",i , search_data->name[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; 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 >= search_data_cnt) search_data_cur = 0;
else if (search_data_cur < 0) search_data_cur = search_data_cnt - 1; 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); if (search_data_cur >= 0) {
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);
view_lon = search_data[search_data_cur].lon; view_lon = search_data[search_data_cur].lon;
view_lat = search_data[search_data_cur].lat; view_lat = search_data[search_data_cur].lat;
wsearch.screen_changed = 1; wsearch.screen_changed = 1;
wsearch.entrys[0].curpos = strlen (wsearch.entrys[0].text);
draw (); draw ();
} */ }
}; };

@ -496,33 +496,37 @@ unsigned long int maps_readpos (unsigned long int pos, struct map_search_data *d
if (readsize <= 0) return -1; if (readsize <= 0) return -1;
/* search where the current line starts (go to the left) */ /* 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') { if (maps_line[start] == '\n') {
start++; start++;
break; break;
} }
}
if (start < 0) { /* underrun buffer? */ if (start < 0) { /* underrun buffer? */
d_printf ("maps_readpos: found no start. pos:%ld realpos:%lld", pos, realpos); d_printf ("maps_readpos: found no start. pos:%ld realpos:%lld", pos, realpos);
return -1; 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 */ /* search where the current line ends */
for (end = start; end < readsize && maps_line[end] != '\n'; end++); for (end = start; end < readsize && maps_line[end] != '\n'; end++);
if (end >= readsize) { if (end >= readsize) {
// d_printf ("maps_readpos: found no end."); d_printf ("maps_readpos: found no end.");
return -1; return -1;
} }
*data = map_search_line2data (maps_line+start); *data = map_search_line2data (maps_line+start);
*size = end-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) { int map_search (char *name, struct map_search_data *data, int datasize) {
uint64_t blocksize, blockstart; uint64_t blocksize, blockstart, realstart;
struct stat buf; struct stat buf;
int i, j, cmpres, k; 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; blocksize = buf.st_size;
blockstart = 0; blockstart = 0;
/* search for name inside the data */
do { do {
i = maps_readpos (blocksize/2+blockstart, data, &j); realstart = maps_readpos (blocksize/2+blockstart, data, &j);
if (i < 0) { if (realstart < 0) {
d_printf ("map_search something went wrong. i < 0 name:%s", name); d_printf ("map_search something went wrong. realstart < 0 name:%s", name);
return 0; return 0;
} }
d_printf ("search blocksize:%lld blockstart:%lld i:%d j:%d", blocksize, blockstart, i, j, data->name); d_printf ("search blocksize:%lld blockstart:%lld realstart:%d j:%d", blocksize, blockstart, realstart, j, data->name);
d_printf ("compare: '%s' with '%s'", name, data->name);
if ((cmpres = strncasecmp (name, data->name, strlen (name)))> 0) { if ((cmpres = strncasecmp (name, data->name, strlen (name)))> 0) {
/* name is lager than data */ /* name is lager than data */
blocksize = blocksize - ((i+j) - blockstart); blocksize = blocksize - (realstart+j-blockstart);
blockstart = i+j; blockstart = realstart+j+1;
} }
else if (cmpres < 0) { else if (cmpres < 0) {
/* name is smaller than data */ /* 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); } 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; if (blockstart < 0) blockstart = 0;
for (i = 0, k = 0; i < datasize*2 && k < datasize; i++) { for (i = 0, k = 0; i < datasize*2 && k < datasize; i++) {
blockstart = maps_readpos (blockstart, data+k, &j); realstart = maps_readpos (blockstart, data+k, &j);
d_printf ("create list: k:%d i:%d blockstart:%lld j:%d", k, i, blockstart, j); d_printf ("create list: k:%d i:%d blockstart:%lld j:%d '%s'", k, i, blockstart, j, data[k].name);
if (blockstart < 0) break; if (realstart < 0) break;
blockstart += j; blockstart = realstart + j;
if (strncasecmp (name, data[k].name, strlen (name)) == 0) k++; if (strncasecmp (name, data[k].name, strlen (name)) == 0) k++;
} }

Loading…
Cancel
Save