From 80a1712f546eb0669c9e4130a32c78cdeeb5fdab Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 2 Sep 2013 10:54:30 +0200 Subject: fdisk: add -L to colorize output Signed-off-by: Karel Zak --- fdisks/fdisk-ask.c | 28 ++++++++++++++++++++++++++-- fdisks/fdisk-menu.c | 6 ++++-- fdisks/fdisk.8 | 4 ++++ fdisks/fdisk.c | 20 ++++++++++++++++---- fdisks/fdisk.h | 2 +- include/colors.h | 19 +++++++++++++++++-- lib/colors.c | 13 +++++++++---- 7 files changed, 77 insertions(+), 15 deletions(-) diff --git a/fdisks/fdisk-ask.c b/fdisks/fdisk-ask.c index 6c10a48c3..2d689e558 100644 --- a/fdisks/fdisk-ask.c +++ b/fdisks/fdisk-ask.c @@ -192,11 +192,31 @@ static int ask_offset(struct fdisk_context *cxt, return -1; } -static void fputs_info(const char *msg, FILE *out) +static void fputs_info(const char *msg, FILE *out, char *buf, size_t bufsz) { if (info_count == 1) fputc('\n', out); + + if (msg && colors_wanted()) { + char *sep = _(": "); + char *p = strstr(msg, sep); + + if (p) { + size_t sz = strlen(sep); + + strncpy(buf, msg, bufsz); + buf[p - msg + sz] = '\0'; + + color_enable(UL_COLOR_BROWN); + fputs(buf, out); + color_disable(); + fputs(p + sz, out); + goto done; + } + } + fputs(msg, out); +done: fputc('\n', out); } @@ -219,16 +239,20 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask, return ask_offset(cxt, ask, buf, sizeof(buf)); case FDISK_ASKTYPE_INFO: info_count++; - fputs_info(fdisk_ask_print_get_mesg(ask), stdout); + fputs_info(fdisk_ask_print_get_mesg(ask), stdout, buf, sizeof(buf)); break; case FDISK_ASKTYPE_WARNX: + color_fenable(UL_COLOR_RED, stderr); fputs(fdisk_ask_print_get_mesg(ask), stderr); + color_fdisable(stderr); fputc('\n', stderr); break; case FDISK_ASKTYPE_WARN: + color_fenable(UL_COLOR_RED, stderr); fputs(fdisk_ask_print_get_mesg(ask), stderr); errno = fdisk_ask_print_get_errno(ask); fprintf(stderr, ": %m\n"); + color_fdisable(stderr); break; case FDISK_ASKTYPE_YESNO: fputc('\n', stdout); diff --git a/fdisks/fdisk-menu.c b/fdisks/fdisk-menu.c index 3a5a57434..0ead2e477 100644 --- a/fdisks/fdisk-menu.c +++ b/fdisks/fdisk-menu.c @@ -326,9 +326,11 @@ int print_fdisk_menu(struct fdisk_context *cxt) while ((e = next_menu_entry(cxt, &mc))) { if (IS_MENU_HID(e)) continue; /* hidden entry */ - if (IS_MENU_SEP(e)) + if (IS_MENU_SEP(e)) { + color_enable(UL_COLOR_BOLD); printf("\n %s\n", _(e->title)); - else + color_disable(); + } else printf(" %c %s\n", e->key, _(e->title)); } fputc('\n', stdout); diff --git a/fdisks/fdisk.8 b/fdisks/fdisk.8 index 439f0f62f..a75558476 100644 --- a/fdisks/fdisk.8 +++ b/fdisks/fdisk.8 @@ -218,6 +218,10 @@ A reasonable value is 63. This option is DEPRECATED. .BI \-h Display a help text and exit. .TP +.BI \-L[=\fIwhen\fR] +Colorize output in interactive mode. The optional argument \fIwhen\fP can +be \fBauto\fR, \fBnever\fR or \fBalways\fR. The default is \fBauto\fR. +.TP .B \-l List the partition tables for the specified devices and then exit. If no devices are given, those mentioned in diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c index 05f4ccb58..ec0c5447f 100644 --- a/fdisks/fdisk.c +++ b/fdisks/fdisk.c @@ -60,6 +60,8 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out) fputs(_(" -b sector size (512, 1024, 2048 or 4096)\n"), out); fputs(_(" -c[=] compatible mode: 'dos' or 'nondos' (default)\n"), out); fputs(_(" -h print this help text\n"), out); + fputs(_(" -c[=] compatible mode: 'dos' or 'nondos' (default)\n"), out); + fputs(_(" -L[=] colorize output (auto, always or never)\n"), out); fputs(_(" -u[=] display units: 'cylinders' or 'sectors' (default)\n"), out); fputs(_(" -v print program version\n"), out); fputs(_(" -C specify the number of cylinders\n"), out); @@ -341,6 +343,7 @@ enum { int main(int argc, char **argv) { int i, c, act = ACT_FDISK; + int colormode = UL_COLORMODE_AUTO; struct fdisk_context *cxt; setlocale(LC_ALL, ""); @@ -355,7 +358,7 @@ int main(int argc, char **argv) fdisk_context_set_ask(cxt, ask_callback, NULL); - while ((c = getopt(argc, argv, "b:c::C:hH:lsS:u::vV")) != -1) { + while ((c = getopt(argc, argv, "b:c::C:hH:lL::sS:u::vV")) != -1) { switch (c) { case 'b': { @@ -402,6 +405,11 @@ int main(int argc, char **argv) case 'l': act = ACT_LIST; break; + case 'L': + if (optarg) + colormode = colormode_or_err(optarg, + _("unsupported color mode")); + break; case 's': act = ACT_SHOWSIZE; break; @@ -454,13 +462,17 @@ int main(int argc, char **argv) if (argc-optind != 1) usage(stderr); + colors_init(colormode); + if (fdisk_context_assign_device(cxt, argv[optind], 0) != 0) err(EXIT_FAILURE, _("cannot open %s"), argv[optind]); /* Here starts interactive mode, use fdisk_{warn,info,..} functions */ - fdisk_info(cxt, _("Welcome to fdisk (%s).\n\n" - "Changes will remain in memory only, until you decide to write them.\n" - "Be careful before using the write command.\n"), PACKAGE_STRING); + color_enable(UL_COLOR_GREEN); + fdisk_info(cxt, _("Welcome to fdisk (%s).\n"), PACKAGE_STRING); + color_disable(); + fdisk_info(cxt, _("Changes will remain in memory only, until you decide to write them.\n" + "Be careful before using the write command.\n")); fflush(stdout); if (!fdisk_dev_has_disklabel(cxt)) { diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h index a416f2c25..0f427e29e 100644 --- a/fdisks/fdisk.h +++ b/fdisks/fdisk.h @@ -11,7 +11,7 @@ */ #include "fdiskP.h" #include "blkdev.h" - +#include "colors.h" extern void toggle_units(struct fdisk_context *cxt); diff --git a/include/colors.h b/include/colors.h index b6c99171a..d2bd7b2aa 100644 --- a/include/colors.h +++ b/include/colors.h @@ -53,10 +53,25 @@ extern int colormode_or_err(const char *str, const char *errmsg); /* Initialize the global variable OUT_IS_TERM */ extern int colors_init(int mode); +/* Returns 1 or 0 */ +extern int colors_wanted(void); + /* Set the color to CLR_SCHEME */ -extern void color_enable(const char *clr_scheme); +extern void color_fenable(const char *clr_scheme, FILE *f); + +static inline void color_enable(const char *clr_scheme) +{ + color_fenable(clr_scheme, stdout); +} /* Reset colors to default */ -extern void color_disable(void); +extern void color_fdisable(FILE *f); + +static inline void color_disable(void) +{ + color_fdisable(stdout); +} + + #endif /* UTIL_LINUX_COLORS_H */ diff --git a/lib/colors.c b/lib/colors.c index c8075cc1e..51faa010a 100644 --- a/lib/colors.c +++ b/lib/colors.c @@ -27,16 +27,21 @@ int colors_init(int mode) return ul_color_term_ok; } -void color_enable(const char *color_scheme) +int colors_wanted(void) +{ + return ul_color_term_ok; +} + +void color_fenable(const char *color_scheme, FILE *f) { if (ul_color_term_ok && color_scheme) - fputs(color_scheme, stdout); + fputs(color_scheme, f); } -void color_disable(void) +void color_fdisable(FILE *f) { if (ul_color_term_ok) - fputs(UL_COLOR_RESET, stdout); + fputs(UL_COLOR_RESET, f); } int colormode_from_string(const char *str) -- cgit v1.2.3-55-g7522