From: David Griffith Date: Wed, 18 Sep 2019 21:50:40 +0000 (-0700) Subject: Convert dumb_output.c to K&R style. X-Git-Url: https://scope-eye.net/git/?a=commitdiff_plain;h=95885a3bc08995d7daea9e8d0dd130cef4adc584;p=liskon_frotz.git Convert dumb_output.c to K&R style. --- diff --git a/src/dumb/dumb_output.c b/src/dumb/dumb_output.c index 9d716bd..49bfd3b 100644 --- a/src/dumb/dumb_output.c +++ b/src/dumb/dumb_output.c @@ -30,12 +30,12 @@ static bool visual_bell = TRUE; static bool plain_ascii = FALSE; static char latin1_to_ascii[] = - " ! c L >o< Y | S '' C a << not - R _ " - "^0 +/- ^2 ^3 ' my P . , ^1 o >> 1/4 1/2 3/4 ? " - "A A A A Ae A AE C E E E E I I I I " - "Th N O O O O Oe * O U U U Ue Y Th ss " - "a a a a ae a ae c e e e e i i i i " - "th n o o o o oe : o u u u ue y th y " + " ! c L >o< Y | S '' C a << not - R _ " + "^0 +/- ^2 ^3 ' my P . , ^1 o >> 1/4 1/2 3/4 ? " + "A A A A Ae A AE C E E E E I I I I " + "Th N O O O O Oe * O U U U Ue Y Th ss " + "a a a a ae a ae c e e e e i i i i " + "th n o o o o oe : o u u u ue y th y " ; /* h_screen_rows * h_screen_cols */ @@ -71,322 +71,368 @@ static int cursor_row = 0, cursor_col = 0; /* Compression styles. */ static enum { - COMPRESSION_NONE, COMPRESSION_SPANS, COMPRESSION_MAX, + COMPRESSION_NONE, COMPRESSION_SPANS, COMPRESSION_MAX, } compression_mode = COMPRESSION_SPANS; static char *compression_names[] = {"NONE", "SPANS", "MAX"}; static int hide_lines = 0; /* Reverse-video display styles. */ static enum { - RV_NONE, RV_DOUBLESTRIKE, RV_UNDERLINE, RV_CAPS, + RV_NONE, RV_DOUBLESTRIKE, RV_UNDERLINE, RV_CAPS, } rv_mode = RV_NONE; static char *rv_names[] = {"NONE", "DOUBLESTRIKE", "UNDERLINE", "CAPS"}; static char rv_blank_char = ' '; -static cell *dumb_row(int r) {return screen_data + r * h_screen_cols;} +static cell *dumb_row(int r) +{ + return screen_data + r * h_screen_cols; +} + static char *dumb_changes_row(int r) { return screen_changes + r * h_screen_cols; } + int os_check_unicode(int font, zchar c) { -/* Only UTF-8 output, no input yet. */ - return 1; + /* Only UTF-8 output, no input yet. */ + return 1; } + int os_char_width (zchar z) { - if (plain_ascii && z >= ZC_LATIN1_MIN) { - char *p = latin1_to_ascii + 4 * (z - ZC_LATIN1_MIN); - return strchr(p, ' ') - p; - } - return 1; + if (plain_ascii && z >= ZC_LATIN1_MIN) { + char *p = latin1_to_ascii + 4 * (z - ZC_LATIN1_MIN); + return strchr(p, ' ') - p; + } + return 1; } + int os_string_width (const zchar *s) { - int width = 0; - zchar c; + int width = 0; + zchar c; - while ((c = *s++) != 0) { - if (c == ZC_NEW_STYLE || c == ZC_NEW_FONT) - s++; - else - width += os_char_width(c); - } - return width; + while ((c = *s++) != 0) { + if (c == ZC_NEW_STYLE || c == ZC_NEW_FONT) + s++; + else + width += os_char_width(c); + } + return width; } + void os_set_cursor(int row, int col) { - cursor_row = row - 1; cursor_col = col - 1; - if (cursor_row >= h_screen_rows) - cursor_row = h_screen_rows - 1; + cursor_row = row - 1; cursor_col = col - 1; + if (cursor_row >= h_screen_rows) + cursor_row = h_screen_rows - 1; } + bool os_repaint_window(int UNUSED(win), int UNUSED(ypos_old), int UNUSED(ypos_new), int UNUSED(xpos), int UNUSED(ysize), int UNUSED(xsize)) { - return FALSE; + return FALSE; } + /* Set a cell and update screen_changes. */ static void dumb_set_cell(int row, int col, cell c) { - dumb_changes_row(row)[col] = (c != dumb_row(row)[col]); - dumb_row(row)[col] = c; + dumb_changes_row(row)[col] = (c != dumb_row(row)[col]); + dumb_row(row)[col] = c; } + void dumb_set_picture_cell(int row, int col, zchar c) { - dumb_set_cell(row, col, make_cell(PICTURE_STYLE, c)); + dumb_set_cell(row, col, make_cell(PICTURE_STYLE, c)); } + /* Copy a cell and copy its changedness state. * This is used for scrolling. */ static void dumb_copy_cell(int dest_row, int dest_col, int src_row, int src_col) { - dumb_row(dest_row)[dest_col] = dumb_row(src_row)[src_col]; - dumb_changes_row(dest_row)[dest_col] = dumb_changes_row(src_row)[src_col]; + dumb_row(dest_row)[dest_col] = dumb_row(src_row)[src_col]; + dumb_changes_row(dest_row)[dest_col] = dumb_changes_row(src_row)[src_col]; } + void os_set_text_style(int x) { - current_style = x & REVERSE_STYLE; + current_style = x & REVERSE_STYLE; } + /* put a character in the cell at the cursor and advance the cursor. */ static void dumb_display_char(zchar c) { - dumb_set_cell(cursor_row, cursor_col, make_cell(current_style, c)); - if (++cursor_col == h_screen_cols) { - if (cursor_row == h_screen_rows - 1) - cursor_col--; - else { - cursor_row++; - cursor_col = 0; + dumb_set_cell(cursor_row, cursor_col, make_cell(current_style, c)); + if (++cursor_col == h_screen_cols) { + if (cursor_row == h_screen_rows - 1) + cursor_col--; + else { + cursor_row++; + cursor_col = 0; + } } - } } + void dumb_display_user_input(char *s) { - /* copy to screen without marking it as a change. */ - while (*s) - dumb_row(cursor_row)[cursor_col++] = make_cell(0, *s++); + /* copy to screen without marking it as a change. */ + while (*s) + dumb_row(cursor_row)[cursor_col++] = make_cell(0, *s++); } + void dumb_discard_old_input(int num_chars) { - /* Weird discard stuff. Grep spec for 'pain in my butt'. */ - /* The old characters should be on the screen just before the cursor. - * Erase them. */ - cursor_col -= num_chars; + /* Weird discard stuff. Grep spec for 'pain in my butt'. */ + /* The old characters should be on the screen just before the cursor. + * Erase them. */ + cursor_col -= num_chars; - if (cursor_col < 0) - cursor_col = 0; - os_erase_area(cursor_row + 1, cursor_col + 1, + if (cursor_col < 0) + cursor_col = 0; + os_erase_area(cursor_row + 1, cursor_col + 1, cursor_row + 1, cursor_col + num_chars, -1); } + void os_display_char (zchar c) { - if (c >= ZC_LATIN1_MIN) { - if (plain_ascii) { - char *ptr = latin1_to_ascii + 4 * (c - ZC_LATIN1_MIN); - do - dumb_display_char(*ptr++); - while (*ptr != ' '); - } else - dumb_display_char(c); - } else if (c >= 32 && c <= 126) { - dumb_display_char(c); - } else if (c == ZC_GAP) { - dumb_display_char(' '); dumb_display_char(' '); - } else if (c == ZC_INDENT) { - dumb_display_char(' '); dumb_display_char(' '); dumb_display_char(' '); - } - return; + if (c >= ZC_LATIN1_MIN) { + if (plain_ascii) { + char *ptr = latin1_to_ascii + 4 * (c - ZC_LATIN1_MIN); + do + dumb_display_char(*ptr++); + while (*ptr != ' '); + } else + dumb_display_char(c); + } else if (c >= 32 && c <= 126) { + dumb_display_char(c); + } else if (c == ZC_GAP) { + dumb_display_char(' '); dumb_display_char(' '); + } else if (c == ZC_INDENT) { + dumb_display_char(' '); + dumb_display_char(' '); + dumb_display_char(' '); + } + return; } /* Haxor your boxor? */ void os_display_string (const zchar *s) { - zchar c; + zchar c; - while ((c = *s++) != 0) { - if (c == ZC_NEW_FONT) - s++; - else if (c == ZC_NEW_STYLE) - os_set_text_style(*s++); - else { - os_display_char (c); + while ((c = *s++) != 0) { + if (c == ZC_NEW_FONT) + s++; + else if (c == ZC_NEW_STYLE) + os_set_text_style(*s++); + else { + os_display_char (c); + } } - } } + void os_erase_area (int top, int left, int bottom, int right, int UNUSED (win)) { - int row, col; - top--; left--; bottom--; right--; - for (row = top; row <= bottom; row++) { - for (col = left; col <= right; col++) - dumb_set_cell(row, col, make_cell(current_style, ' ')); - } + int row, col; + top--; left--; bottom--; right--; + for (row = top; row <= bottom; row++) { + for (col = left; col <= right; col++) + dumb_set_cell(row, col, make_cell(current_style, ' ')); + } } + void os_scroll_area (int top, int left, int bottom, int right, int units) { - int row, col; + int row, col; - top--; left--; bottom--; right--; + top--; left--; bottom--; right--; - if (units > 0) { - for (row = top; row <= bottom - units; row++) { - for (col = left; col <= right; col++) - dumb_copy_cell(row, col, row + units, col); - } - os_erase_area(bottom - units + 2, left + 1, bottom + 1, right + 1, -1 ); - } else if (units < 0) { - for (row = bottom; row >= top - units; row--) { - for (col = left; col <= right; col++) - dumb_copy_cell(row, col, row + units, col); + if (units > 0) { + for (row = top; row <= bottom - units; row++) { + for (col = left; col <= right; col++) + dumb_copy_cell(row, col, row + units, col); + } + os_erase_area(bottom - units + 2, left + 1, + bottom + 1, right + 1, -1 ); + } else if (units < 0) { + for (row = bottom; row >= top - units; row--) { + for (col = left; col <= right; col++) + dumb_copy_cell(row, col, row + units, col); + } + os_erase_area(top + 1, left + 1, top - units, right + 1 , -1); } - os_erase_area(top + 1, left + 1, top - units, right + 1 , -1); - } } + int os_font_data(int font, int *height, int *width) { - if (font == TEXT_FONT) { - *height = 1; *width = 1; return 1; - } - return 0; + if (font == TEXT_FONT) { + *height = 1; + *width = 1; + return 1; + } + return 0; } + void os_set_colour (int UNUSED (x), int UNUSED (y)) {} void os_set_font (int UNUSED (x)) {} #ifdef USE_UTF8 void zputchar(zchar c) { - if(c > 0x7ff) { - putchar(0xe0 | ((c >> 12) & 0xf)); - putchar(0x80 | ((c >> 6) & 0x3f)); - putchar(0x80 | (c & 0x3f)); - } else if(c > 0x7f) { - putchar(0xc0 | ((c >> 6) & 0x1f)); - putchar(0x80 | (c & 0x3f)); - } else { - putchar(c); - } + if(c > 0x7ff) { + putchar(0xe0 | ((c >> 12) & 0xf)); + putchar(0x80 | ((c >> 6) & 0x3f)); + putchar(0x80 | (c & 0x3f)); + } else if(c > 0x7f) { + putchar(0xc0 | ((c >> 6) & 0x1f)); + putchar(0x80 | (c & 0x3f)); + } else { + putchar(c); + } } #else #define zputchar(x) putchar(x) #endif + /* Print a cell to stdout. */ static void show_cell(cell cel) { - zchar c = cell_char(cel); - switch (cell_style(cel)) { - case 0: - zputchar(c); - break; - case PICTURE_STYLE: - zputchar(show_pictures ? c : ' '); - break; - case REVERSE_STYLE: - if (c == ' ') - putchar(rv_blank_char); - else - switch (rv_mode) { - case RV_CAPS: - if (c <= 0x7f ) - { - zputchar(toupper(c)); - break; + zchar c = cell_char(cel); + switch (cell_style(cel)) { + case 0: + zputchar(c); + break; + case PICTURE_STYLE: + zputchar(show_pictures ? c : ' '); + break; + case REVERSE_STYLE: + if (c == ' ') + putchar(rv_blank_char); + else { + switch (rv_mode) { + case RV_CAPS: + if (c <= 0x7f) { + zputchar(toupper(c)); + break; + } + case RV_NONE: + zputchar(c); + break; + case RV_UNDERLINE: + putchar('_'); + putchar('\b'); + zputchar(c); + break; + case RV_DOUBLESTRIKE: + zputchar(c); + putchar('\b'); + zputchar(c); + break; + } + break; } - case RV_NONE: zputchar(c); break; - case RV_UNDERLINE: putchar('_'); putchar('\b'); zputchar(c); break; - case RV_DOUBLESTRIKE: zputchar(c); putchar('\b'); zputchar(c); break; - } - break; - } + } } + static bool will_print_blank(cell c) { - return (((cell_style(c) == PICTURE_STYLE) && !show_pictures) - || ((cell_char(c) == ' ') - && ((cell_style(c) != REVERSE_STYLE) - || (rv_blank_char == ' ')))); + return (((cell_style(c) == PICTURE_STYLE) && !show_pictures) + || ((cell_char(c) == ' ') + && ((cell_style(c) != REVERSE_STYLE) + || (rv_blank_char == ' ')))); } + static void show_line_prefix(int row, char c) { - if (show_line_numbers) { - if (row == -1) - printf(".."); - else - printf("%02d", (row + 1) % 100); - } - if (show_line_types) - putchar(c); - /* Add a separator char (unless there's nothing to separate). */ - if (show_line_numbers || show_line_types) - putchar(' '); + if (show_line_numbers) { + if (row == -1) + printf(".."); + else + printf("%02d", (row + 1) % 100); + } + if (show_line_types) + putchar(c); + /* Add a separator char (unless there's nothing to separate). */ + if (show_line_numbers || show_line_types) + putchar(' '); } + /* Print a row to stdout. */ static void show_row(int r) { - if (r == -1) { - show_line_prefix(-1, '.'); - } else { - int c, last; - show_line_prefix(r, (r == cursor_row) ? ']' : ' '); - /* Don't print spaces at end of line. */ - /* (Saves bandwidth and printhead wear.) */ - /* TODO: compress spaces to tabs. */ - for (last = h_screen_cols - 1; last >= 0; last--) - if (!will_print_blank(dumb_row(r)[last])) - break; - for (c = 0; c <= last; c++) - show_cell(dumb_row(r)[c]); - } - putchar('\n'); + if (r == -1) { + show_line_prefix(-1, '.'); + } else { + int c, last; + show_line_prefix(r, (r == cursor_row) ? ']' : ' '); + /* Don't print spaces at end of line. */ + /* (Saves bandwidth and printhead wear.) */ + /* TODO: compress spaces to tabs. */ + for (last = h_screen_cols - 1; last >= 0; last--) { + if (!will_print_blank(dumb_row(r)[last])) + break; + } + + for (c = 0; c <= last; c++) + show_cell(dumb_row(r)[c]); + } + putchar('\n'); } + /* Print the part of the cursor row before the cursor. */ void dumb_show_prompt(bool show_cursor, char line_type) { - int i; - show_line_prefix(show_cursor ? cursor_row : -1, line_type); - if (show_cursor) { - for (i = 0; i < cursor_col; i++) - show_cell(dumb_row(cursor_row)[i]); - } + int i; + show_line_prefix(show_cursor ? cursor_row : -1, line_type); + if (show_cursor) { + for (i = 0; i < cursor_col; i++) + show_cell(dumb_row(cursor_row)[i]); + } } + static void mark_all_unchanged(void) { - memset(screen_changes, 0, screen_cells); + memset(screen_changes, 0, screen_cells); } + /* Check if a cell is a blank or will display as one. * (Used to help decide if contents are worth printing.) */ static bool is_blank(cell c) { - return ((cell_char(c) == ' ') - || ((cell_style(c) == PICTURE_STYLE) && !show_pictures)); + return ((cell_char(c) == ' ') + || ((cell_style(c) == PICTURE_STYLE) && !show_pictures)); } + /* Show the current screen contents, or what's changed since the last * call. * @@ -394,76 +440,82 @@ static bool is_blank(cell c) * last nonblank character on the last line that would be shown, then * don't show that line (because it will be redundant with the prompt * line just below it). */ + void dumb_show_screen(bool show_cursor) { - int r, c, first, last; - char changed_rows[0x100]; - - /* Easy case */ - if (compression_mode == COMPRESSION_NONE) { - for (r = hide_lines; r < h_screen_rows; r++) - show_row(r); - mark_all_unchanged(); - return; - } + int r, c, first, last; + char changed_rows[0x100]; - /* Check which rows changed, and where the first and last change is. */ - first = last = -1; - memset(changed_rows, 0, h_screen_rows); - for (r = hide_lines; r < h_screen_rows; r++) { - for (c = 0; c < h_screen_cols; c++) - if (dumb_changes_row(r)[c] && !is_blank(dumb_row(r)[c])) - break; - changed_rows[r] = (c != h_screen_cols); - if (changed_rows[r]) { - first = (first != -1) ? first : r; - last = r; + /* Easy case */ + if (compression_mode == COMPRESSION_NONE) { + for (r = hide_lines; r < h_screen_rows; r++) + show_row(r); + mark_all_unchanged(); + return; } - } - if (first == -1) - return; + /* Check which rows changed, and where the first and last change is. */ + first = last = -1; + memset(changed_rows, 0, h_screen_rows); + for (r = hide_lines; r < h_screen_rows; r++) { + for (c = 0; c < h_screen_cols; c++) { + if (dumb_changes_row(r)[c] && !is_blank(dumb_row(r)[c])) + break; + } - /* The show_cursor rule described above */ - if (show_cursor && (cursor_row == last)) { - for (c = cursor_col; c < h_screen_cols; c++) - if (!is_blank(dumb_row(last)[c])) - break; - if (c == h_screen_cols) - last--; - } + changed_rows[r] = (c != h_screen_cols); + if (changed_rows[r]) { + first = (first != -1) ? first : r; + last = r; + } + } - /* Display the appropriate rows. */ - if (compression_mode == COMPRESSION_MAX) { - for (r = first; r <= last; r++) - if (changed_rows[r]) - show_row(r); - } else { - /* COMPRESSION_SPANS */ - for (r = first; r <= last; r++) { - if (changed_rows[r] || changed_rows[r + 1]) - show_row(r); - else { - while (!changed_rows[r + 1]) - r++; - show_row(-1); - } + if (first == -1) + return; + + /* The show_cursor rule described above */ + if (show_cursor && (cursor_row == last)) { + for (c = cursor_col; c < h_screen_cols; c++) { + if (!is_blank(dumb_row(last)[c])) + break; + } + if (c == h_screen_cols) + last--; } - if (show_cursor && (cursor_row > last + 1)) - show_row((cursor_row == last + 2) ? (last + 1) : -1); - } - mark_all_unchanged(); + /* Display the appropriate rows. */ + if (compression_mode == COMPRESSION_MAX) { + for (r = first; r <= last; r++) { + if (changed_rows[r]) + show_row(r); + } + } else { + /* COMPRESSION_SPANS */ + for (r = first; r <= last; r++) { + if (changed_rows[r] || changed_rows[r + 1]) + show_row(r); + else { + while (!changed_rows[r + 1]) + r++; + show_row(-1); + } + } + if (show_cursor && (cursor_row > last + 1)) + show_row((cursor_row == last + 2) ? (last + 1) : -1); + } + mark_all_unchanged(); } + /* Unconditionally show whole screen. For \s user command. */ void dumb_dump_screen(void) { - int r; - for (r = 0; r < h_screen_height; r++) - show_row(r); + int r; + for (r = 0; r < h_screen_height; r++) + show_row(r); } + /* Called when it's time for a more prompt but user has them turned off. */ void dumb_elide_more_prompt(void) { @@ -473,17 +525,19 @@ void dumb_elide_more_prompt(void) } } + void os_reset_screen(void) { - dumb_show_screen(FALSE); + dumb_show_screen(FALSE); } + void os_beep (int volume) { - if (visual_bell) - printf("[%s-PITCHED BEEP]\n", (volume == 1) ? "HIGH" : "LOW"); - else - putchar('\a'); /* so much for dumb. */ + if (visual_bell) + printf("[%s-PITCHED BEEP]\n", (volume == 1) ? "HIGH" : "LOW"); + else + putchar('\a'); /* so much for dumb. */ } @@ -499,103 +553,103 @@ void os_stop_sample (int UNUSED (a)) {} /* if val is '0' or '1', set *var accordingly, else toggle it. */ static void toggle(bool *var, char val) { - *var = val == '1' || (val != '0' && !*var); + *var = val == '1' || (val != '0' && !*var); } + bool dumb_output_handle_setting(const char *setting, bool show_cursor, bool startup) { - char *p; - int i; - - if (!strncmp(setting, "pb", 2)) { - toggle(&show_pictures, setting[2]); - printf("Picture outlines display %s\n", show_pictures ? "ON" : "OFF"); - if (startup) - return TRUE; - for (i = 0; i < screen_cells; i++) - screen_changes[i] = (cell_style(screen_data[i]) == PICTURE_STYLE); - dumb_show_screen(show_cursor); - } else if (!strncmp(setting, "vb", 2)) { - toggle(&visual_bell, setting[2]); - printf("Visual bell %s\n", visual_bell ? "ON" : "OFF"); - os_beep(1); os_beep(2); - } else if (!strncmp(setting, "ln", 2)) { - toggle(&show_line_numbers, setting[2]); - printf("Line numbering %s\n", show_line_numbers ? "ON" : "OFF"); - } else if (!strncmp(setting, "lt", 2)) { - toggle(&show_line_types, setting[2]); - printf("Line-type display %s\n", show_line_types ? "ON" : "OFF"); - - } else if (*setting == 'c') { - switch (setting[1]) { - case 'm': compression_mode = COMPRESSION_MAX; break; - case 's': compression_mode = COMPRESSION_SPANS; break; - case 'n': compression_mode = COMPRESSION_NONE; break; - case 'h': hide_lines = atoi(&setting[2]); break; - default: return FALSE; - } - printf("Compression mode %s, hiding top %d lines\n", - compression_names[compression_mode], hide_lines); - } else if (*setting == 'r') { - switch (setting[1]) { - case 'n': rv_mode = RV_NONE; break; - case 'o': rv_mode = RV_DOUBLESTRIKE; break; - case 'u': rv_mode = RV_UNDERLINE; break; - case 'c': rv_mode = RV_CAPS; break; - case 'b': rv_blank_char = setting[2] ? setting[2] : ' '; break; - default: return FALSE; - } - printf("Reverse-video mode %s, blanks reverse to '%c': ", - rv_names[rv_mode], rv_blank_char); - - for (p = "sample reverse text"; *p; p++) - show_cell(make_cell(REVERSE_STYLE, *p)); - putchar('\n'); - for (i = 0; i < screen_cells; i++) - screen_changes[i] = (cell_style(screen_data[i]) == REVERSE_STYLE); - dumb_show_screen(show_cursor); - } else if (!strcmp(setting, "set")) { - - printf("Compression Mode %s, hiding top %d lines\n", - compression_names[compression_mode], hide_lines); - printf("Picture Boxes display %s\n", show_pictures ? "ON" : "OFF"); - printf("Visual Bell %s\n", visual_bell ? "ON" : "OFF"); - os_beep(1); os_beep(2); - printf("Line Numbering %s\n", show_line_numbers ? "ON" : "OFF"); - printf("Line-Type display %s\n", show_line_types ? "ON" : "OFF"); - printf("Reverse-Video mode %s, Blanks reverse to '%c': ", - rv_names[rv_mode], rv_blank_char); - for (p = "sample reverse text"; *p; p++) - show_cell(make_cell(REVERSE_STYLE, *p)); - putchar('\n'); - } else - return FALSE; - return TRUE; + char *p; + int i; + + if (!strncmp(setting, "pb", 2)) { + toggle(&show_pictures, setting[2]); + printf("Picture outlines display %s\n", show_pictures ? "ON" : "OFF"); + if (startup) + return TRUE; + for (i = 0; i < screen_cells; i++) + screen_changes[i] = (cell_style(screen_data[i]) == PICTURE_STYLE); + dumb_show_screen(show_cursor); + } else if (!strncmp(setting, "vb", 2)) { + toggle(&visual_bell, setting[2]); + printf("Visual bell %s\n", visual_bell ? "ON" : "OFF"); + os_beep(1); os_beep(2); + } else if (!strncmp(setting, "ln", 2)) { + toggle(&show_line_numbers, setting[2]); + printf("Line numbering %s\n", show_line_numbers ? "ON" : "OFF"); + } else if (!strncmp(setting, "lt", 2)) { + toggle(&show_line_types, setting[2]); + printf("Line-type display %s\n", show_line_types ? "ON" : "OFF"); + } else if (*setting == 'c') { + switch (setting[1]) { + case 'm': compression_mode = COMPRESSION_MAX; break; + case 's': compression_mode = COMPRESSION_SPANS; break; + case 'n': compression_mode = COMPRESSION_NONE; break; + case 'h': hide_lines = atoi(&setting[2]); break; + default: return FALSE; + } + printf("Compression mode %s, hiding top %d lines\n", + compression_names[compression_mode], hide_lines); + } else if (*setting == 'r') { + switch (setting[1]) { + case 'n': rv_mode = RV_NONE; break; + case 'o': rv_mode = RV_DOUBLESTRIKE; break; + case 'u': rv_mode = RV_UNDERLINE; break; + case 'c': rv_mode = RV_CAPS; break; + case 'b': rv_blank_char = setting[2] ? setting[2] : ' '; break; + default: return FALSE; + } + printf("Reverse-video mode %s, blanks reverse to '%c': ", + rv_names[rv_mode], rv_blank_char); + + for (p = "sample reverse text"; *p; p++) + show_cell(make_cell(REVERSE_STYLE, *p)); + putchar('\n'); + for (i = 0; i < screen_cells; i++) + screen_changes[i] = (cell_style(screen_data[i]) == REVERSE_STYLE); + dumb_show_screen(show_cursor); + } else if (!strcmp(setting, "set")) { + printf("Compression Mode %s, hiding top %d lines\n", + compression_names[compression_mode], hide_lines); + printf("Picture Boxes display %s\n", show_pictures ? "ON" : "OFF"); + printf("Visual Bell %s\n", visual_bell ? "ON" : "OFF"); + os_beep(1); os_beep(2); + printf("Line Numbering %s\n", show_line_numbers ? "ON" : "OFF"); + printf("Line-Type display %s\n", show_line_types ? "ON" : "OFF"); + printf("Reverse-Video mode %s, Blanks reverse to '%c': ", + rv_names[rv_mode], rv_blank_char); + for (p = "sample reverse text"; *p; p++) + show_cell(make_cell(REVERSE_STYLE, *p)); + putchar('\n'); + } else + return FALSE; + return TRUE; } + void dumb_init_output(void) { - if (h_version == V3) { - h_config |= CONFIG_SPLITSCREEN; - h_flags &= ~OLD_SOUND_FLAG; - } + if (h_version == V3) { + h_config |= CONFIG_SPLITSCREEN; + h_flags &= ~OLD_SOUND_FLAG; + } - if (h_version >= V5) { - h_flags &= ~SOUND_FLAG; - } + if (h_version >= V5) { + h_flags &= ~SOUND_FLAG; + } - h_screen_height = h_screen_rows; - h_screen_width = h_screen_cols; - screen_cells = h_screen_rows * h_screen_cols; + h_screen_height = h_screen_rows; + h_screen_width = h_screen_cols; + screen_cells = h_screen_rows * h_screen_cols; - h_font_width = 1; h_font_height = 1; + h_font_width = 1; h_font_height = 1; - if (show_line_types == -1) - show_line_types = h_version > 3; + if (show_line_types == -1) + show_line_types = h_version > 3; - screen_data = malloc(screen_cells * sizeof(cell)); - screen_changes = malloc(screen_cells); - os_erase_area(1, 1, h_screen_rows, h_screen_cols, -2); - memset(screen_changes, 0, screen_cells); + screen_data = malloc(screen_cells * sizeof(cell)); + screen_changes = malloc(screen_cells); + os_erase_area(1, 1, h_screen_rows, h_screen_cols, -2); + memset(screen_changes, 0, screen_cells); }