void terminal::print_search_line(std::string str, int pos) const{ restore_cursor_pos(); erase_line(); fprintf(stderr,">%s", str.c_str()); restore_cursor_pos(); cursor_right(1+pos); }
static int check_complete_lines(Tetris *tetris) { int empty_cell_count = 0, line_count = 0; unsigned int check_count, x, y; for (check_count = 0; check_count < 4; ++check_count) { for (y = tetris->renderer->row_floor-1; y > 0; --y) { for (x = 1; x < tetris->renderer->buffer->width-1; ++x) { if (!Buffer_get_pixel_enabled(tetris->renderer->buffer, x, y) ) { ++empty_cell_count; } } if (empty_cell_count == 0) { ++line_count; erase_line(tetris->renderer, (int) y); ++tetris->lines_completed; Renderer_draw_panel_line_counter(tetris->renderer, tetris->lines_completed); } empty_cell_count = 0; } } tetris->renderer->buffer->dirty = 1; return line_count; }
void start_display_buff(char *buff) { char buffer[5]; num_members++; if (moreflg) return; if (currow >= LINES - 2) { page++; currow++; mvcur(0, 0, currow, STARTCOL); refresh(); if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1, 0) == 0) { erase_line(currow, STARTCOL); show_text(currow, STARTCOL, "Flushing query..."); moreflg = 1; return; } clrwin(DISPROW + 2); currow = DISPROW + 2; show_text(currow, STARTCOL, "continued"); currow++; } show_text(currow, STARTCOL, buff); currow++; return; }
void pause_exit(int prt_line, int delay) { char dummy; #ifdef __TURBOC__ /* Otherwise, TURBO C complains that delay is never used. */ dummy = (char) delay; #endif prt("[Press any key to continue, or Q to exit.]", prt_line, 10); dummy = inkey(); if (dummy == 'Q') { erase_line(prt_line, 0); exit_game(); } erase_line(prt_line, 0); }
static void redraw_line(void){ cursor_shift(-cursor); render(stderr, line->buf, display_utf8_of_rune); cursor += display_width(line, 0, line->buf->c); erase_line(); cursor_shift(-display_width(line, line->off, line->buf->c)); }
static void set_echo(Rune c, void* v, int enable){ if(!enable){ redraw_func = redraw_line_noecho; cursor_shift(-cursor); erase_line(); }else{ redraw_func = redraw_line; } }
void start_display(char *buff) { char *buffer; int secondcol; /* where to start the second column of text */ secondcol = (COLS / 2); /* 1/2 was accross the screen */ num_members++; if (moreflg) return; buffer = calloc(50, 1); if (currow >= LINES - 2) { page++; mvcur(0, 0, currow, STARTCOL); refresh(); if (Prompt("--RETURN for more, ctl-c to exit--", buffer, 1, 0) == 0) { erase_line(currow, STARTCOL); show_text(currow, STARTCOL, "Flushing query..."); moreflg = 1; goto cleanup; } clrwin(DISPROW + 2); currow = DISPROW + 2; sprintf(buffer, "Continued (Page %d)", page); show_text(currow, STARTCOL, buffer); currow++; toggle = 0; } if (!toggle) show_text(currow, STARTCOL, buff); else { erase_line(currow, secondcol - 1); /* in case the 1st col is too long */ show_text(currow, secondcol, buff); currow++; } toggle = !toggle; cleanup: free(buffer); }
int get_com(char *prompt,char *command){ int res; if(prompt) prt(prompt,0,0); *command=inkey(); if(*command==ESCAPE) res=FALSE; else res=TRUE; erase_line(MSG_LINE,0); return(res); }
int get_check(char*prompt){ int res; prt(prompt,0,0); if(wherex()>MSG_LEN +1) gotoxy(74,1); cputs(" [y/n]"); do{ res=inkey(); }while(res==' '); erase_line(0,0); if(res=='Y'||res=='y') return(TRUE); else return(FALSE); }
void terminal::print_result(const std::vector<node>& result, std::size_t selected) const{ restore_cursor_pos(); for(int i=0; i < options.number_of_result_lines; ++i){ fprintf(stderr,"\n"); erase_line(); } restore_cursor_pos(); for(std::size_t i=1; i <= result.size(); ++i){ fprintf(stderr,"\n"); if(i-1==selected) fprintf(stderr,"\033[7m"); fprintf(stderr,"%lu: %s%s",(unsigned long)i,result[i-1].location.c_str(), result[i-1].filename.c_str()); if(i-1==selected) fprintf(stderr,"\033[0m"); } }
void show_all(void) { char c; show_text(DISPROW, STARTCOL, "This function may take a while... proceed? [n] "); c = getchar() & INPUT_MASK; if (c == 'y' || c == 'Y') { move(DISPROW + 1, STARTCOL); addstr("Processing query...please hold"); refresh(); list_all_groups(); } else erase_line(DISPROW, STARTCOL); }
static int print_all(int argc, char *argv[], void *callback) { char buf[BUFSIZ]; if (moreflg) return 0; if (first_time) { erase_line(DISPROW + 1, STARTCOL); show_text(DISPROW + 1, STARTCOL, "All mailing lists:"); first_time = 0; } sprintf(buf, "%s\n", argv[0]); start_display(buf); return MR_CONT; }
static void flush_line(Rune c, void* f, int v){ if(pty_mode || f == NULL){ append_character(v); }else{ (*(void(*)(int)) f)(v); } cursor_shift(-cursor); erase_line(); fflush(stderr); render(stdout, line->buf, utf8_of_rune); fflush(stdout); if(pty_mode || f == NULL) line->buf->c--; /* FIXME! store history without the flushing character! */ hist_cur = hist_len - 1; history_save(); if(--lines <= 0) exit(0); history_add(); history_load(); }
void ident_char() { char command, query; register int i, n; if (get_com("Enter character to be identified :", &command)) switch(command) { /* every printing ASCII character is listed here, in the order in which they appear in the ASCII character set */ case ' ': prt(" - An open pit.", 0, 0); break; case '!': prt("! - A potion.", 0, 0); break; case '"': prt("\" - An amulet, periapt, or necklace.", 0, 0); break; case '#': prt("# - A stone wall.", 0, 0); break; case '$': prt("$ - Treasure.", 0, 0); break; case '%': if (highlight_seams == TRUE) prt("% - A magma or quartz vein.", 0, 0); else prt("% - Not used.", 0, 0); break; case '&': prt("& - Demon (Oh dear!).", 0, 0); break; case '\'': prt("' - An open door.", 0, 0); break; case '(': prt("( - Soft armor.", 0, 0); break; case ')': prt(") - A shield.", 0, 0); break; case '*': prt("* - Gems.", 0, 0); break; case '+': prt("+ - A closed door.", 0, 0); break; case ',': prt(", - Food or mushroom patch.", 0, 0); break; case '-': prt("- - A wand", 0, 0); break; case '.': prt(". - Floor.", 0, 0); break; case '/': prt("/ - A pole weapon.", 0, 0); break; /* case '0': prt("0 - Not used.", 0, 0); break; */ case '1': prt("1 - Entrance to General Store.", 0, 0); break; case '2': prt("2 - Entrance to Armory.", 0, 0); break; case '3': prt("3 - Entrance to Weaponsmith.", 0, 0); break; case '4': prt("4 - Entrance to Temple.", 0, 0); break; case '5': prt("5 - Entrance to Alchemy shop.", 0, 0); break; case '6': prt("6 - Entrance to Magic-Users store.", 0, 0); break; case '7': prt("7 - Entrance to the Healers.", 0, 0); break; case '8': prt("8 - Entrance to your home.", 0, 0); break; /* case '9': prt("9 - Not used.", 0, 0); break;*/ case ':': prt(": - Rubble.", 0, 0); break; case ';': prt("; - A loose rock.", 0, 0); break; case '<': prt("< - An up staircase.", 0, 0); break; case '=': prt("= - A ring.", 0, 0); break; case '>': prt("> - A down staircase.", 0, 0); break; case '?': prt("? - A scroll.", 0, 0); break; case '@': prt(py.misc.name, 0, 0); break; case 'A': prt("A - Angel.", 0, 0); break; case 'B': prt("B - Birds", 0, 0); break; case 'C': prt("C - Canine.", 0, 0); break; case 'D': prt("D - An Ancient Dragon (Beware).", 0, 0); break; case 'E': prt("E - Elemental.", 0, 0); break; case 'F': prt("F - Giant Fly.", 0, 0); break; case 'G': prt("G - Ghost.", 0, 0); break; case 'H': prt("H - Hybrid.", 0, 0); break; case 'I': prt("I - Minor Demon.", 0, 0); break; case 'J': prt("J - Jabberwock.", 0, 0); break; case 'K': prt("K - Killer Beetle.", 0, 0); break; case 'L': prt("L - Lich.", 0, 0); break; case 'M': prt("M - Mummy.", 0, 0); break; /* case 'N': prt("N - Not used.", 0, 0); break; */ case 'O': prt("O - Ogre.", 0, 0); break; case 'P': prt("P - Giant humanoid.", 0, 0); break; case 'Q': prt("Q - Quylthulg (Pulsing Flesh Mound).", 0, 0); break; case 'R': prt("R - Reptiles and Amphibians.", 0, 0); break; case 'S': prt("S - Giant Scorpion/Spider.", 0, 0); break; case 'T': prt("T - Troll.", 0, 0); break; case 'U': prt("U - Umber Hulk.", 0, 0); break; case 'V': prt("V - Vampire.", 0, 0); break; case 'W': prt("W - Wight or Wraith.", 0, 0); break; case 'X': prt("X - Xorn/Xaren.", 0, 0); break; case 'Y': prt("Y - Yeti.", 0, 0); break; case 'Z': prt("Z - Zepher hound (Elemental hound).", 0, 0); break; case '[': prt("[ - Hard armor.", 0, 0); break; case '\\': prt("\\ - A hafted weapon.", 0, 0); break; case ']': prt("] - Misc. armor.", 0, 0); break; case '^': prt("^ - A trap.", 0, 0); break; case '_': prt("_ - A staff.", 0, 0); break; /* case '`': prt("` - Not used.", 0, 0); break; */ case 'a': prt("a - Giant Ant/Ant Lion.", 0, 0); break; case 'b': prt("b - Giant Bat.", 0, 0); break; case 'c': prt("c - Giant Centipede.", 0, 0); break; case 'd': prt("d - a Dragon.", 0, 0); break; case 'e': prt("e - Floating Eye.", 0, 0); break; case 'f': prt("f - Felines", 0, 0); break; case 'g': prt("g - Golem.", 0, 0); break; case 'h': prt("h - Demi-humans.", 0, 0); break; case 'i': prt("i - Icky Thing.", 0, 0); break; case 'j': prt("j - Jelly.", 0, 0); break; case 'k': prt("k - Kobold.", 0, 0); break; case 'l': prt("l - Giant Louse.", 0, 0); break; case 'm': prt("m - Mold.", 0, 0); break; case 'n': prt("n - Naga.", 0, 0); break; case 'o': prt("o - Orc.", 0, 0); break; case 'p': prt("p - Person (Humanoid).", 0, 0); break; case 'q': prt("q - Quadroped.", 0, 0); break; case 'r': prt("r - Rodent.", 0, 0); break; case 's': prt("s - Skeleton.", 0, 0); break; case 't': prt("t - Giant Tick.", 0, 0); break; /* case 'u': prt("u - Unicorn.", 0, 0); break; */ case 'v': prt("v - Vortex.", 0, 0); break; case 'w': prt("w - Worm or Worm Mass.", 0, 0); break; /* case 'x': prt("x - Not used.", 0, 0); break; */ case 'y': prt("y - Yeek.", 0, 0); break; case 'z': prt("z - Zombie.", 0, 0); break; case '{': prt("{ - Arrow, bolt, or bullet.", 0, 0); break; case '|': prt("| - A sword or dagger.", 0, 0); break; case '}': prt("} - Bow, crossbow, or sling.", 0, 0); break; case '~': prt("~ - Tool or miscellaneous item.", 0, 0); break; default: prt("Not Used.", 0, 0); break; } /* Allow access to monster memory. -CJS- */ n = 0; for (i = MAX_CREATURES-1; i >= 0; i--) if ((c_list[i].cchar == command) && bool_roff_recall (i)) { if (n == 0) { put_buffer ("You recall those details? [y/n]", 0, 40); query = inkey(); if (query != 'y' && query != 'Y') break; erase_line (0, 40); save_screen (); } n++; query = roff_recall (i); restore_screen (); if (query == ESCAPE) break; } }
// you may want to have a look into /usr/src/linux/drivers/char/console.c void parse_character(termstate_t * term, l4_uint8_t c) { int i; // these must be handled independetly of state switch (c) { case 0: // ignore return; case 7: // bell // todo: impl. me return; case 8: // backspace if (term->cur_x > 0) term->cur_x--; return; case 9: // tab cursor_tab(term); return; case 10: // newline (lf) case 11: // ? case 12: // ? cursor_nl(term); return; case 13: // do a cr here, maybe a smart one (+ lf) cursor_cr(term); return; case 27: // ESC term->esc_state = ESesc; return; } // now check for the state-dependant characters switch (term->esc_state) { case ESnormal: // normal character if ((c >= 0x20 && c <= 0x7e) || (c >= 0xa1 && c <= 0xfe)) { if (term->insert_mode == VT100_INSMODE_REPLACE) { set_char(term, c); //vt100_redraw_xy(term, term->cur_x, term->cur_y); cursor_next(term); } else // VT100_INSMODE_INSERT { insert_char(term, c); //vt100_redraw(term); } return; } // switch (c) // { // } break; case ESesc: // normal ESC found term->esc_state = ESnormal; switch (c) { case '[': term->esc_state = ESsquare; return; case 'D': // lf cursor_lf(term); //vt100_redraw(term); return; case 'E': // cr + lf cursor_nl(term); //vt100_redraw(term); return; case 'H': // set tab at current position set_tab( term, term->cur_x ); return; case 'M': rev_scroll(term); //vt100_redraw(term); return; case '7': // save cursor position and attributes term->cur_stored_x = term->cur_x; term->cur_stored_y = term->cur_y; term->cur_stored_attr = term->attrib_mode; return; case '8': // restore saved cursor position and attributes term->cur_x = term->cur_stored_x; term->cur_y = term->cur_stored_y; term->attrib_mode = term->cur_stored_attr; return; case '#': term->esc_state = EShash; return; case 'c': // reset vt to default settings init_termstate(term, term->w, term->phys_h, term->virt_h); return; } case ESsquare: for(i = 0; i < NUM_PAR; i++) term->par[i] = 0; term->used_par = 0; term->esc_state = ESgetpars; term->ques = (c=='?'); if (term->ques) return; // fall-through case ESgetpars: if (c == ';' && term->used_par < NUM_PAR - 1) { term->used_par++; return; } else if (c >= '0' && c <= '9') { term->par[term->used_par] *= 10; term->par[term->used_par] += c - '0'; return; } else term->esc_state = ESgotpars; // fall-through case ESgotpars: term->esc_state = ESnormal; switch (c) { case 'h': if (term->ques) { // handle question commands ending with h for (i = 0; i <= term->used_par; i++) { switch( term->par[i] ) { case 5: // activate inverse screen if (set_mode(term, 1)) //vt100_redraw(term); break; case 6: // origin mode = scroll region term->origin_mode = VT100_ORIGIN_SCROLL; break; case 7: // autowrap mode on term->autowrap = 1; break; case 8: // autorepeat on term->autorepeat = 1; break; case 25: // activate cursor term->cursor_vis = 1; return; default: break; } } return; } else // handle commands without question mark { for(i = 0; i <= term->used_par; i++) { switch( term->par[i] ) { case 4: // insert mode on term->insert_mode = VT100_INSMODE_INSERT; break; case 12: // echo on term->echo = 1; break; case 20: // line feed mode term->newline = 1; break; default: break; } } return; } case 'l': if (term->ques) { for(i = 0; i <= term->used_par; i++) { // handle question commands ending with l switch( term->par[i] ) { case 3: // set 80 column mode, clear screen // todo: impl. resize and use it here break; case 5: // deactivate inverse screen if(set_mode(term, 0)) //vt100_redraw(term); break; case 6: // origin mode = whole screen term->origin_mode = VT100_ORIGIN_GLOBAL; case 7: // autowrap mode off term->autowrap = 0; break; case 8: // autorepeat off term->autorepeat = 0; break; case 25: // deactivate cursor term->cursor_vis = 0; return; default: break; } return; } } else // handle commands without question mark { for( i=0; i <= term->used_par; i++ ) { switch( term->par[i] ) { case 4: // insert mode off term->insert_mode = VT100_INSMODE_REPLACE; break; case 12: // echo off term->echo = 0; break; case 20: // carriage return mode term->newline = 0; break; default: break; } return; } } } if (term->ques) { term->ques = 0; return; } switch (c) { case 'F': // CR + up term->cur_x = 0; // fall through case 'A': // up if (! term->par[0]) term->par[0]++; cursor_up(term); return; case 'E': // CR + down term->cur_x = 0; // fall through case 'B': // down if (! term->par[0]) term->par[0]++; cursor_down(term); return; case 'C': // right // no parameter -> set parameter to default (=1) if (! term->par[0]) term->par[0]++; cursor_right(term); return; case 'D': // left if (! term->par[0]) term->par[0]++; cursor_left(term); return; case 'G': // cursor position horizontal absolute if ( (term->par[0] > 0) && (term->par[0] < term->w) ) term->cur_x = term->par[0]; return; case 'H': // absolute position (x,y) case 'f': // f is the same as H (correct me, if I'm wrong) // well it is the same in the Linux kernel, in theorie the // 'f' commands depend on the PUM (Position unit mode), // which can be characters (seems to be default) or inch if (term->par[0] > 0) // convert to (0, 0) based coords term->par[0]--; if (term->par[1] > 0) term->par[1]--; cursor_move_abs(term, term->par[1], term->par[0]); return; case 'I': // insert tabs ('\t', term->par[0] times) if (!term->par[0]) term->par[0]++; for (i=0;i<term->par[0];i++) cursor_tab(term); return; case 'J': switch(term->par[0]) { case 0: // kill to end of screen clean_to_eos(term); //vt100_redraw(term); return; case 1: // kill from start of screen clean_from_sos(term); //vt100_redraw(term); return; case 2: // kill whole screen clean_screen(term, ' '); //vt100_redraw(term); return; } case 'K': // kill to end of line switch(term->par[0]) { case 0: // clean to end of line clean_to_eol(term); //vt100_redraw(term); return; case 1: // clean from start of line clean_from_sol(term); return; case 2: // erase whole line clean_line(term, term->cur_y); return; } case 'L': // insert lines if (!term->par[0]) term->par[0] = 1; for (i=0; i<term->par[0]; i++) insert_line(term); //vt100_redraw(term); return; case 'M': // erase lines if (!term->par[0]) term->par[0] = 1; for (i=0; i<term->par[0]; i++) erase_line(term); //vt100_redraw(term); return; case 'c': // we were asked to identify the terminal type identify(term); return; case 'g': // erase tab(s) switch(term->par[0]) { case 0: remove_tab( term, term->cur_x ); break; case 3: clear_tabs( term ); break; default: break; } return; case 'm': csi_m(term); return; case 'r': // set scrolling region if (term->par[0] == 0) term->par[0]++; if (term->par[1] == 0) term->par[1] = term->phys_h; /* Minimum allowed region is 2 lines */ if (term->par[0] < term->par[1] && term->par[1] <= term->phys_h) { term->scroll_top = term->par[0] - 1; term->scroll_bottom = term->par[1]; // this line is excluded // if in origin mode, make sure that the cursor is placed // inside the scrolling region immediately if (term->origin_mode == VT100_ORIGIN_SCROLL) { term->cur_x = 0; term->cur_y = term->scroll_top; } } return; } case EShash: term->esc_state = ESnormal; switch(c) { case '8': // fill the screen with 'E' clean_screen(term, 'E'); //vt100_redraw(term); break; } break; } }
int vdehist_term_to_mgmt(struct vdehiststat *st) { unsigned char buf[BUFSIZE]; int n,i,rv=0; n=vdehist_termread(st->termfd,buf,BUFSIZE); //printf("termto mgmt N%d %x %x %x %x\n",n,buf[0],buf[1],buf[2],buf[3]); if (n==0) return 1; else if (n<0) return n; else { for (i=0;i<n && strlen(st->linebuf)<BUFSIZE;i++) { if (buf[i] == 0xff && buf[i+1] == 0xff) i++; if(buf[i]==0) buf[i]='\n'; /*telnet encode \n as a 0 when in raw mode*/ if (buf[i] == 0xff && buf[i+1] != 0xff) { i+=telnet_options(st,buf+i); } else if(buf[i] == 0x1b) { /* ESCAPE! */ if (buf[i+1]=='[' && st->status == HIST_COMMAND) { st->edited=1; switch (buf[i+2]) { case 'A': //fprintf(stderr,"UP\n"); erase_line(st,0); put_history(st); get_history(1,st); redraw_line(st,0); st->bufindex=strlen(st->linebuf); break; case 'B': //fprintf(stderr,"DOWN\n"); erase_line(st,0); put_history(st); get_history(-1,st); redraw_line(st,0); break; case 'C': //fprintf(stderr,"RIGHT\n"); if (st->linebuf[st->bufindex] != '\0') { vdehist_termwrite(st->termfd,"\033[C",3); (st->bufindex)++; } break; case 'D': //fprintf(stderr,"LEFT\n"); if (st->bufindex > 0) { vdehist_termwrite(st->termfd,"\033[D",3); (st->bufindex)--; } break; } i+=3; } else i+=2;/* ignored */ } else if(buf[i] < 0x20 && !(buf[i] == '\n' || buf[i] == '\r')) { /*ctrl*/ if (buf[i] == 4) /*ctrl D is a shortcut for UNIX people! */ { rv=1; break; } switch (buf[i]) { case 3: /*ctrl C cleans the current buffer */ erase_line(st,0); st->bufindex=0; st->linebuf[(st->bufindex)]=0; break; case 12: /* ctrl L redraw */ erase_line(st,1); redraw_line(st,1); break; case 1: /* ctrl A begin of line */ erase_line(st,0); st->bufindex=0; redraw_line(st,0); break; case 5: /* ctrl E endofline */ erase_line(st,0); st->bufindex=strlen(st->linebuf); redraw_line(st,0); case '\t': /* tab */ if (st->lastchar== '\t') { erase_line(st,1); showexpand(st->linebuf,st->bufindex,st->termfd); redraw_line(st,1); } else { erase_line(st,0); st->bufindex=tabexpand(st->linebuf,st->bufindex,BUFSIZE); redraw_line(st,0); } break; } } else if(buf[i] == 0x7f) { if(st->bufindex > 0) { char *x; (st->bufindex)--; x=st->linebuf+st->bufindex; memmove(x,x+1,strlen(x)); if (st->echo && !(st->status & HIST_PASSWDFLAG)) { if (st->edited) vdehist_termwrite(st->termfd,"\010\033[P",4); else vdehist_termwrite(st->termfd,"\010 \010",3); } } } else { if (st->echo && !(st->status & HIST_PASSWDFLAG)) { if (st->edited && buf[i] >= ' ') vdehist_termwrite(st->termfd,"\033[@",3); vdehist_termwrite(st->termfd,&(buf[i]),1); } if (buf[i] != '\r') { if (buf[i]=='\n') { if (st->status == HIST_COMMAND) { st->histindex=0; put_history(st); if (strlen(st->linebuf) > 0) shift_history(st); } st->bufindex=strlen(st->linebuf); if ((rv=hist_sendcmd(st)) != 0) break; st->bufindex=st->edited=st->histindex=0; st->linebuf[(st->bufindex)]=0; } else { char *x; x=st->linebuf+st->bufindex; memmove(x+1,x,strlen(x)+1); st->linebuf[(st->bufindex)++]=buf[i]; } } } st->lastchar=buf[i]; } } return rv; }
void vdehist_mgmt_to_term(struct vdehiststat *st) { char buf[BUFSIZE+1]; int n=0,ib=0; /* erase the input line */ erase_line(st,1); /* if the communication with the manager object holds, print the output*/ //fprintf(stderr,"mgmt2term\n"); if (st->mgmtfd) { n=vdehist_vderead(st->mgmtfd,buf,BUFSIZE); //fprintf(stderr,"mgmt2term n=%d\n",n); buf[n]=0; while (n>0) { for(ib=0;ib<n;ib++) { st->vlinebuf[(st->vbufindex)++]=buf[ib]; if (buf[ib] == '\n') { st->vlinebuf[(st->vbufindex)-1]='\r'; st->vlinebuf[(st->vbufindex)]='\n'; st->vlinebuf[(st->vbufindex)+1]='\0'; (st->vbufindex)++; if (st->vindata) { if (st->vlinebuf[0]=='.' && st->vlinebuf[1]=='\r') st->vindata=0; else vdehist_termwrite(st->termfd,st->vlinebuf,(st->vbufindex)); } else { char *message=st->vlinebuf; //fprintf(stderr,"MSG1 \"%s\"\n",message); while (*message != '\0' && !(isdigit(message[0]) && isdigit(message[1]) && isdigit(message[2]) && isdigit(message[3]))) message++; if (strncmp(message,"0000",4)==0) st->vindata=1; else if (isdigit(message[1]) && isdigit(message[2]) && isdigit(message[3])) { if(message[0]=='1') { message+=5; vdehist_termwrite(st->termfd,message,strlen(message)); } else if (message[0]=='3') { message+=5; vdehist_termwrite(st->termfd,"** DBG MSG: ",12); vdehist_termwrite(st->termfd,(message),strlen(message)); } } } (st->vbufindex)=0; } } n=vdehist_vderead(st->mgmtfd,buf,BUFSIZE); } } if (commandlist == NULL && st->mgmtfd >= 0) vdehist_create_commandlist(st->mgmtfd); /* redraw the input line */ redraw_line(st,1); }
/** * Execute ANSI escape code * @return 0 on success, negative on error */ static int execute_code(AVCodecContext * avctx, int c) { AnsiContext *s = avctx->priv_data; int ret, i; int width = 0; int height = 0; switch(c) { case 'A': //Cursor Up s->y = FFMAX(s->y - (s->nb_args > 0 ? s->args[0]*s->font_height : s->font_height), 0); break; case 'B': //Cursor Down s->y = FFMIN(s->y + (s->nb_args > 0 ? s->args[0]*s->font_height : s->font_height), avctx->height - s->font_height); break; case 'C': //Cursor Right s->x = FFMIN(s->x + (s->nb_args > 0 ? s->args[0]*FONT_WIDTH : FONT_WIDTH), avctx->width - FONT_WIDTH); break; case 'D': //Cursor Left s->x = FFMAX(s->x - (s->nb_args > 0 ? s->args[0]*FONT_WIDTH : FONT_WIDTH), 0); break; case 'H': //Cursor Position case 'f': //Horizontal and Vertical Position s->y = s->nb_args > 0 ? av_clip((s->args[0] - 1)*s->font_height, 0, avctx->height - s->font_height) : 0; s->x = s->nb_args > 1 ? av_clip((s->args[1] - 1)*FONT_WIDTH, 0, avctx->width - FONT_WIDTH) : 0; break; case 'h': //set creen mode case 'l': //reset screen mode if (s->nb_args < 2) s->args[0] = DEFAULT_SCREEN_MODE; switch(s->args[0]) { case 0: case 1: case 4: case 5: case 13: case 19: //320x200 (25 rows) s->font = ff_cga_font; s->font_height = 8; width = 40<<3; height = 25<<3; break; case 2: case 3: //640x400 (25 rows) s->font = ff_vga16_font; s->font_height = 16; width = 80<<3; height = 25<<4; break; case 6: case 14: //640x200 (25 rows) s->font = ff_cga_font; s->font_height = 8; width = 80<<3; height = 25<<3; break; case 7: //set line wrapping break; case 15: case 16: //640x350 (43 rows) s->font = ff_cga_font; s->font_height = 8; width = 80<<3; height = 43<<3; break; case 17: case 18: //640x480 (60 rows) s->font = ff_cga_font; s->font_height = 8; width = 80<<3; height = 60<<4; break; default: avpriv_request_sample(avctx, "Unsupported screen mode"); } if (width != 0 && height != 0 && (width != avctx->width || height != avctx->height)) { av_frame_unref(s->frame); ret = ff_set_dimensions(avctx, width, height); if (ret < 0) return ret; ret = ff_get_buffer(avctx, s->frame, AV_GET_BUFFER_FLAG_REF); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } s->frame->pict_type = AV_PICTURE_TYPE_I; s->frame->palette_has_changed = 1; memcpy(s->frame->data[1], ff_cga_palette, 16 * 4); erase_screen(avctx); } else if (c == 'l') { erase_screen(avctx); } break; case 'J': //Erase in Page switch (s->args[0]) { case 0: erase_line(avctx, s->x, avctx->width - s->x); if (s->y < avctx->height - s->font_height) memset(s->frame->data[0] + (s->y + s->font_height)*s->frame->linesize[0], DEFAULT_BG_COLOR, (avctx->height - s->y - s->font_height)*s->frame->linesize[0]); break; case 1: erase_line(avctx, 0, s->x); if (s->y > 0) memset(s->frame->data[0], DEFAULT_BG_COLOR, s->y * s->frame->linesize[0]); break; case 2: erase_screen(avctx); } break; case 'K': //Erase in Line switch(s->args[0]) { case 0: erase_line(avctx, s->x, avctx->width - s->x); break; case 1: erase_line(avctx, 0, s->x); break; case 2: erase_line(avctx, 0, avctx->width); } break; case 'm': //Select Graphics Rendition if (s->nb_args == 0) { s->nb_args = 1; s->args[0] = 0; } for (i = 0; i < FFMIN(s->nb_args, MAX_NB_ARGS); i++) { int m = s->args[i]; if (m == 0) { s->attributes = 0; s->fg = DEFAULT_FG_COLOR; s->bg = DEFAULT_BG_COLOR; } else if (m == 1 || m == 2 || m == 4 || m == 5 || m == 7 || m == 8) { s->attributes |= 1 << (m - 1); } else if (m >= 30 && m <= 38) { s->fg = ansi_to_cga[m - 30]; } else if (m == 39) { s->fg = ansi_to_cga[DEFAULT_FG_COLOR]; } else if (m >= 40 && m <= 47) { s->bg = ansi_to_cga[m - 40]; } else if (m == 49) { s->fg = ansi_to_cga[DEFAULT_BG_COLOR]; } else { avpriv_request_sample(avctx, "Unsupported rendition parameter"); } } break; case 'n': //Device Status Report case 'R': //report current line and column /* ignore */ break; case 's': //Save Cursor Position s->sx = s->x; s->sy = s->y; break; case 'u': //Restore Cursor Position s->x = av_clip(s->sx, 0, avctx->width - FONT_WIDTH); s->y = av_clip(s->sy, 0, avctx->height - s->font_height); break; default: avpriv_request_sample(avctx, "Unknown escape code"); break; } return 0; }
/** * Push one byte through the VT52 emulator. * * @param from_modem one byte from the remote side. * @param to_screen if the return is Q_EMUL_FSM_ONE_CHAR or * Q_EMUL_FSM_MANY_CHARS, then to_screen will have a character to display on * the screen. * @return one of the Q_EMULATION_STATUS constants. See emulation.h. */ Q_EMULATION_STATUS vt52(const unsigned char from_modem, wchar_t * to_screen) { static unsigned char *count; static attr_t attributes; int new_row; int new_col; unsigned char from_modem2; /* * The VT52 spec only supports 7-bit ASCII. Strip the high bit off every * character. */ from_modem2 = from_modem & 0x7F; DLOG(("STATE: %d CHAR: 0x%02x '%c'\n", scan_state, from_modem2, from_modem2)); vt52_start: switch (scan_state) { case SCAN_NONE: /* * ESC */ if (from_modem2 == C_ESC) { save_char(from_modem2, to_screen); scan_state = SCAN_ESC; return Q_EMUL_FSM_NO_CHAR_YET; } /* * Only a few control chars to handle here. CR and LF are in * emulation.c . */ if (from_modem2 == 0x05) { DLOG(("Enquire\n")); /* * ENQ - transmit the answerback message. */ qodem_write(q_child_tty_fd, get_option(Q_OPTION_ENQ_ANSWERBACK), strlen(get_option(Q_OPTION_ENQ_ANSWERBACK)), Q_TRUE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 0x08) { DLOG(("Backspace\n")); /* * Backspace. */ cursor_left(1, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 0x09) { DLOG(("Tab\n")); /* * Tab. */ while (q_status.cursor_x < 80) { cursor_right(1, Q_FALSE); if (q_status.cursor_x % 8 == 0) { break; } } clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 0x7F) { DLOG(("Del\n")); /* * Del - consume but do nothing. */ clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } /* * Any other control characters. */ if (iscntrl(from_modem2)) { /* * Consume but do nothing. */ clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } /* * This is a printable character. */ *to_screen = map_character(from_modem2); return Q_EMUL_FSM_ONE_CHAR; case SCAN_Y_1: save_char(from_modem2, to_screen); scan_state = SCAN_Y_2; return Q_EMUL_FSM_NO_CHAR_YET; case SCAN_Y_2: /* * q_emul_buffer[0] = ESC * q_emul_buffer[1] = 'Y' */ new_row = q_emul_buffer[2] - 32; new_col = from_modem2 - 32; if (new_row < 0) { new_row = 0; } if (new_col < 0) { new_col = 0; } DLOG(("Cursor position: %d %d\n", new_row, new_col)); cursor_position(new_row, new_col); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; case SCAN_ESC: if (from_modem2 == 'A') { DLOG(("Cursor up\n")); cursor_up(1, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'B') { DLOG(("Cursor down\n")); cursor_down(1, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'C') { DLOG(("Cursor right\n")); cursor_right(1, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'D') { DLOG(("Cursor left\n")); cursor_left(1, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'E') { DLOG(("Erase entire screen\n")); /* * Cursor position to (0,0) and erase entire screen. */ cursor_formfeed(); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'F') { DLOG(("Graphics mode ON\n")); graphics_mode = Q_TRUE; clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'G') { DLOG(("Graphics mode OFF\n")); graphics_mode = Q_FALSE; clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'H') { DLOG(("Cursor home\n")); cursor_position(0, 0); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'I') { DLOG(("Reverse linefeed\n")); /* * Move up one column, inserting a line if already at the top. */ if (q_status.cursor_y == 0) { scroll_down(1); } else { cursor_up(1, Q_FALSE); } clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'J') { DLOG(("Erase to end of screen\n")); /* * Erase from here to end of screen. */ erase_screen(q_status.cursor_y, q_status.cursor_x, HEIGHT - STATUS_HEIGHT - 1, WIDTH - 1, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'K') { DLOG(("Erase to end of line\n")); /* * Erase from here to end of line. */ erase_line(q_status.cursor_x, q_scrollback_current->length, Q_FALSE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'Y') { /* * Cursor position. */ save_char(from_modem2, to_screen); scan_state = SCAN_Y_1; return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'Z') { DLOG(("DECID\n")); /* * Identify */ /* * Note the VT100 and above will send <ESC>/Z, but the DECScope * manual claims the VT52 will send <ESC>/K if it does not have * an "integral electrolytic copier" (an internal printer that * used wet paper). */ qodem_write(q_child_tty_fd, "\033/K", 3, Q_TRUE); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == '=') { DLOG(("Alternate keypad ON\n")); q_vt52_alternate_keypad_mode = Q_TRUE; clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == '>') { DLOG(("Alternate keypad OFF\n")); q_vt52_alternate_keypad_mode = Q_FALSE; clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == '[') { if (q_status.vt52_color == Q_TRUE) { /* * Fall into SCAN_CSI only if VT52_COLOR is enabled. */ save_char(from_modem2, to_screen); scan_state = SCAN_CSI; return Q_EMUL_FSM_NO_CHAR_YET; } DLOG(("Hold screen mode ON\n")); q_status.hold_screen_mode = Q_TRUE; clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == '\\') { DLOG(("Hold screen mode OFF\n")); q_status.hold_screen_mode = Q_FALSE; clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } break; case SCAN_CSI: /* * We are only going to support CSI Pn [ ; Pn ... ] m a.k.a. ANSI * Select Graphics Rendition. We can see only a digit or 'm'. */ if (q_isdigit(from_modem2)) { /* * Save the position for the counter. */ count = q_emul_buffer + q_emul_buffer_n; save_char(from_modem2, to_screen); scan_state = SCAN_CSI_PARAM; return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'm') { /* * ESC [ m mean ESC [ 0 m, all attributes off. */ DLOG(("ANSI SGR: reset\n")); q_current_color = Q_A_NORMAL | scrollback_full_attr(Q_COLOR_CONSOLE_TEXT); clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } /* * This means we entered HOLD SCREEN mode. */ DLOG(("Hold screen mode ON\n")); q_status.hold_screen_mode = Q_TRUE; /* * Reprocess the character from the top. */ clear_state(to_screen); goto vt52_start; case SCAN_CSI_PARAM: /* * Following through on the SGR code, we are now looking only for a * digit, semicolon, or 'm' * */ if ((q_isdigit(from_modem2)) || (from_modem2 == ';')) { save_char(from_modem2, to_screen); scan_state = SCAN_CSI_PARAM; return Q_EMUL_FSM_NO_CHAR_YET; } if (from_modem2 == 'm') { DLOG(("ANSI SGR: change text attributes\n")); /* * Text attributes. */ if (ansi_color(&attributes, &count) == Q_TRUE) { q_current_color = attributes; } else { break; } clear_state(to_screen); return Q_EMUL_FSM_NO_CHAR_YET; } break; } /* * This point means we got most, but not all, of a sequence. */ q_emul_buffer[q_emul_buffer_n] = from_modem2; q_emul_buffer_n++; *to_screen = q_emul_buffer[q_emul_buffer_i]; q_emul_buffer_i++; scan_state = SCAN_NONE; /* * Special case: one character returns Q_EMUL_FSM_ONE_CHAR. */ if (q_emul_buffer_n == 1) { q_emul_buffer_i = 0; q_emul_buffer_n = 0; return Q_EMUL_FSM_ONE_CHAR; } return Q_EMUL_FSM_MANY_CHARS; }
void top_twenty(integer this_many) { /*{ Enters a players name on the top twenty list -JWT- }*/ string list[MAX_HIGH_SCORES+2]; integer players_line = 0; integer i1,i2,i3,i4; int n1; vtype o1,s1; FILE *f1; boolean flag; char ch; if (py.misc.cheated) { exit_game(); } clear_screen(); if (!read_top_scores(&f1, MORIA_TOP, list, MAX_HIGH_SCORES, &n1, s1)) { prt(s1,2,1); prt("",3,1); } else { i3 = total_points(); flag = false; if (i3 == 0) { i1 = n1; } else { for (i1=1; (i1 <= n1) && !flag ; ) { /* XXXX check for corruption */ sscanf(&(list[i1][13]),"%ld",&i4); if (i4 < i3) { flag = true; } else { i1++; } } } if ((i3 > 0) && ((flag) || (n1 == 0) || (n1 < MAX_HIGH_SCORES))) { for (i2 = MAX_HIGH_SCORES-1; i2 >= i1 ; i2--) { strcpy(list[i2+1], list[i2]); } user_name(o1); format_top_score(list[i1], o1, i3, PM.diffic, PM.name, PM.lev, PM.race, PM.tclass); if (n1 < MAX_HIGH_SCORES) { n1++; } max_score = n1; players_line = i1; flag = false; write_top_scores(&f1, list, n1); } else { /* did not get a high score */ max_score = 20; } if (!close_top_scores(&f1)) { prt("Error unlocking score file.",2,1); prt("",3,1); } put_buffer("Username Points Diff Character name Level Race Class",1,1); put_buffer("____________ ________ _ ________________________ __ __________ ________________",2,1); i2 = 3; if (max_score > n1) { max_score = n1; } if (this_many > 0) { if (this_many > MAX_HIGH_SCORES) { max_score = MAX_HIGH_SCORES; } else { max_score = this_many; } } for (i1 = 1; i1 <= max_score; i1++) { /*insert_str(list[i1],chr(7),''); XXXX why? */ if (i1 == players_line) { put_buffer_attr(list[i1],i2,1, A_REVERSE); } else { put_buffer(list[i1],i2,1); } if ((i1 != 1) && ((i1 % 20) == 0) && (i1 != max_score)) { prt("[Press any key to continue, or <Control>-Z to exit]", 24,1); ch = inkey(); switch (ch) { case 3: case 25: case 26: erase_line(24,1); put_buffer(" ",23,13); exit_game(); break; } clear_rc(3,1); i2 = 2; } i2++; } /* end for */ erase_line(23,1); put_qio(); } /* end if read_top_scores */ };
/* Handler for control sequencie introducer, "ESC [" */ static void control_escape_csi(char ch) { switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': console->params[console->param_count] = 10 * console->params[console->param_count] + (ch - '0'); break; case ';': if (console->param_count + 1 == CONSOLE_MAX_PARAMS) log_error("Too many console parameters.\n"); else console->param_count++; break; case 'A': /* CUU */ move_up(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'B': /* CUD */ case 'e': /* VPR */ move_down(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'C': /* CUF */ case 'a': /* HPR */ move_right(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'D': /* CUB */ move_left(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'd': /* VPA */ { int y = console->params[0]? console->params[0]: 1; if (y > console->height) y = console->height; set_pos(console->x, y - 1); console->processor = NULL; break; } case 'G': /* CHA */ case '`': /* HPA */ { int x = console->params[0] ? console->params[0] : 1; if (x > console->width) x = console->width; set_pos(x - 1, console->y); console->processor = NULL; break; } case 'H': case 'f': /* Zero or one both represents the first row/column */ if (console->params[0] > 0) console->params[0]--; if (console->params[1] > 0) console->params[1]--; if (console->origin_mode) set_pos(console->params[1], console->scroll_top + console->params[0]); else set_pos(console->params[1], console->params[0]); console->processor = NULL; break; case 'h': if (console->private_mode) change_private_mode(console->params[0], 1); else change_mode(console->params[0], 1); console->processor = NULL; break; case 'J': erase_screen(console->params[0]); console->processor = NULL; break; case 'K': erase_line(console->params[0]); console->processor = NULL; break; case 'l': if (console->private_mode) change_private_mode(console->params[0], 0); else change_mode(console->params[0], 0); console->processor = NULL; break; case 'L': /* IL */ insert_line(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'M': /* DL */ delete_line(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case '@': /* ICH */ insert_character(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'P': /* DCH */ delete_character(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case 'm': for (int i = 0; i <= console->param_count; i++) { switch (console->params[i]) { case 0: /* Reset */ console->bright = 0; console->reverse = 0; console->foreground = 7; console->background = 0; break; case 1: console->bright = 1; break; case 2: console->bright = 0; break; case 7: console->reverse = 1; break; case 27: console->reverse = 0; break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: console->foreground = console->params[i] - 30; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: console->background = console->params[i] - 40; break; default: log_error("Unknown console attribute: %d\n", console->params[i]); } } /* Set updated text attribute */ SetConsoleTextAttribute(console->out, get_text_attribute(console)); console->processor = NULL; break; case 'r': if (console->params[0] == 0) console->params[0] = 1; if (console->params[1] == 0) console->params[1] = console->height; console->scroll_full_screen = (console->params[0] == 1 && console->params[1] == console->height); console->scroll_top = console->params[0] - 1; console->scroll_bottom = console->params[1] - 1; set_pos(0, 0); console->processor = NULL; break; case 'S': /* SU */ scroll_up(console->params[0]? console->params[0]: 1); console->processor = NULL; break; case '?': console->private_mode = 1; break; default: log_error("control_escape_csi(): Unhandled character %c\n", ch); console->processor = NULL; } }
void crt__EL (int y, int x) /* Erase to end of Line */ { crt_move (y, x); scr$erase_line (); }
void discipline() { /*{ Use a monk's mental discipline. . . . -RAD- }*/ integer i2; integer choice,chance; integer y_dumy,x_dumy; boolean redraw; boolean flag; redraw = false; reset_flag = true; if (py.flags.confused > 0) { msg_print("You are too confused to concentrate...."); } else if (py.flags.image > 0) { msg_print("Colors and images run through your head, distracting you."); } else { flag = false; for (i2=0 ; (i2 < 40) && !flag ; i2++) { if (magic_spell[py.misc.pclass][i2].learned) { flag = true; } } if (flag) { inven_temp->data = monk_book; if (cast_spell("Use which discipline?",inven_temp, &choice,&chance,&redraw)) { //with magic_spell[py.misc.pclass][choice]. do; reset_flag = false; if (randint(100) < chance) { msg_print("You lost your concentration!"); } else { y_dumy = char_row; x_dumy = char_col; d__monk_effects(choice); if (!reset_flag) { //with py.misc do; PM.exp += magic_spell[py.misc.pclass][choice].sexp; prt_experience(); magic_spell[py.misc.pclass][choice].sexp = 0; } } //with py.misc do; if (!reset_flag) { if (magic_spell[py.misc.pclass][choice].smana > PM.cmana) { msg_print("You are distracted by the effort!"); py.flags.paralysis = randint(5*trunc(magic_spell[py.misc.pclass][choice].smana-PM.cmana)); PM.cmana = 0; } else { PM.cmana -= magic_spell[py.misc.pclass][choice].smana; } prt_mana(); } } else { erase_line(1,1); } } else { msg_print("You don't know any disciplines!"); } } }
void pause_line(int prt_line) { prt("[Press any key to continue.]", prt_line, 23); (void) inkey(); erase_line(prt_line, 0); }
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; }