int main(int argc, char **argv) { dglGraph_s graph; #define MY_MAX_COMPONENTS 1024 dglGraph_s agraphComponents[MY_MAX_COMPONENTS]; int nret, fd, i, cComponents; char szGraphOutFilename[1024]; /* program options */ char *pszGraph; char *pszGraphOut; GNO_BEGIN /* short long default variable help */ GNO_OPTION("g", "graph", NULL, &pszGraph, "Input Graph file") GNO_OPTION("o", "graphout", NULL, &pszGraphOut, "Output Graph file") GNO_END if (GNO_PARSE(argc, argv) < 0) { return 1; } /* * options parsed */ if (pszGraph == NULL || pszGraphOut == NULL) { GNO_HELP("components usage"); return 1; } printf("Graph read:\n"); if ((fd = open(pszGraph, O_RDONLY)) < 0) { perror("open"); return 1; } nret = dglRead(&graph, fd); if (nret < 0) { fprintf(stderr, "dglRead error: %s\n", dglStrerror(&graph)); return 1; } close(fd); printf("Done.\n"); printf("Graph depth components spanning:\n"); cComponents = dglDepthComponents(&graph, agraphComponents, MY_MAX_COMPONENTS, _clipper, NULL); if (cComponents < 0) { fprintf(stderr, "dglDepthSpanning error: %s\n", dglStrerror(&graph)); return 1; } printf("Done.\n"); printf("Connected Component(s) Found: %d\n", cComponents); for (i = 0; i < cComponents; i++) { printf("Component %d of %d: ", i + 1, cComponents); fflush(stdout); printf("[flatten..."); fflush(stdout); nret = dglFlatten(&agraphComponents[i]); printf("done] "); fflush(stdout); if (dglGet_EdgeCount(&agraphComponents[i]) > 0) { if (pszGraphOut) { snprintf(szGraphOutFilename, sizeof(szGraphOutFilename), "%s-component-%d", pszGraphOut, i); printf("[write <%s>...", szGraphOutFilename); fflush(stdout); if ((fd = open(szGraphOutFilename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { perror("open"); return 1; } dglWrite(&agraphComponents[i], fd); if (nret < 0) { fprintf(stderr, "dglWrite error: %s\n", dglStrerror(&graph)); return 1; } close(fd); printf("done] "); fflush(stdout); } } else { printf("component is empty. No output produced.\n"); } printf("[release..."); dglRelease(&agraphComponents[i]); printf("done]\n"); } dglRelease(&graph); return 0; }
int main(int argc, char **argv) { dglGraph_s graph; int fd; int nret; /* program options */ char *pszFilein; GNO_BEGIN /* short long default variable help */ GNO_OPTION("g", "graph", NULL, &pszFilein, "Graph file to view") GNO_END if (GNO_PARSE(argc, argv) < 0) { return 1; } /* * options parsed */ if (pszFilein == NULL) { GNO_HELP("Incomplete parameters"); return 1; } fd = open(pszFilein, O_RDONLY); if (fd < 0) { perror("open"); return 1; } nret = dglRead(&graph, fd); if (nret < 0) { fprintf(stderr, "dglRead error: %s\n", dglStrerror(&graph)); return 1; } close(fd); /* print the header */ fprintf(stdout, "Version: %d\n", graph.Version); fprintf(stdout, "Byte Order: %s\n", (graph.Endian == DGL_ENDIAN_LITTLE) ? "Little Endian" : "Big Endian"); fprintf(stdout, "Node Attribute Size: %ld\n", graph.NodeAttrSize); fprintf(stdout, "Edge Attribute Size: %ld\n", graph.EdgeAttrSize); fprintf(stdout, "Counters: %ld Edges - %ld Nodes: %ld HEAD / %ld TAIL / %ld ALONE\n", graph.cEdge, graph.cNode, graph.cHead, graph.cTail, graph.cAlone); fprintf(stdout, "Opaque Settings:\n"); fprintf(stdout, "%10ld %10ld %10ld %10ld\n", graph.aOpaqueSet[0], graph.aOpaqueSet[1], graph.aOpaqueSet[2], graph.aOpaqueSet[3]); fprintf(stdout, "%10ld %10ld %10ld %10ld\n", graph.aOpaqueSet[4], graph.aOpaqueSet[5], graph.aOpaqueSet[6], graph.aOpaqueSet[7]); fprintf(stdout, "%10ld %10ld %10ld %10ld\n", graph.aOpaqueSet[8], graph.aOpaqueSet[9], graph.aOpaqueSet[10], graph.aOpaqueSet[11]); fprintf(stdout, "%10ld %10ld %10ld %10ld\n", graph.aOpaqueSet[12], graph.aOpaqueSet[13], graph.aOpaqueSet[14], graph.aOpaqueSet[15]); fprintf(stdout, "Total Cost: %lld\n", graph.nnCost); fprintf(stdout, "--\n"); { dglInt32_t *pnode; dglNodeTraverser_s traverser; dglNode_T_Initialize(&traverser, &graph); for (pnode = dglNode_T_First(&traverser); pnode; pnode = dglNode_T_Next(&traverser)) { _print_node(&graph, pnode, stdout); } dglNode_T_Release(&traverser); } printf("\n"); dglRelease(&graph); return 0; }
int main(int argc, char **argv) { dglGraph_s graph; dglInt32_t from, to; int fd, nret, version; dglSPReport_s *pReport; dglInt32_t nDistance; dglSPCache_s spCache; ClipperContext_s clipctx, *pclipctx; /* program options */ char *pszFilein; char *pszFrom; char *pszTo; char *pszDiscard; char *pszVersion; Boolean fDistance; Boolean fUnflatten; GNO_BEGIN /*short long default variable help */ GNO_OPTION("g", "graph", NULL, &pszFilein, "graph file to view") GNO_OPTION("v", "version", NULL, &pszVersion, "alter graph version") GNO_OPTION("f", "from", NULL, &pszFrom, "from-node id") GNO_OPTION("t", "to", NULL, &pszTo, "to-node id") GNO_OPTION("d", "discard", NULL, &pszDiscard, "node to discard in clipper") GNO_SWITCH("D", "distance", False, &fDistance, "Report shortest distance only") GNO_SWITCH("U", "unflatten", False, &fUnflatten, "Unflatten the graph before processing") GNO_END if (GNO_PARSE(argc, argv) < 0) { return 1; } /* options parsed */ if (pszFilein == NULL || pszFrom == NULL || pszTo == NULL) { GNO_HELP("incomplete parameters"); return 1; } if (pszDiscard) { clipctx.node_to_discard = atol(pszDiscard); pclipctx = &clipctx; } else pclipctx = NULL; if (pszVersion) { version = atoi(pszVersion); } fd = open(pszFilein, O_RDONLY); if (fd < 0) { perror("open"); return 1; } nret = dglRead(&graph, fd); close(fd); if (nret < 0) { fprintf(stderr, "dglRead error: %s\n", dglStrerror(&graph)); return 1; } if (fUnflatten) dglUnflatten(&graph); if (pszVersion) dglSet_Version(&graph, version); from = atol(pszFrom); to = atol(pszTo); printf("shortest path: from-node %ld - to-node %ld\n\n", from, to); dglInitializeSPCache(&graph, &spCache); if (fDistance == False) { nret = dglShortestPath(&graph, &pReport, from, to, clipper, pclipctx, &spCache); if (nret == 0) { printf("destination node is unreachable\n\n"); } else if (nret < 0) { fprintf(stderr, "dglShortestPath error: %s\n", dglStrerror(&graph)); } else { int i; printf ("shortest path report: total edges %ld - total distance %ld\n", pReport->cArc, pReport->nDistance); for (i = 0; i < pReport->cArc; i++) { printf("edge[%d]: from %ld to %ld - travel cost %ld - user edgeid %ld - distance from start node %ld\n", i, pReport->pArc[i].nFrom, pReport->pArc[i].nTo, dglEdgeGet_Cost(&graph, pReport->pArc[i].pnEdge), /* this is the cost from clip() */ dglEdgeGet_Id(&graph, pReport->pArc[i].pnEdge), pReport->pArc[i].nDistance); } dglFreeSPReport(&graph, pReport); } } else { nret = dglShortestDistance(&graph, &nDistance, from, to, clipper, pclipctx, &spCache); if (nret == 0) { if (dglErrno(&graph) == 0) { printf("destination node is unreachable\n\n"); } } else if (nret < 0) { fprintf(stderr, "dglShortestDistance error: %s\n", dglStrerror(&graph)); } else { printf("shortest distance: %ld\n", nDistance); } } dglReleaseSPCache(&graph, &spCache); dglRelease(&graph); return 0; }