Fix color support to work everywhere via hacky static variable

This commit is contained in:
2019-04-05 19:20:33 -07:00
parent f00ab71fb5
commit 47a176223b
5 changed files with 84 additions and 56 deletions

View File

@@ -79,54 +79,6 @@ getint(va_list *ap, int lflag)
// Main function to format and print a string.
void printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...);
struct AttrState {
uint8_t cattrs;
uint8_t attrs;
enum {
NORMAL,
ESC,
BRACKET,
COLOR_FG,
COLOR
} state;
};
void
putchw(void (*putch)(int, void*), int c, void* data, struct AttrState* s) {
switch(s->state) {
case NORMAL:
if(c != 27) putch(c | (s->cattrs << 8), data);
else s->state = ESC;
return;
case ESC:
s->state = (c == '[') ? BRACKET : NORMAL;
return;
case BRACKET:
if(c == '3') {
s->state = COLOR_FG;
} else if(c == '0') {
s->state = COLOR;
s->attrs = 0;
} else {
s->state = NORMAL;
}
return;
case COLOR_FG:
if(c >= '0' && c <= '9') {
s->attrs = (s->attrs & ~(0x07)) | (c - '0');
c |= ((c - '0') << 8);
s->state = COLOR;
} else {
s->state = NORMAL;
}
return;
case COLOR:
s->state = (c == ';') ? BRACKET : NORMAL;
if(c == 'm') s->cattrs = s->attrs;
return;
}
}
void
vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap)
{
@@ -135,17 +87,12 @@ vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap)
unsigned long long num;
int base, lflag, width, precision, altflag;
char padc;
struct AttrState attst;
attst.state = NORMAL;
attst.cattrs = 0;
attst.attrs = 0;
while (1) {
while ((ch = *(unsigned char *) fmt++) != '%') {
if (ch == '\0')
return;
putchw(putch, ch, putdat, &attst);
putch(ch, putdat);
}
// Process a %-escape sequence