summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKylie McClain <somasis@exherbo.org>2016-04-27 00:09:51 -0400
committermidipix <writeonce@midipix.org>2016-04-28 17:42:51 -0400
commite201482ba7d5099e903bab4b61c4b2c22f1cd887 (patch)
treee2cadd7cbc3c0f0a31fcbc90bacf6ef0218e9ad2
parent61a679d71cd1dc35cf95bb4ded611468a9edad47 (diff)
downloadslibtool-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.
-rw-r--r--src/output/slbt_output_exec.c70
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)