From 9c66012da8c3ea0f57c0fa0df81535af54881cc5 Mon Sep 17 00:00:00 2001 From: fiplox Date: Tue, 4 Jan 2022 14:14:52 +0100 Subject: [PATCH] one pdf, colors/no colors --- Makefile | 9 ++------- src/cmdline.c | 29 +++++++++++++++++++++++------ src/cmdline.ggo | 1 + src/cmdline.h | 3 +++ src/main.c | 14 ++++++++++---- src/matcom.c | 41 +++++++++++++++++++++++------------------ src/matcom.h | 2 +- src/vec.c | 40 ++++++++++++++++++++++------------------ src/vec.h | 2 +- 9 files changed, 86 insertions(+), 55 deletions(-) diff --git a/Makefile b/Makefile index d77b3b4..ab42cb9 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,6 @@ TAR = tar MKDIR = mkdir CHMOD = chmod CP = rsync -Rr -DOT = dot -Tpdf -Grankdir=LR -# DOT = sfdp -Tpdf -Grankdir=LR -Goverlap=scale EXTRAFILES = LICENSE README.md DISTFILES = $(SRCDIR) $(TESTDIR) Makefile $(EXTRAFILES) distdir = $(AUTHOR)-$(NAME)-$(VERSION) @@ -24,10 +22,7 @@ distdir = $(AUTHOR)-$(NAME)-$(VERSION) all: $(NAME) graph: - $(DOT) vgraph.dot > vgraph.pdf - $(DOT) vCC.dot > vCC.pdf - $(DOT) mcgraph.dot > mcgraph.pdf - $(DOT) mcCC.dot > mcCC.pdf + dot -Grankdir=LR -Tps:cairo:cairo graph.dot | ps2pdf - > graph.pdf debug: CFLAGS += -DDEBUG -g debug: $(NAME) @@ -53,6 +48,6 @@ clean: $(RM) $(OBJS) fclean: clean - $(RM) $(NAME) vgraph.pdf vgraph.dot mcgraph.pdf mcgraph.dot mcCC.dot mcCC.pdf vCC.dot vCC.pdf + $(RM) $(NAME) graph.dot graph.pdf .PHONY: all clean fclean re dist distdir debug diff --git a/src/cmdline.c b/src/cmdline.c index 48c6323..e0c5cac 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -38,6 +38,7 @@ const char *gengetopt_args_info_help[] = { " -V, --version Print version and exit", " -p, --path=STRING Path to the source-code directory.", " -f, --file=STRING Path to the .c file.", + " -c, --color Colors on print. (default=off)", " -m, --main-graph Generate main graph separated from other CC. (default=on)", " --print-vec Print vector graph. (default=off)", " --print-mc Print compact matrice graph. (default=off)", @@ -71,6 +72,7 @@ void clear_given (struct gengetopt_args_info *args_info) args_info->version_given = 0 ; args_info->path_given = 0 ; args_info->file_given = 0 ; + args_info->color_given = 0 ; args_info->main_graph_given = 0 ; args_info->print_vec_given = 0 ; args_info->print_mc_given = 0 ; @@ -86,6 +88,7 @@ void clear_args (struct gengetopt_args_info *args_info) args_info->path_orig = NULL; args_info->file_arg = NULL; args_info->file_orig = NULL; + args_info->color_flag = 0; args_info->main_graph_flag = 1; args_info->print_vec_flag = 0; args_info->print_mc_flag = 0; @@ -103,11 +106,12 @@ void init_args_info(struct gengetopt_args_info *args_info) args_info->version_help = gengetopt_args_info_help[1] ; args_info->path_help = gengetopt_args_info_help[2] ; args_info->file_help = gengetopt_args_info_help[3] ; - args_info->main_graph_help = gengetopt_args_info_help[4] ; - args_info->print_vec_help = gengetopt_args_info_help[5] ; - args_info->print_mc_help = gengetopt_args_info_help[6] ; - args_info->cycles_vec_help = gengetopt_args_info_help[7] ; - args_info->cycles_mc_help = gengetopt_args_info_help[8] ; + args_info->color_help = gengetopt_args_info_help[4] ; + args_info->main_graph_help = gengetopt_args_info_help[5] ; + args_info->print_vec_help = gengetopt_args_info_help[6] ; + args_info->print_mc_help = gengetopt_args_info_help[7] ; + args_info->cycles_vec_help = gengetopt_args_info_help[8] ; + args_info->cycles_mc_help = gengetopt_args_info_help[9] ; } @@ -239,6 +243,8 @@ cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) write_into_file(outfile, "path", args_info->path_orig, 0); if (args_info->file_given) write_into_file(outfile, "file", args_info->file_orig, 0); + if (args_info->color_given) + write_into_file(outfile, "color", 0, 0 ); if (args_info->main_graph_given) write_into_file(outfile, "main-graph", 0, 0 ); if (args_info->print_vec_given) @@ -500,6 +506,7 @@ cmdline_parser_internal ( { "version", 0, NULL, 'V' }, { "path", 1, NULL, 'p' }, { "file", 1, NULL, 'f' }, + { "color", 0, NULL, 'c' }, { "main-graph", 0, NULL, 'm' }, { "print-vec", 0, NULL, 0 }, { "print-mc", 0, NULL, 0 }, @@ -508,7 +515,7 @@ cmdline_parser_internal ( { 0, 0, 0, 0 } }; - c = getopt_long (argc, argv, "hVp:f:m", long_options, &option_index); + c = getopt_long (argc, argv, "hVp:f:cm", long_options, &option_index); if (c == -1) break; /* Exit from `while (1)' loop. */ @@ -547,6 +554,16 @@ cmdline_parser_internal ( additional_error)) goto failure; + break; + case 'c': /* Colors on print.. */ + + + if (update_arg((void *)&(args_info->color_flag), 0, &(args_info->color_given), + &(local_args_info.color_given), optarg, 0, 0, ARG_FLAG, + check_ambiguity, override, 1, 0, "color", 'c', + additional_error)) + goto failure; + break; case 'm': /* Generate main graph separated from other CC.. */ diff --git a/src/cmdline.ggo b/src/cmdline.ggo index e6995d9..8b305fd 100644 --- a/src/cmdline.ggo +++ b/src/cmdline.ggo @@ -6,6 +6,7 @@ By Volodymyr Patuta " option "path" p "Path to the source-code directory." string optional option "file" f "Path to the .c file." string optional +option "color" c "Colors on print." flag off option "main-graph" m "Generate main graph separated from other CC." flag on option "print-vec" - "Print vector graph." flag off option "print-mc" - "Print compact matrice graph." flag off diff --git a/src/cmdline.h b/src/cmdline.h index 77aa500..4a0a014 100644 --- a/src/cmdline.h +++ b/src/cmdline.h @@ -45,6 +45,8 @@ struct gengetopt_args_info char * file_arg; /**< @brief Path to the .c file.. */ char * file_orig; /**< @brief Path to the .c file. original value given at command line. */ const char *file_help; /**< @brief Path to the .c file. help description. */ + int color_flag; /**< @brief Colors on print. (default=off). */ + const char *color_help; /**< @brief Colors on print. help description. */ int main_graph_flag; /**< @brief Generate main graph separated from other CC. (default=on). */ const char *main_graph_help; /**< @brief Generate main graph separated from other CC. help description. */ int print_vec_flag; /**< @brief Print vector graph. (default=off). */ @@ -60,6 +62,7 @@ struct gengetopt_args_info unsigned int version_given ; /**< @brief Whether version was given. */ unsigned int path_given ; /**< @brief Whether path was given. */ unsigned int file_given ; /**< @brief Whether file was given. */ + unsigned int color_given ; /**< @brief Whether color was given. */ unsigned int main_graph_given ; /**< @brief Whether main-graph was given. */ unsigned int print_vec_given ; /**< @brief Whether print-vec was given. */ unsigned int print_mc_given ; /**< @brief Whether print-mc was given. */ diff --git a/src/main.c b/src/main.c index 3a2fcc3..ac23ed1 100644 --- a/src/main.c +++ b/src/main.c @@ -60,8 +60,11 @@ int main(int argc, char *argv[]) puts("Printing with vector:\n"); for (i = 0; i <= gv.n; ++i) { if (!gv.node[i]->call) { - printf(GREEN "CC %d:\n" RESET_COLOR, n++); - vprint(gv.node[i], &gv); + if (ai.color_flag) + printf(GREEN "CC %d:\n" RESET_COLOR, n++); + else + printf("CC %d:\n", n++); + vprint(gv.node[i], &gv, ai.color_flag); puts(""); } } @@ -72,8 +75,11 @@ int main(int argc, char *argv[]) puts("Printing with compact matrice:"); for (i = 0; i <= gmc.nbs; ++i) { if (!gmc.call[i]) { - printf(GREEN "CC %d:\n" RESET_COLOR, n++); - mcprint(gmc, i); + if (ai.color_flag) + printf(GREEN "CC %d:\n" RESET_COLOR, n++); + else + printf("CC %d:\n", n++); + mcprint(gmc, i, ai.color_flag); puts(""); } } diff --git a/src/matcom.c b/src/matcom.c index 60da178..55840af 100644 --- a/src/matcom.c +++ b/src/matcom.c @@ -84,22 +84,28 @@ int mcis_in(graph_mco g, fix_str func) return -1; } -static void mcprint_succ(graph_mco g, int succ) +static void mcprint_succ(graph_mco g, int succ, int color) { - printf(YELLOW " Succ:" RESET_COLOR CYAN " %s"RESET_COLOR"\n" , g.func[succ]); + if (color) + printf(YELLOW " Succ:" RESET_COLOR CYAN " %s"RESET_COLOR"\n" , g.func[succ]); + else + printf(" Succ: %s\n" , g.func[succ]); } -static void mcprint_edges(graph_mco g, int n) +static void mcprint_edges(graph_mco g, int n, int color) { int i, j = 0; if (g.vu[n]) return; g.vu[n] = 1; - printf(BLUE "NODE:" RESET_COLOR MAGENTA " %s\n" RESET_COLOR, g.func[n]); + if (color) + printf(BLUE "NODE:" RESET_COLOR MAGENTA " %s\n" RESET_COLOR, g.func[n]); + else + printf("NODE: %s\n", g.func[n]); for (i = 0; i <= g.nba; ++i) { if (g.vec[i].i == n) { j++; - mcprint_succ(g, g.vec[i].j); + mcprint_succ(g, g.vec[i].j, color); } } // HACK @@ -111,18 +117,18 @@ static void mcprint_edges(graph_mco g, int n) for (i = 0; i <= g.nba; ++i) { if (g.vec[i].i == n) { if (g.vec[g.vec[i].j].i != -1) - mcprint_edges(g, g.vec[i].j); + mcprint_edges(g, g.vec[i].j, color); } } } -void mcprint(graph_mco g, int n) +void mcprint(graph_mco g, int n, int color) { if (g.vu == NULL) { g.vu = calloc(g.nbs + 1, sizeof(int)); } - mcprint_edges(g, n); + mcprint_edges(g, n, color); if (g.vu) { free(g.vu); @@ -153,7 +159,7 @@ static void main_graph(FILE *fp, graph_mco g, int n) void mcdot_graph(graph_mco *g, bool main) { - FILE *fp, *fp1; + FILE *fp; int i; if (g->vu == NULL) { @@ -164,36 +170,35 @@ void mcdot_graph(graph_mco *g, bool main) } } - fp = fopen("mcgraph.dot", "w"); - fp1 = fopen("mcCC.dot", "w"); + fp = fopen("graph.dot", "a"); + // fp1 = fopen("mcCC.dot", "w"); - fprintf(fp, "digraph mcCCmain {\n"); - fprintf(fp1, "digraph mcCC {\n"); + fprintf(fp, "digraph mcCCmain {\n\tlabelloc=\"t\";\n\tlabel=\"MAIN Compact Matrice\";\n"); if (main) { fix_str m = "main"; int n = mcis_in(*g, m); if (n != -1) { main_graph(fp, *g, n); + fprintf(fp, "}\n"); } else { fprintf(stderr, "main not found.\n"); exit(1); } + fprintf(fp, "digraph mcCC {\n\tlabelloc=\"t\";\n\tlabel=\"CC Compact Matrice\";\n"); for (i = 0; i <= g->nbs; ++i) { if (!g->vu[i]) { - main_graph(fp1, *g, i); + main_graph(fp, *g, i); } } - + fprintf(fp, "}\n"); } else { write_node_dot(fp, *g); + fprintf(fp, "}\n"); } - fprintf(fp, "}"); - fprintf(fp1, "}"); fclose(fp); - fclose(fp1); } // NOTE: https://www.baeldung.com/cs/detecting-cycles-in-directed-graph diff --git a/src/matcom.h b/src/matcom.h index 2aeed0d..0554991 100644 --- a/src/matcom.h +++ b/src/matcom.h @@ -28,7 +28,7 @@ void mcinsert_func(graph_mco *g, fix_str i); void mcinsert_edge(graph_mco *g, int dep, int arr); void mcdelete_graph(graph_mco *g); int mcis_in(graph_mco g, fix_str func); -void mcprint(graph_mco g, int n); +void mcprint(graph_mco g, int n, int color); void mcdot_graph(graph_mco *g, bool main); void mcfind_cycles(graph_mco *g); diff --git a/src/vec.c b/src/vec.c index 6f7bd79..ae88e1e 100644 --- a/src/vec.c +++ b/src/vec.c @@ -66,34 +66,40 @@ int vis_in(graph_vec g, fix_str func) return -1; } -static void vprint_succ(nodept node) +static void vprint_succ(nodept node, int color) { - printf(YELLOW " Succ:" RESET_COLOR CYAN "%s\n" RESET_COLOR, node->func); + if (color) + printf(YELLOW " Succ:" RESET_COLOR CYAN "%s\n" RESET_COLOR, node->func); + else + printf(" Succ:%s\n", node->func); } -static void vprint_nodes(nodept node) +static void vprint_nodes(nodept node, int color) { int i; if (node->vu) return; node->vu = 1; - printf(BLUE "NODE:" RESET_COLOR MAGENTA" %s\n" RESET_COLOR, node->func); + if (color) + printf(BLUE "NODE:" RESET_COLOR MAGENTA " %s\n" RESET_COLOR, node->func); + else + printf("NODE: %s\n", node->func); for (i = 0; i < node->nbs; ++i) { - vprint_succ(node->succ[i]); + vprint_succ(node->succ[i], color); } for (i = 0; i < node->nbs; ++i) { if (node->succ[i]->nbs != 0) - vprint_nodes(node->succ[i]); + vprint_nodes(node->succ[i], color); } } -void vprint(nodept node, graph_vec *g) +void vprint(nodept node, graph_vec *g, int color) { int i; for (i = 0; i <= g->n; i++) { g->node[i]->vu = 0; } - vprint_nodes(node); + vprint_nodes(node, color); } static void write_node_dot(FILE *fp, graph_vec g) @@ -122,43 +128,41 @@ static void main_graph(FILE *fp, nodept node) void vdot_graph(graph_vec g, bool main) { - FILE *fp, *fp1; + FILE *fp; int i; for (i = 0; i <= g.n; i++) { g.node[i]->vu = 0; } - fp = fopen("vgraph.dot", "w"); - fp1 = fopen("vCC.dot", "w"); + fp = fopen("graph.dot", "a"); - fprintf(fp, "digraph vCCmain {\n"); - fprintf(fp1, "digraph vCC {\n"); + fprintf(fp, "digraph vCCmain {\n\tlabelloc=\"t\";\n\tlabel=\"MAIN Vector\";\n"); if (main) { fix_str m = "main"; int n = vis_in(g, m); if (n != -1) { main_graph(fp, g.node[n]); + fprintf(fp, "}\n"); } else { fprintf(stderr, "main not found.\n"); exit(1); } + fprintf(fp, "digraph vCC {\n\tlabelloc=\"t\";\n\tlabel=\"CC Vector\";\n"); for (i = 0; i <= g.n; ++i) { if (!g.node[i]->call) { - main_graph(fp1, g.node[i]); + main_graph(fp, g.node[i]); } } + fprintf(fp, "}\n"); } else { write_node_dot(fp, g); + fprintf(fp, "}\n"); } - fprintf(fp, "}"); - fprintf(fp1, "}"); - fclose(fp); - fclose(fp1); } // NOTE: https://www.baeldung.com/cs/detecting-cycles-in-directed-graph diff --git a/src/vec.h b/src/vec.h index 802b2c0..fdf9104 100644 --- a/src/vec.h +++ b/src/vec.h @@ -29,7 +29,7 @@ void vinsert_node(graph_vec *g, fix_str str); void vdelete_graph(graph_vec *g); int vis_in(graph_vec g, fix_str func); void vdot_graph(graph_vec g, bool main); -void vprint(nodept node, graph_vec *g); +void vprint(nodept node, graph_vec *g, int color); void vfind_cycles(graph_vec *g); #endif /* end of include guard: VEC_H */