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.
This commit is contained in:
Sean Silva 2013-10-18 02:04:15 -04:00 committed by Jaromir Capik
parent c9908b5971
commit 469cac00ff

20
watch.c
View File

@ -138,9 +138,9 @@ static void set_ansi_attribute(const int attrib)
static void process_ansi(FILE * fp) static void process_ansi(FILE * fp)
{ {
int i, c, num1, num2; int i, c;
char buf[MAX_ANSIBUF]; char buf[MAX_ANSIBUF];
char *nextnum; char *numstart, *endptr;
c = getc(fp); c = getc(fp);
if (c != '[') { if (c != '[') {
@ -161,13 +161,15 @@ static void process_ansi(FILE * fp)
} }
buf[i] = (char)c; buf[i] = (char)c;
} }
num1 = strtol(buf, &nextnum, 10); /*
if (nextnum != buf && nextnum[0] != '\0') * buf now contains a semicolon-separated list of decimal integers,
num2 = strtol(nextnum + 1, NULL, 10); * each indicating an attribute to apply.
else * For example, buf might contain "0;1;31", derived from the color
num2 = -1; * escape sequence "<ESC>[0;1;31m". There can be 1 or more
set_ansi_attribute(num1); * attributes to apply, but typically there are between 1 and 3.
set_ansi_attribute(num2); */
for (numstart = buf; *endptr != '\0'; numstart = endptr + 1)
set_ansi_attribute(strtol(numstart, &endptr, 10));
} }
static void __attribute__ ((__noreturn__)) do_exit(int status) static void __attribute__ ((__noreturn__)) do_exit(int status)