From 469cac00ff8b8472f663f6299bdc27a9ae52dd12 Mon Sep 17 00:00:00 2001 From: Sean Silva Date: Fri, 18 Oct 2013 02:04:15 -0400 Subject: [PATCH] watch: Fix handling of ANSI color escapes for -c The previous code assumed that there would be 1 or 2 attributes to apply. In fact, there can in general be any number (but typically between 1 and 3). This commit generalizes the existing code to read arbitrarily many attributes from the escape sequence. --- watch.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/watch.c b/watch.c index f0a3ec39..37fd4ea0 100644 --- a/watch.c +++ b/watch.c @@ -138,9 +138,9 @@ static void set_ansi_attribute(const int attrib) static void process_ansi(FILE * fp) { - int i, c, num1, num2; + int i, c; char buf[MAX_ANSIBUF]; - char *nextnum; + char *numstart, *endptr; c = getc(fp); if (c != '[') { @@ -161,13 +161,15 @@ static void process_ansi(FILE * fp) } buf[i] = (char)c; } - num1 = strtol(buf, &nextnum, 10); - if (nextnum != buf && nextnum[0] != '\0') - num2 = strtol(nextnum + 1, NULL, 10); - else - num2 = -1; - set_ansi_attribute(num1); - set_ansi_attribute(num2); + /* + * buf now contains a semicolon-separated list of decimal integers, + * each indicating an attribute to apply. + * For example, buf might contain "0;1;31", derived from the color + * escape sequence "[0;1;31m". There can be 1 or more + * attributes to apply, but typically there are between 1 and 3. + */ + for (numstart = buf; *endptr != '\0'; numstart = endptr + 1) + set_ansi_attribute(strtol(numstart, &endptr, 10)); } static void __attribute__ ((__noreturn__)) do_exit(int status) -- 2.40.0