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:
parent
c9908b5971
commit
469cac00ff
20
watch.c
20
watch.c
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user