int reset_line () { #if defined(uniosu) putchar (Ctrl ('O')); /* おまじない。括弧の中はゼロでなくオー */ #endif /* defined(uniosu) */ if (empty_modep () == 0) { push_cursor (); set_scroll_region (0, crow - 1); kk_restore_cursor (); call_redraw_line (c_b->t_c_p, 1); pop_cursor (); } return (0); }
void special_reading_ansi(struct virtscreen *cur, unsigned char ch) { if ((ch>='0') && (ch<='9')) { cur->cur_ansi_number = (cur->cur_ansi_number * 10) + (ch - '0'); cur->ansi_reading_number = 1; return; } if ((cur->ansi_reading_number) || (ch == ';')) { if (cur->ansi_elements<MAX_ANSI_ELEMENTS) cur->ansi_element[cur->ansi_elements++] = cur->cur_ansi_number; cur->ansi_reading_number = 0; } cur->cur_ansi_number = 0; switch (ch) { case '?': case ';': return; case 'D': position_console(cur,0,(cur->ansi_elements) ? -cur->ansi_element[0] : -1,1); break; case 'a': case 'C': position_console(cur,0,(cur->ansi_elements) ? cur->ansi_element[0] : 1,1); break; case 'A': position_console(cur,(cur->ansi_elements) ? -cur->ansi_element[0] : -1,0,1); break; case 'e': case 'B': position_console(cur,(cur->ansi_elements) ? cur->ansi_element[0] : 1,0,1); break; case '`': case 'G': { int temp = cur->ansi_elements ? cur->ansi_element[0] : 1; if (temp) temp--; position_console(cur,cur->ypos,temp,0); } break; case 'E': position_console(cur,cur->ypos + ((cur->ansi_elements) ? cur->ansi_element[0] : 1), 0,0); break; case 'F': position_console(cur,cur->ypos - ((cur->ansi_elements) ? cur->ansi_element[0] : 1), 0,0); break; case 'd': { int temp = cur->ansi_elements ? cur->ansi_element[0] : 1; if (temp) temp--; position_console(cur,temp,cur->xpos,0); } break; case 'f': case 'H': { int row = (cur->ansi_elements > 0) ? cur->ansi_element[0] : 1; int col = (cur->ansi_elements > 1) ? cur->ansi_element[1] : 1; if (row) row--; if (col) col--; position_console(cur,row,col,0); } break; case 'J': clear_virtscreen(cur,(cur->ansi_elements) ? cur->ansi_element[0]: 0); break; case 'L': { int lines = (cur->ansi_elements) ? cur->ansi_element[0] : 1; while (lines>0) { scroll_virt_up_at_cursor(cur,0); lines--; } } break; case 'M': { int lines = (cur->ansi_elements) ? cur->ansi_element[0] : 1; while (lines>0) { scroll_virt_up_at_cursor(cur,1); lines--; } } break; case 'P': delete_chars_in_line(cur,(cur->ansi_elements) ? cur->ansi_element[0] : 1); break; case 'K': clear_to_eol(cur,cur->ansi_elements ? cur->ansi_element[0] : 0); break; case 's': cur->old_xpos = cur->xpos; cur->old_ypos = cur->ypos; break; case 'u': position_console(cur,cur->old_ypos,cur->old_xpos,0); break; case 'r': { int low = (cur->ansi_elements > 0) ? cur->ansi_element[0] : 1; int high = (cur->ansi_elements > 1) ? cur->ansi_element[1] : cur->rows; if (low<=high) set_scroll_region(cur,low,high); } break; case 'm': { int count = 0; int cthing; if (!cur->ansi_elements) change_attribute(cur,0x07); while (count < cur->ansi_elements) { cthing = cur->ansi_element[count]; switch (cthing) { case 0: case 27: change_attribute(cur,0x07); break; case 1: change_attribute(cur,cur->attrib | 0x08); break; case 5: change_attribute(cur,cur->attrib | 0x80); break; case 7: change_attribute(cur,0x70); break; case 21: case 22: change_attribute(cur,cur->attrib & 0xF7); break; case 25: change_attribute(cur,cur->attrib & 0x7F); break; default: if ((cthing>=30) && (cthing<=37)) { change_attribute(cur,(cur->attrib & 0xF8) | (cthing-30)); } if ((cthing>=40) && (cthing<=47)) { change_attribute(cur,(cur->attrib & 0x8F) | ((cthing-40) << 4)); } break; } count++; } } break; } cur->next_char_send = std_interpret_char; }
static bool process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCount) { bool ret = true; // kprintf("process_vt100_command: c '%c', argCount %ld, arg[0] %ld, arg[1] %ld, seenBracket %d\n", // c, argCount, args[0], args[1], seenBracket); if (seenBracket) { switch (c) { case 'H': // set cursor position case 'f': { int32 row = argCount > 0 ? args[0] : 1; int32 col = argCount > 1 ? args[1] : 1; if (row > 0) row--; if (col > 0) col--; move_cursor(col, row); break; } case 'A': // move up { int32 deltaY = argCount > 0 ? -args[0] : -1; if (deltaY == 0) deltaY = -1; move_cursor(sScreen.x, sScreen.y + deltaY); break; } case 'e': case 'B': // move down { int32 deltaY = argCount > 0 ? args[0] : 1; if (deltaY == 0) deltaY = 1; move_cursor(sScreen.x, sScreen.y + deltaY); break; } case 'D': // move left { int32 deltaX = argCount > 0 ? -args[0] : -1; if (deltaX == 0) deltaX = -1; move_cursor(sScreen.x + deltaX, sScreen.y); break; } case 'a': case 'C': // move right { int32 deltaX = argCount > 0 ? args[0] : 1; if (deltaX == 0) deltaX = 1; move_cursor(sScreen.x + deltaX, sScreen.y); break; } case '`': case 'G': // set X position { int32 newX = argCount > 0 ? args[0] : 1; if (newX > 0) newX--; move_cursor(newX, sScreen.y); break; } case 'd': // set y position { int32 newY = argCount > 0 ? args[0] : 1; if (newY > 0) newY--; move_cursor(sScreen.x, newY); break; } #if 0 case 's': // save current cursor save_cur(console, false); break; case 'u': // restore cursor restore_cur(console, false); break; case 'r': // set scroll region { int32 low = argCount > 0 ? args[0] : 1; int32 high = argCount > 1 ? args[1] : sScreen.lines; if (low <= high) set_scroll_region(console, low - 1, high - 1); break; } case 'L': // scroll virtual down at cursor { int32 lines = argCount > 0 ? args[0] : 1; while (lines > 0) { scrdown(console); lines--; } break; } case 'M': // scroll virtual up at cursor { int32 lines = argCount > 0 ? args[0] : 1; while (lines > 0) { scrup(console); lines--; } break; } #endif case 'K': if (argCount == 0 || args[0] == 0) { // erase to end of line erase_line(LINE_ERASE_RIGHT); } else if (argCount > 0) { if (args[0] == 1) erase_line(LINE_ERASE_LEFT); else if (args[0] == 2) erase_line(LINE_ERASE_WHOLE); } break; #if 0 case 'J': if (argCount == 0 || args[0] == 0) { // erase to end of screen erase_screen(console, SCREEN_ERASE_DOWN); } else { if (args[0] == 1) erase_screen(console, SCREEN_ERASE_UP); else if (args[0] == 2) erase_screen(console, SCREEN_ERASE_WHOLE); } break; #endif case 'm': if (argCount >= 0) set_vt100_attributes(args, argCount); break; default: ret = false; } } else { switch (c) { #if 0 case 'c': reset_console(console); break; case 'D': rlf(console); break; case 'M': lf(console); break; case '7': save_cur(console, true); break; case '8': restore_cur(console, true); break; #endif default: ret = false; } } return ret; }