diff --git a/term/print.c b/term/print.c index b79d65d..c3504de 100644 --- a/term/print.c +++ b/term/print.c @@ -1,11 +1,12 @@ #include "print.h" -#include #include +#include #include #include #include #include +#include #define F_BLACK "[black]" #define F_RED "[red]" @@ -26,30 +27,30 @@ typedef b_status (*print_function)(FILE *fp, const char *s); -#define MOD_HASH_BLACK 0x4b5dd0abbc6fc1e4 -#define MOD_HASH_RED 0x89e9be1960f4c21c -#define MOD_HASH_GREEN 0x0f40f029637fecbc -#define MOD_HASH_YELLOW 0x8346a574925e75a9 -#define MOD_HASH_BLUE 0xc5ccd29bc2dda64d -#define MOD_HASH_MAGENTA 0x6c90e772edbc8708 -#define MOD_HASH_CYAN 0x70ae2e90c1bce27a -#define MOD_HASH_WHITE 0xced973885856e206 +#define MOD_HASH_BLACK 0x4b5dd0abbc6fc1e4 +#define MOD_HASH_RED 0x89e9be1960f4c21c +#define MOD_HASH_GREEN 0x0f40f029637fecbc +#define MOD_HASH_YELLOW 0x8346a574925e75a9 +#define MOD_HASH_BLUE 0xc5ccd29bc2dda64d +#define MOD_HASH_MAGENTA 0x6c90e772edbc8708 +#define MOD_HASH_CYAN 0x70ae2e90c1bce27a +#define MOD_HASH_WHITE 0xced973885856e206 -#define MOD_HASH_BG_BLACK 0xd87a8f2d9d394432 -#define MOD_HASH_BG_RED 0x145b1e4366c7d7aa -#define MOD_HASH_BG_GREEN 0xa00b8541d3b1e55a -#define MOD_HASH_BG_YELLOW 0x98b030fd86e3b3cf -#define MOD_HASH_BG_BLUE 0xa15529109506b5df -#define MOD_HASH_BG_MAGENTA 0x86dbda99bcc86222 -#define MOD_HASH_BG_CYAN 0xf16a3104cf61a098 -#define MOD_HASH_BG_WHITE 0x3408c46ab5836674 +#define MOD_HASH_BG_BLACK 0xd87a8f2d9d394432 +#define MOD_HASH_BG_RED 0x145b1e4366c7d7aa +#define MOD_HASH_BG_GREEN 0xa00b8541d3b1e55a +#define MOD_HASH_BG_YELLOW 0x98b030fd86e3b3cf +#define MOD_HASH_BG_BLUE 0xa15529109506b5df +#define MOD_HASH_BG_MAGENTA 0x86dbda99bcc86222 +#define MOD_HASH_BG_CYAN 0xf16a3104cf61a098 +#define MOD_HASH_BG_WHITE 0x3408c46ab5836674 -#define MOD_HASH_BOLD 0xcd32ea9bc6b26ff6 -#define MOD_HASH_BRIGHT 0xb5cca637f5a2b385 -#define MOD_HASH_ULINE 0x141fe741e9f8c22a -#define MOD_HASH_ITALIC 0x69d5e5f057d8992d -#define MOD_HASH_INVERT 0xab4ab85ddd6232e1 -#define MOD_HASH_RESET 0x0f136ff2c086b760 +#define MOD_HASH_BOLD 0xcd32ea9bc6b26ff6 +#define MOD_HASH_BRIGHT 0xb5cca637f5a2b385 +#define MOD_HASH_ULINE 0x141fe741e9f8c22a +#define MOD_HASH_ITALIC 0x69d5e5f057d8992d +#define MOD_HASH_INVERT 0xab4ab85ddd6232e1 +#define MOD_HASH_RESET 0x0f136ff2c086b760 #define COMPARE_MOD_NAME(ss, sd, hs, hd) ((hs) == (hd) && !strcmp(ss, sd)) @@ -101,7 +102,8 @@ static void apply_modifier(FILE *fp, const char *modifier, unsigned int *mod_fla if (COMPARE_MOD_NAME(modifier, "white", mod_hash, MOD_HASH_WHITE)) { mod_flags = Z__B_STREAM_MOD_CLEAR_FG_COLOUR(mod_flags); - mod_flags |= Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE; + mod_flags |= Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN + | Z__B_STREAM_MOD_BLUE; } if (COMPARE_MOD_NAME(modifier, "bg_black", mod_hash, MOD_HASH_BG_BLACK)) { @@ -141,7 +143,8 @@ static void apply_modifier(FILE *fp, const char *modifier, unsigned int *mod_fla if (COMPARE_MOD_NAME(modifier, "bg_white", mod_hash, MOD_HASH_BG_WHITE)) { mod_flags = Z__B_STREAM_MOD_CLEAR_BG_COLOUR(mod_flags); - mod_flags |= Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE; + mod_flags |= Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN + | Z__B_STREAM_MOD_BG_BLUE; } if (COMPARE_MOD_NAME(modifier, "bold", mod_hash, MOD_HASH_BOLD)) { @@ -177,7 +180,7 @@ static int print(FILE *fp, const char *str) char ctrl_buf[128]; unsigned int ctrl_len = 0; - for (size_t i = 0; str[i]; ) { + for (size_t i = 0; str[i];) { char c = str[i++]; if (c != '[') { diff --git a/term/print.h b/term/print.h index 188b753..a86d6b9 100644 --- a/term/print.h +++ b/term/print.h @@ -5,36 +5,44 @@ #include #include -enum { +enum z__b_stream_modifier { Z__B_STREAM_MOD_BLACK = 0x1, Z__B_STREAM_MOD_RED = 0x2, Z__B_STREAM_MOD_GREEN = 0x4, Z__B_STREAM_MOD_BLUE = 0x8, + Z__B_STREAM_MOD_BRIGHT = 0x10, - Z__B_STREAM_MOD_BG_BLACK = 0x10, - Z__B_STREAM_MOD_BG_RED = 0x20, - Z__B_STREAM_MOD_BG_GREEN = 0x40, - Z__B_STREAM_MOD_BG_BLUE = 0x80, + Z__B_STREAM_MOD_BG_BLACK = 0x20, + Z__B_STREAM_MOD_BG_RED = 0x40, + Z__B_STREAM_MOD_BG_GREEN = 0x80, + Z__B_STREAM_MOD_BG_BLUE = 0x100, + Z__B_STREAM_MOD_BG_BRIGHT = 0x200, - Z__B_STREAM_MOD_BOLD = 0x100, - Z__B_STREAM_MOD_BRIGHT = 0x200, - Z__B_STREAM_MOD_ITALIC = 0x400, - Z__B_STREAM_MOD_ULINE = 0x800, - Z__B_STREAM_MOD_INVERT = 0x1000, + Z__B_STREAM_MOD_BOLD = 0x400, + Z__B_STREAM_MOD_ITALIC = 0x800, + Z__B_STREAM_MOD_ULINE = 0x1000, + Z__B_STREAM_MOD_INVERT = 0x2000, - Z__B_STREAM_MOD_RESET = 0x2000, + Z__B_STREAM_MOD_RESET = 0x4000, }; -#define Z__B_STREAM_MOD_GET_FG_COLOUR(x) \ - ((x) & (Z__B_STREAM_MOD_BLACK | Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE)) -#define Z__B_STREAM_MOD_CLEAR_FG_COLOUR(x) \ - ((x) & ~(Z__B_STREAM_MOD_BLACK | Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE)) +#define Z__B_STREAM_MOD_GET_FG_COLOUR(x) \ + ((x) \ + & (Z__B_STREAM_MOD_BLACK | Z__B_STREAM_MOD_RED \ + | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE)) +#define Z__B_STREAM_MOD_CLEAR_FG_COLOUR(x) \ + ((x) \ + & ~(Z__B_STREAM_MOD_BLACK | Z__B_STREAM_MOD_RED \ + | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE)) #define Z__B_STREAM_MOD_GET_BG_COLOUR(x) \ - ((x) & (Z__B_STREAM_MOD_BG_BLACK | Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE)) + ((x) \ + & (Z__B_STREAM_MOD_BG_BLACK | Z__B_STREAM_MOD_BG_RED \ + | Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE)) #define Z__B_STREAM_MOD_CLEAR_BG_COLOUR(x) \ - ((x) & ~(Z__B_STREAM_MOD_BG_BLACK | Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE)) - + ((x) \ + & ~(Z__B_STREAM_MOD_BG_BLACK | Z__B_STREAM_MOD_BG_RED \ + | Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE)) BLUE_API int z__b_stream_is_tty(FILE *fp); BLUE_API int z__b_stream_dimensions(FILE *fp, unsigned int *w, unsigned int *h); diff --git a/term/sys/darwin/print.c b/term/sys/darwin/print.c index e3484a8..dc2a629 100644 --- a/term/sys/darwin/print.c +++ b/term/sys/darwin/print.c @@ -1,3 +1,5 @@ +#include "../../print.h" + #include #include #include @@ -63,3 +65,158 @@ int z__b_stream_cursorpos(FILE *in, FILE *out, unsigned int *x, unsigned int *y) return 0; } + +int z__b_stream_set_modifier(FILE *fp, enum z__b_stream_modifier mod) +{ + char buf[128]; + int buf_i = 0; + int nr_codes = 0; + + buf[buf_i++] = '\033'; + buf[buf_i++] = '['; + + if (mod & Z__B_STREAM_MOD_RESET) { + buf[buf_i++] = '0'; + buf[buf_i++] = 'm'; + buf[buf_i++] = '\0'; + fputs(buf, fp); + + return 0; + } + + if (mod & Z__B_STREAM_MOD_BOLD) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '1'; + nr_codes++; + } + + if (mod & Z__B_STREAM_MOD_ITALIC) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '3'; + nr_codes++; + } + + if (mod & Z__B_STREAM_MOD_ULINE) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '4'; + nr_codes++; + } + + if (mod & Z__B_STREAM_MOD_INVERT) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '7'; + nr_codes++; + } + + if (Z__B_STREAM_MOD_GET_FG_COLOUR(mod) != 0) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = mod & Z__B_STREAM_MOD_BRIGHT ? '9' : '3'; + } + + switch (Z__B_STREAM_MOD_GET_FG_COLOUR(mod)) { + case Z__B_STREAM_MOD_BLACK: + buf[buf_i++] = '0'; + nr_codes++; + break; + case Z__B_STREAM_MOD_RED: + buf[buf_i++] = '1'; + nr_codes++; + break; + case Z__B_STREAM_MOD_GREEN: + buf[buf_i++] = '2'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BLUE: + nr_codes++; + break; + case Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN: + buf[buf_i++] = '3'; + nr_codes++; + break; + case Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_BLUE: + buf[buf_i++] = '5'; + nr_codes++; + break; + case Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE: + buf[buf_i++] = '6'; + nr_codes++; + break; + case Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE: + buf[buf_i++] = '7'; + nr_codes++; + break; + default: + break; + } + + if (Z__B_STREAM_MOD_GET_BG_COLOUR(mod) != 0) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + if (mod & Z__B_STREAM_MOD_BG_BRIGHT) { + buf[buf_i++] = '1'; + buf[buf_i++] = '0'; + } else { + buf[buf_i++] = '9'; + } + } + + switch (Z__B_STREAM_MOD_GET_BG_COLOUR(mod)) { + case Z__B_STREAM_MOD_BG_BLACK: + buf[buf_i++] = '0'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED: + buf[buf_i++] = '1'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_GREEN: + buf[buf_i++] = '2'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_BLUE: + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN: + buf[buf_i++] = '3'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_BLUE: + buf[buf_i++] = '5'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE: + buf[buf_i++] = '6'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN + | Z__B_STREAM_MOD_BG_BLUE: + buf[buf_i++] = '7'; + nr_codes++; + break; + default: + break; + } + + buf[buf_i++] = 'm'; + buf[buf_i++] = '\0'; + fputs(buf, fp); + + return 0; +} diff --git a/term/sys/linux/print.c b/term/sys/linux/print.c index e3484a8..dc2a629 100644 --- a/term/sys/linux/print.c +++ b/term/sys/linux/print.c @@ -1,3 +1,5 @@ +#include "../../print.h" + #include #include #include @@ -63,3 +65,158 @@ int z__b_stream_cursorpos(FILE *in, FILE *out, unsigned int *x, unsigned int *y) return 0; } + +int z__b_stream_set_modifier(FILE *fp, enum z__b_stream_modifier mod) +{ + char buf[128]; + int buf_i = 0; + int nr_codes = 0; + + buf[buf_i++] = '\033'; + buf[buf_i++] = '['; + + if (mod & Z__B_STREAM_MOD_RESET) { + buf[buf_i++] = '0'; + buf[buf_i++] = 'm'; + buf[buf_i++] = '\0'; + fputs(buf, fp); + + return 0; + } + + if (mod & Z__B_STREAM_MOD_BOLD) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '1'; + nr_codes++; + } + + if (mod & Z__B_STREAM_MOD_ITALIC) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '3'; + nr_codes++; + } + + if (mod & Z__B_STREAM_MOD_ULINE) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '4'; + nr_codes++; + } + + if (mod & Z__B_STREAM_MOD_INVERT) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = '7'; + nr_codes++; + } + + if (Z__B_STREAM_MOD_GET_FG_COLOUR(mod) != 0) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + buf[buf_i++] = mod & Z__B_STREAM_MOD_BRIGHT ? '9' : '3'; + } + + switch (Z__B_STREAM_MOD_GET_FG_COLOUR(mod)) { + case Z__B_STREAM_MOD_BLACK: + buf[buf_i++] = '0'; + nr_codes++; + break; + case Z__B_STREAM_MOD_RED: + buf[buf_i++] = '1'; + nr_codes++; + break; + case Z__B_STREAM_MOD_GREEN: + buf[buf_i++] = '2'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BLUE: + nr_codes++; + break; + case Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN: + buf[buf_i++] = '3'; + nr_codes++; + break; + case Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_BLUE: + buf[buf_i++] = '5'; + nr_codes++; + break; + case Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE: + buf[buf_i++] = '6'; + nr_codes++; + break; + case Z__B_STREAM_MOD_RED | Z__B_STREAM_MOD_GREEN | Z__B_STREAM_MOD_BLUE: + buf[buf_i++] = '7'; + nr_codes++; + break; + default: + break; + } + + if (Z__B_STREAM_MOD_GET_BG_COLOUR(mod) != 0) { + if (nr_codes > 0) { + buf[buf_i++] = ';'; + } + + if (mod & Z__B_STREAM_MOD_BG_BRIGHT) { + buf[buf_i++] = '1'; + buf[buf_i++] = '0'; + } else { + buf[buf_i++] = '9'; + } + } + + switch (Z__B_STREAM_MOD_GET_BG_COLOUR(mod)) { + case Z__B_STREAM_MOD_BG_BLACK: + buf[buf_i++] = '0'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED: + buf[buf_i++] = '1'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_GREEN: + buf[buf_i++] = '2'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_BLUE: + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN: + buf[buf_i++] = '3'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_BLUE: + buf[buf_i++] = '5'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_GREEN | Z__B_STREAM_MOD_BG_BLUE: + buf[buf_i++] = '6'; + nr_codes++; + break; + case Z__B_STREAM_MOD_BG_RED | Z__B_STREAM_MOD_BG_GREEN + | Z__B_STREAM_MOD_BG_BLUE: + buf[buf_i++] = '7'; + nr_codes++; + break; + default: + break; + } + + buf[buf_i++] = 'm'; + buf[buf_i++] = '\0'; + fputs(buf, fp); + + return 0; +} diff --git a/term/sys/windows/print.c b/term/sys/windows/print.c index c479f79..8b7e2bf 100644 --- a/term/sys/windows/print.c +++ b/term/sys/windows/print.c @@ -1,7 +1,8 @@ +#include "../../print.h" + +#include #include #include -#include -#include "../../print.h" int z__b_stream_is_tty(FILE *fp) { @@ -38,7 +39,6 @@ int z__b_stream_cursorpos(FILE *in, FILE *out, unsigned int *x, unsigned int *y) CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE console = (HANDLE)_get_osfhandle(fileno(in)); BOOL status = GetConsoleScreenBufferInfo(console, &csbi); - if (status == FALSE) { return -1; @@ -55,16 +55,16 @@ int z__b_stream_cursorpos(FILE *in, FILE *out, unsigned int *x, unsigned int *y) return 0; } -#define APPLY_FLAG(mod, attrib, x, y) \ +#define APPLY_FLAG(mod, attrib, x, y) \ if ((mod) & (x)) { \ (attrib) |= (y); \ } -#define APPLY_FLAG_X(mod, attrib, x, y) \ - if ((mod) & (x)) { \ - (attrib) |= (y); \ - } else { \ - (attrib) &= ~(y); \ +#define APPLY_FLAG_X(mod, attrib, x, y) \ + if ((mod) & (x)) { \ + (attrib) |= (y); \ + } else { \ + (attrib) &= ~(y); \ } int z__b_stream_set_modifier(FILE *fp, unsigned int mod) @@ -74,7 +74,7 @@ int z__b_stream_set_modifier(FILE *fp, unsigned int mod) HANDLE console = (HANDLE)_get_osfhandle(fileno(fp)); BOOL status = GetConsoleScreenBufferInfo(console, &csbi); - + if (status == FALSE) { return -1; } @@ -89,27 +89,44 @@ int z__b_stream_set_modifier(FILE *fp, unsigned int mod) if (Z__B_STREAM_MOD_GET_FG_COLOUR(mod) != 0) { if (mod & Z__B_STREAM_MOD_BLACK) { - attrib &= ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); + attrib + &= ~(FOREGROUND_RED | FOREGROUND_GREEN + | FOREGROUND_BLUE); } else { - APPLY_FLAG_X(mod, attrib, Z__B_STREAM_MOD_RED, FOREGROUND_RED); - APPLY_FLAG_X(mod, attrib, Z__B_STREAM_MOD_GREEN, FOREGROUND_GREEN); - APPLY_FLAG_X(mod, attrib, Z__B_STREAM_MOD_BLUE, FOREGROUND_BLUE); + APPLY_FLAG_X( + mod, attrib, Z__B_STREAM_MOD_RED, FOREGROUND_RED); + APPLY_FLAG_X( + mod, attrib, Z__B_STREAM_MOD_GREEN, + FOREGROUND_GREEN); + APPLY_FLAG_X( + mod, attrib, Z__B_STREAM_MOD_BLUE, FOREGROUND_BLUE); } } if (Z__B_STREAM_MOD_GET_BG_COLOUR(mod) != 0) { if (mod & Z__B_STREAM_MOD_BG_BLACK) { - attrib &= ~(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); + attrib + &= ~(BACKGROUND_RED | BACKGROUND_GREEN + | BACKGROUND_BLUE); } else { - APPLY_FLAG_X(mod, attrib, Z__B_STREAM_MOD_BG_RED, BACKGROUND_RED); - APPLY_FLAG_X(mod, attrib, Z__B_STREAM_MOD_BG_GREEN, BACKGROUND_GREEN); - APPLY_FLAG_X(mod, attrib, Z__B_STREAM_MOD_BG_BLUE, BACKGROUND_BLUE); + APPLY_FLAG_X( + mod, attrib, Z__B_STREAM_MOD_BG_RED, + BACKGROUND_RED); + APPLY_FLAG_X( + mod, attrib, Z__B_STREAM_MOD_BG_GREEN, + BACKGROUND_GREEN); + APPLY_FLAG_X( + mod, attrib, Z__B_STREAM_MOD_BG_BLUE, + BACKGROUND_BLUE); } } APPLY_FLAG(mod, attrib, Z__B_STREAM_MOD_ULINE, COMMON_LVB_UNDERSCORE); APPLY_FLAG(mod, attrib, Z__B_STREAM_MOD_INVERT, COMMON_LVB_REVERSE_VIDEO); - APPLY_FLAG(mod, attrib, Z__B_STREAM_MOD_BRIGHT | Z__B_STREAM_MOD_BOLD, FOREGROUND_INTENSITY); + APPLY_FLAG( + mod, attrib, Z__B_STREAM_MOD_BRIGHT | Z__B_STREAM_MOD_BOLD, + FOREGROUND_INTENSITY); + APPLY_FLAG(mod, attrib, Z__B_STREAM_MOD_BG_BRIGHT, BACKGROUND_INTENSITY); SetConsoleTextAttribute(console, attrib); return 0;