gchar * a_vik_goto_get_search_string_for_this_place(VikWindow *vw) { if (!last_coord) return NULL; VikViewport *vvp = vik_window_viewport(vw); const VikCoord *cur_center = vik_viewport_get_center(vvp); if (vik_coord_equals(cur_center, last_coord)) { return(last_successful_goto_str); } else return NULL; }
gulong vik_track_get_dup_point_count ( const VikTrack *tr ) { gulong num = 0; GList *iter = tr->trackpoints; while ( iter ) { if ( iter->next && vik_coord_equals ( &(VIK_TRACKPOINT(iter->data)->coord), &(VIK_TRACKPOINT(iter->next->data)->coord) ) ) num++; iter = iter->next; } return num; }
void vik_track_remove_dup_points ( VikTrack *tr ) { GList *iter = tr->trackpoints; while ( iter ) { if ( iter->next && vik_coord_equals ( &(VIK_TRACKPOINT(iter->data)->coord), &(VIK_TRACKPOINT(iter->next->data)->coord) ) ) { g_free ( iter->next->data ); tr->trackpoints = g_list_delete_link ( tr->trackpoints, iter->next ); } else iter = iter->next; } }
/* starting at the end, looks backwards for the last "double point", a duplicate trackpoint. * If there is no double point, deletes all the trackpoints. * Returns the new end of the track (or the start if there are no double points) */ VikCoord *vik_track_cut_back_to_double_point ( VikTrack *tr ) { GList *iter = tr->trackpoints; VikCoord *rv; if ( !iter ) return NULL; while ( iter->next ) iter = iter->next; while ( iter->prev ) { if ( vik_coord_equals((VikCoord *)iter->data, (VikCoord *)iter->prev->data) ) { GList *prev = iter->prev; rv = g_malloc(sizeof(VikCoord)); *rv = *((VikCoord *) iter->data); /* truncate trackpoint list */ iter->prev = NULL; /* pretend it's the end */ g_list_foreach ( iter, (GFunc) g_free, NULL ); g_list_free( iter ); prev->next = NULL; return rv; } iter = iter->prev; } /* no double point found! */ rv = g_malloc(sizeof(VikCoord)); *rv = *((VikCoord *) tr->trackpoints->data); g_list_foreach ( tr->trackpoints, (GFunc) g_free, NULL ); g_list_free( tr->trackpoints ); tr->trackpoints = NULL; return rv; }