#include #include #include #include "dijkstrasearch.h" #include #include "geojson.h" #include "logging.h" void add_test_map(GList **nodes, GList **paths) { dijkstra_path_new_to_list(nodes, paths, 0,0, 0,10, "Vertical", 1); dijkstra_path_new_to_list(nodes, paths, 0,5, 10,5, "Horizontal", 1); } void help(const char *exec) { fprintf(stderr, "Usage: %s [OPTION] [FILE]...\n" "Start the lifo-dijkstraserv routing server.\n\n" " -s\tset output to silent\n" " -v\tincrease verbosity. Maybe used multiple times.\n" " -p\tport number (default 6802)\n", exec); } int main(int argc, char *argv[]) { int opt; int i; GList *nodes = NULL; GList *paths = NULL; GList *l = NULL; struct dijkstra_node *node; struct dijkstra_path *path; set_log_level(LL_INFO); // Process arguments while((opt = getopt(argc, argv, "vs")) != -1) { switch(opt) { case 'v': set_log_level(get_log_level() + 1); break; case 's': set_log_level(0); break; case ':': case '?': help(argv[0]); return 1; default: break; } } if (optind == argc) { help(argv[0]); return 1; } /* Parse file list */ for (i = optind; i < argc; ++i) { add_geojson_to_dijkstra(&nodes, &paths, argv[i]); } // add_test_map(&nodes, &paths); if (should_report(LL_NOISY)) { for (l = nodes; l != NULL; l = l->next) { node = (struct dijkstra_node*) l->data; printf("Node %p: %f,\t%f [%d paths]\n", node, node->position.x, node->position.y, g_list_length(node->paths)); } printf("\n"); for (l = paths; l != NULL; l = l->next) { path = (struct dijkstra_path*) l->data; printf("Path %p: %p (%f,%f) -> %p (%f,%f) \t\"%s\"\n", path, path->source, path->source->position.x, path->source->position.y, path->destination, path->destination->position.x, path->destination->position.y, path->name); } printf("\n"); } report(LL_INFO, "Created graph with %d nodes and %d paths.", g_list_length(nodes), g_list_length(paths)); // Free memory for (l = paths; l != NULL; l = l->next) { path = (struct dijkstra_path*) l->data; // TODO: free(path->name); // Currently, we reuse the existing memory block when for the // name when cloning streets. As such, clearing it here will // cause a double free if the street has been split. free(path); } g_list_free(paths); for (l = nodes; l != NULL; l = l->next) { node = (struct dijkstra_node*) l->data; free(node); } g_list_free(nodes); return 0; }