From d4c3e3af3e27781da414714e63ef52c9c711e1b6 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 3 Apr 2021 20:07:59 +0000 Subject: driver: always respect the NO_COLOR envvar & SLBT_DRIVER_ANNOTATE_NEVER flag. --- src/driver/slbt_amain.c | 11 +++++++++-- src/driver/slbt_driver_ctx.c | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/driver/slbt_amain.c b/src/driver/slbt_amain.c index 0e6456e..78a0973 100644 --- a/src/driver/slbt_amain.c +++ b/src/driver/slbt_amain.c @@ -5,9 +5,11 @@ /*******************************************************************/ #include +#include #include #include #include +#include #include #include "slibtool_driver_impl.h" #include "slibtool_dprintf_impl.h" @@ -43,6 +45,9 @@ static ssize_t slbt_version(struct slbt_driver_ctx * dctx, int fdout) verclr = isatty(fdout) ? slbt_ver_color : slbt_ver_plain; gitver = strcmp(verinfo->commit,"unknown"); + if (dctx->cctx->drvflags & SLBT_DRIVER_ANNOTATE_NEVER) + verclr = slbt_ver_plain; + return slbt_dprintf(fdout,vermsg, verclr[0],dctx->program,verclr[1], verclr[2],verinfo->major,verinfo->minor, @@ -89,6 +94,7 @@ int slbt_main(char ** argv, char ** envp, const struct slbt_fd_ctx * fdctx) const char * harg; int fdout; uint64_t flags; + uint64_t noclr; struct slbt_driver_ctx * dctx; char * program; char * dash; @@ -96,6 +102,7 @@ int slbt_main(char ** argv, char ** envp, const struct slbt_fd_ctx * fdctx) flags = SLBT_DRIVER_FLAGS; fdout = fdctx ? fdctx->fdout : STDOUT_FILENO; + noclr = getenv("NO_COLOR") ? SLBT_DRIVER_ANNOTATE_NEVER : 0; /* harg */ harg = (!argv || !argv[0] || !argv[1] || argv[2]) @@ -112,7 +119,7 @@ int slbt_main(char ** argv, char ** envp, const struct slbt_fd_ctx * fdctx) sargv[3] = ""; sargv[4] = 0; - return (slbt_get_driver_ctx(sargv,envp,flags,fdctx,&dctx)) + return (slbt_get_driver_ctx(sargv,envp,flags|noclr,fdctx,&dctx)) ? SLBT_ERROR : (slbt_version(dctx,fdout) < 0) ? slbt_exit(dctx,SLBT_ERROR) : slbt_exit(dctx,SLBT_OK); @@ -175,7 +182,7 @@ int slbt_main(char ** argv, char ** envp, const struct slbt_fd_ctx * fdctx) | SLBT_DRIVER_LEGABITS); /* driver context */ - if ((ret = slbt_get_driver_ctx(argv,envp,flags,fdctx,&dctx))) + if ((ret = slbt_get_driver_ctx(argv,envp,flags|noclr,fdctx,&dctx))) return (ret == SLBT_USAGE) ? !argv || !argv[0] || !argv[1] || !argv[2] : SLBT_ERROR; diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c index 7e170d2..7ce2c92 100644 --- a/src/driver/slbt_driver_ctx.c +++ b/src/driver/slbt_driver_ctx.c @@ -122,16 +122,15 @@ struct slbt_driver_ctx_alloc { uint64_t guard; }; -static void slbt_output_raw_vector(int fderr, char ** argv, char ** envp) +static void slbt_output_raw_vector(int fderr, char ** argv, char ** envp, bool fcolor) { char ** parg; char * dot; const char * color; - bool fcolor; (void)envp; - if ((fcolor = isatty(fderr))) + if (fcolor) slbt_dprintf(fderr,"%s%s",aclr_bold,aclr_red); slbt_dprintf(fderr,"\n\n\n%s",argv[0]); @@ -192,7 +191,8 @@ static int slbt_driver_usage( const char * arg, const struct argv_option ** optv, struct argv_meta * meta, - struct slbt_split_vector * sargv) + struct slbt_split_vector * sargv, + int noclr) { char header[512]; @@ -200,7 +200,16 @@ static int slbt_driver_usage( "Usage: %s [options] ...\n" "Options:\n", program); - argv_usage(fdout,header,optv,arg); + switch (noclr) { + case 0: + argv_usage(fdout,header,optv,arg); + break; + + default: + argv_usage_plain(fdout,header,optv,arg); + break; + } + argv_free(meta); slbt_free_argv_buffer(sargv); @@ -296,7 +305,8 @@ static int slbt_split_argv( if (!argv[1] && (flags & SLBT_DRIVER_VERBOSITY_USAGE)) return slbt_driver_usage( fderr,program, - 0,optv,0,sargv); + 0,optv,0,sargv, + !!getenv("NO_COLOR")); /* initial argv scan: ... --mode=xxx ... ... */ argv_scan(argv,optv,&ctx,0); @@ -1244,8 +1254,11 @@ static int slbt_driver_fail_incompatible_args( { int fcolor; + fcolor = (drvflags & SLBT_DRIVER_ANNOTATE_NEVER) + ? 0 : isatty(fderr); + if (drvflags & SLBT_DRIVER_VERBOSITY_ERRORS){ - if ((fcolor = isatty(fderr))) + if (fcolor) slbt_dprintf( fderr,"%s%s", aclr_bold,aclr_red); @@ -1314,7 +1327,8 @@ int slbt_get_driver_ctx( cctx.drvflags = flags | SLBT_DRIVER_SHARED | SLBT_DRIVER_STATIC; /* full annotation when annotation is on; */ - cctx.drvflags |= SLBT_DRIVER_ANNOTATE_FULL; + if (!(cctx.drvflags & SLBT_DRIVER_ANNOTATE_NEVER)) + cctx.drvflags |= SLBT_DRIVER_ANNOTATE_FULL; /* track incompatible command-line arguments */ cmdstatic = 0; @@ -1332,7 +1346,8 @@ int slbt_get_driver_ctx( ? slbt_driver_usage( fdctx->fdout,program, entry->arg,optv, - meta,&sargv) + meta,&sargv, + (cctx.drvflags & SLBT_DRIVER_ANNOTATE_NEVER)) : SLBT_USAGE; case TAG_VERSION: @@ -1661,7 +1676,10 @@ int slbt_get_driver_ctx( /* debug: raw argument vector */ if (cctx.drvflags & SLBT_DRIVER_DEBUG) - slbt_output_raw_vector(fdctx->fderr,argv,envp); + slbt_output_raw_vector( + fdctx->fderr,argv,envp, + (cctx.drvflags & SLBT_DRIVER_ANNOTATE_NEVER) + ? 0 : isatty(fdctx->fderr)); /* -o in install mode means USER */ if ((cctx.mode == SLBT_MODE_INSTALL) && cctx.output) { -- cgit v1.2.3