diff options
author | Kylie McClain <somasis@exherbo.org> | 2016-04-27 00:09:51 -0400 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2016-04-28 17:42:51 -0400 |
commit | e201482ba7d5099e903bab4b61c4b2c22f1cd887 (patch) | |
tree | e2cadd7cbc3c0f0a31fcbc90bacf6ef0218e9ad2 /src/output/slbt_output_exec.c | |
parent | 61a679d71cd1dc35cf95bb4ded611468a9edad47 (diff) | |
download | slibtool-e201482ba7d5099e903bab4b61c4b2c22f1cd887.tar.bz2 slibtool-e201482ba7d5099e903bab4b61c4b2c22f1cd887.tar.xz |
slbt_output_exec: color+annotate output
This patch adds functionality to slbt_output_exec that colors/annotates output
if outputting to a terminal, or annotation is explicitly enabled.
Currently annotated output includes emboldening "slibtool:" and giving it a
magenta, emboldening and coloring the step (compile, link, install) green, and
then annotating the "-o <output>" argument.
Diffstat (limited to 'src/output/slbt_output_exec.c')
-rw-r--r-- | src/output/slbt_output_exec.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/output/slbt_output_exec.c b/src/output/slbt_output_exec.c index ff14064..7886e0a 100644 --- a/src/output/slbt_output_exec.c +++ b/src/output/slbt_output_exec.c @@ -4,14 +4,64 @@ /* Released under the Standard MIT License; see COPYING.SLIBTOOL. */ /*******************************************************************/ +#include <unistd.h> #include <stdio.h> #include <slibtool/slibtool.h> -int slbt_output_exec( +const char aclr_null[] = ""; +const char aclr_reset[] = "\e[0m"; +const char aclr_bold[] = "\e[1m"; + +const char aclr_green[] = "\e[32m"; +const char aclr_blue[] = "\e[34m"; +const char aclr_magenta[] = "\e[35m"; + +static int slbt_output_exec_annotated( const struct slbt_driver_ctx * dctx, const struct slbt_exec_ctx * ectx, const char * step) { + char ** parg; + const char * aclr_set; + const char * aclr_color; + const char * aclr_unset; + + if (fprintf(stdout,"%s%s%s: %s%s%s%s:%s", + aclr_bold,aclr_magenta, + dctx->program,aclr_reset, + aclr_bold,aclr_green,step,aclr_reset) < 0) + return -1; + + for (parg=ectx->argv; *parg; parg++) { + if (parg == ectx->lout[0]) { + aclr_set = aclr_bold; + aclr_color = aclr_blue; + aclr_unset = aclr_null; + } else { + aclr_set = aclr_null; + aclr_color = aclr_null; + aclr_unset = aclr_reset; + } + + if (fprintf(stdout," %s%s%s%s", + aclr_set,aclr_color, + *parg, + aclr_unset) < 0) + return -1; + + } + + if (fputc('\n',stdout) < 0) + return -1; + + return 0; +} + +static int slbt_output_exec_plain( + const struct slbt_driver_ctx * dctx, + const struct slbt_exec_ctx * ectx, + const char * step) +{ char ** parg; if (fprintf(stdout,"%s: %s:",dctx->program,step) < 0) @@ -27,6 +77,24 @@ int slbt_output_exec( return 0; } +int slbt_output_exec( + const struct slbt_driver_ctx * dctx, + const struct slbt_exec_ctx * ectx, + const char * step) +{ + if (dctx->cctx->drvflags & SLBT_DRIVER_ANNOTATE_NEVER) + return slbt_output_exec_plain(dctx,ectx,step); + + else if (dctx->cctx->drvflags & SLBT_DRIVER_ANNOTATE_ALWAYS) + return slbt_output_exec_annotated(dctx,ectx,step); + + else if (isatty(STDOUT_FILENO)) + return slbt_output_exec_annotated(dctx,ectx,step); + + else + return slbt_output_exec_plain(dctx,ectx,step); +} + int slbt_output_compile( const struct slbt_driver_ctx * dctx, const struct slbt_exec_ctx * ectx) |