1 #include <termcap.h> 2 #include "lesstest.h" 3 4 extern TermInfo terminfo; 5 6 // Set the user's terminal to a given attribute and colors. 7 static void display_attr_color(Attr attr, Color fg_color, Color bg_color) { 8 printf("\33[m"); 9 if (fg_color != NULL_COLOR) 10 printf("\33[%dm", fg_color); 11 if (bg_color != NULL_COLOR) 12 printf("\33[%dm", bg_color); 13 if (attr & ATTR_UNDERLINE) 14 printf("%s", terminfo.enter_underline); 15 if (attr & ATTR_BOLD) 16 printf("%s", terminfo.enter_bold); 17 if (attr & ATTR_BLINK) 18 printf("%s", terminfo.enter_blink); 19 if (attr & ATTR_STANDOUT) 20 printf("%s", terminfo.enter_standout); 21 } 22 23 static int hexval(unsigned char ch) { 24 if (ch >= '0' && ch <= '9') return ch - '0'; 25 if (ch >= 'A' && ch <= 'F') return ch - 'A' + 10; 26 if (ch >= 'a' && ch <= 'f') return ch - 'a' + 10; 27 fprintf(stderr, "invalid hex char 0x%x\n", ch); 28 abort(); 29 } 30 31 static int get_hex(unsigned char const** pp) { 32 int v1 = hexval(*(*pp)++); 33 int v2 = hexval(*(*pp)++); 34 return (v1 << 4) | v2; 35 } 36 37 // Display a given screen image on the user's terminal. 38 void display_screen(const byte* img, int imglen, int screen_width, int screen_height) { 39 int x = 0; 40 int y = 0; 41 int cursor_x = 0; 42 int cursor_y = 0; 43 int literal = 0; 44 Attr curr_attr = 0; 45 Color curr_fg_color = NULL_COLOR; 46 Color curr_bg_color = NULL_COLOR; 47 while (imglen-- > 0) { 48 wchar ch = load_wchar(&img); 49 if (!literal) { 50 switch (ch) { 51 case '\\': 52 literal = 1; 53 continue; 54 case LTS_CHAR_ATTR: 55 curr_attr = get_hex(&img); 56 display_attr_color(curr_attr, curr_fg_color, curr_bg_color); 57 continue; 58 case LTS_CHAR_FG_COLOR: 59 curr_fg_color = get_hex(&img); 60 display_attr_color(curr_attr, curr_fg_color, curr_bg_color); 61 continue; 62 case LTS_CHAR_BG_COLOR: 63 curr_bg_color = get_hex(&img); 64 display_attr_color(curr_attr, curr_fg_color, curr_bg_color); 65 continue; 66 case LTS_CHAR_CURSOR: 67 cursor_x = x; 68 cursor_y = y; 69 continue; 70 } 71 } 72 literal = 0; 73 if (ch != 0) { 74 byte cbuf[UNICODE_MAX_BYTES]; 75 byte* cp = cbuf; 76 store_wchar(&cp, ch); 77 fwrite(cbuf, 1, cp-cbuf, stdout); 78 } 79 if (++x >= screen_width) { 80 printf("\n"); 81 x = 0; 82 if (++y >= screen_height) 83 break; 84 } 85 } 86 printf("%s", tgoto(terminfo.cursor_move, cursor_x, cursor_y)); 87 fflush(stdout); 88 } 89 90 // Print a given screen image on stderr. 91 // Unlike display_screen which prints escape sequences to change color etc, 92 // display_screen_debug only prints printable ASCII. 93 void display_screen_debug(const byte* img, int imglen, int screen_width, int screen_height) { 94 int x = 0; 95 int y = 0; 96 int literal = 0; 97 while (imglen-- > 0) { 98 wchar ch = load_wchar(&img); 99 if (!literal) { 100 switch (ch) { 101 case '\\': 102 literal = 1; 103 continue; 104 case LTS_CHAR_ATTR: 105 case LTS_CHAR_FG_COLOR: 106 case LTS_CHAR_BG_COLOR: 107 x -= 3; // don't count LTS_CHAR or following 2 bytes 108 break; 109 case LTS_CHAR_CURSOR: 110 x -= 1; // don't count LTS_CHAR 111 break; 112 } 113 } 114 literal = 0; 115 if (is_ascii(ch)) 116 fwrite(&ch, 1, 1, stderr); 117 else 118 fprintf(stderr, "<%lx>", (unsigned long) ch); 119 if (++x >= screen_width) { 120 fprintf(stderr, "\n"); 121 x = 0; 122 if (++y >= screen_height) 123 break; 124 } 125 } 126 fflush(stderr); 127 } 128 129 // Print a list of strings. 130 void print_strings(const char* title, char* const* strings) { 131 if (1) return; /// 132 fprintf(stderr, "%s:\n", title); 133 char* const* s; 134 for (s = strings; *s != NULL; ++s) { 135 fprintf(stderr, " "); 136 const char* p; 137 for (p = *s; *p != '\0'; ++p) { 138 if (is_ascii(*p)) 139 fprintf(stderr, "%c", (char) *p); 140 else 141 fprintf(stderr, "\\x%04x", *p); 142 } 143 fprintf(stderr, "\n"); 144 } 145 fprintf(stderr, "%s- end\n", title); 146 } 147