1*53889Smckusick /* 2*53889Smckusick * Copyright (c) 1992 The Regents of the University of California. 3*53889Smckusick * All rights reserved. 4*53889Smckusick * 5*53889Smckusick * This code is derived from software contributed to Berkeley by 6*53889Smckusick * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc. 7*53889Smckusick * 8*53889Smckusick * %sccs.include.redist.c% 9*53889Smckusick * 10*53889Smckusick * from: $Hdr: vt100esc.c,v 4.300 91/06/09 06:14:59 root Rel41 $ SONY 11*53889Smckusick * 12*53889Smckusick * @(#)vt100esc.c 7.1 (Berkeley) 06/04/92 13*53889Smckusick */ 14*53889Smckusick 15*53889Smckusick /* 16*53889Smckusick * vt100 escape sequence handler 17*53889Smckusick */ 18*53889Smckusick 19*53889Smckusick #include "../include/fix_machine_type.h" 20*53889Smckusick 21*53889Smckusick #ifdef IPC_MRX 22*53889Smckusick #include "../../h/param.h" 23*53889Smckusick #include "../../iop/framebuf.h" 24*53889Smckusick #else 25*53889Smckusick #include "param.h" 26*53889Smckusick #include "../iop/framebuf.h" 27*53889Smckusick #endif 28*53889Smckusick 29*53889Smckusick #include "../bm/vt100.h" 30*53889Smckusick #include "../bm/bitmapif.h" 31*53889Smckusick 32*53889Smckusick #include "../fb/fbdefs.h" 33*53889Smckusick 34*53889Smckusick #ifdef IPC_MRX 35*53889Smckusick #include "../../iop/kbreg.h" 36*53889Smckusick #include "../../iop/keyboard.h" 37*53889Smckusick #else 38*53889Smckusick #include "../iop/kbreg.h" 39*53889Smckusick #include "../iop/keyboard.h" 40*53889Smckusick #endif 41*53889Smckusick 42*53889Smckusick #if CPU_SINGLE 43*53889Smckusick #include "../sio/scc.h" 44*53889Smckusick #endif 45*53889Smckusick 46*53889Smckusick #ifdef IPC_MRX 47*53889Smckusick #include "config.h" 48*53889Smckusick #define kbd_ioctl(chan, cmd, argp) { \ 49*53889Smckusick if (kb_ioctl) \ 50*53889Smckusick (*kb_ioctl)(chan, cmd, argp); \ 51*53889Smckusick } 52*53889Smckusick #endif 53*53889Smckusick 54*53889Smckusick /* 55*53889Smckusick * escape sequece functions 56*53889Smckusick */ 57*53889Smckusick int esc_csi(); 58*53889Smckusick int esc_csi_ansi(); 59*53889Smckusick int esc_csi_dec(); 60*53889Smckusick int esc_store_csr(); 61*53889Smckusick int esc_restore_csr(); 62*53889Smckusick int esc_index(); 63*53889Smckusick int esc_next_line(); 64*53889Smckusick int esc_tab_set(); 65*53889Smckusick int esc_rev_index(); 66*53889Smckusick int esc_numeric_kpad(); 67*53889Smckusick int esc_application_kpad(); 68*53889Smckusick int esc_line_size(); 69*53889Smckusick int esc_char_setr(); 70*53889Smckusick int esc_char_setl(); 71*53889Smckusick int esc_kanji_set(); 72*53889Smckusick int esc_parm_set(); 73*53889Smckusick int esc_pf_define(); 74*53889Smckusick int esc_ignore(); 75*53889Smckusick 76*53889Smckusick struct esc_sequence esc_seq_table[] = { 77*53889Smckusick {'[', "ABCDfgHhJKLlMmnPr", esc_csi}, 78*53889Smckusick {'7', "", esc_store_csr}, 79*53889Smckusick {'8', "", esc_restore_csr}, 80*53889Smckusick {'D', "", esc_index}, 81*53889Smckusick {'E', "", esc_next_line}, 82*53889Smckusick {'H', "", esc_tab_set}, 83*53889Smckusick {'M', "", esc_rev_index}, 84*53889Smckusick {'=', "", esc_application_kpad}, 85*53889Smckusick {'>', "", esc_numeric_kpad}, 86*53889Smckusick {'#', "34568", esc_line_size}, 87*53889Smckusick {'(', "0ABJH", esc_char_setr}, 88*53889Smckusick {')', "0AB", esc_char_setl}, 89*53889Smckusick {'$', "B@", esc_kanji_set}, 90*53889Smckusick {'~', "fcpsomdbDiGCBTtE", esc_parm_set}, 91*53889Smckusick {'P', "pPZiI", esc_pf_define}, 92*53889Smckusick {'\0', "", esc_ignore}, 93*53889Smckusick }; 94*53889Smckusick 95*53889Smckusick struct key_pad key_pad[] = { 96*53889Smckusick { '0', 'p' }, /* 0 */ 97*53889Smckusick { '1', 'q' }, /* 1 */ 98*53889Smckusick { '2', 'r' }, /* 2 */ 99*53889Smckusick { '3', 's' }, /* 3 */ 100*53889Smckusick { '4', 't' }, /* 4 */ 101*53889Smckusick { '5', 'u' }, /* 5 */ 102*53889Smckusick { '6', 'v' }, /* 6 */ 103*53889Smckusick { '7', 'w' }, /* 7 */ 104*53889Smckusick { '8', 'x' }, /* 8 */ 105*53889Smckusick { '9', 'y' }, /* 9 */ 106*53889Smckusick { '.', 'n' }, /* period */ 107*53889Smckusick { '-', 'm' }, /* minus */ 108*53889Smckusick { '+', 'k' }, /* plus */ 109*53889Smckusick { ',', 'l' }, /* comma */ 110*53889Smckusick { '\n', 'M' }, /* enter */ 111*53889Smckusick { 'A', 'A' }, /* cursor up */ 112*53889Smckusick { 'B', 'B' }, /* cursor down */ 113*53889Smckusick { 'C', 'C' }, /* cursor right */ 114*53889Smckusick { 'D', 'D' }, /* cursor left */ 115*53889Smckusick { '\0', '\0' } /* */ 116*53889Smckusick }; 117*53889Smckusick 118*53889Smckusick static char esc_buf[ESC_BUF_SIZ]; 119*53889Smckusick static char *esc_bp = esc_buf; 120*53889Smckusick extern char c_pos_mess[]; 121*53889Smckusick 122*53889Smckusick Key_string key_str; 123*53889Smckusick Pfk_string pfk_str; 124*53889Smckusick 125*53889Smckusick unsigned int first_jcode; 126*53889Smckusick 127*53889Smckusick /* 128*53889Smckusick * put out jis-code kanji 129*53889Smckusick */ 130*53889Smckusick jiskanji(sp, c) 131*53889Smckusick register SCREEN *sp; 132*53889Smckusick register unsigned int c; 133*53889Smckusick { 134*53889Smckusick if (first_jcode) { 135*53889Smckusick addch(sp, c | (first_jcode << 8)); 136*53889Smckusick first_jcode = 0; 137*53889Smckusick } else { 138*53889Smckusick first_jcode = c; 139*53889Smckusick } 140*53889Smckusick } 141*53889Smckusick 142*53889Smckusick /* 143*53889Smckusick * This routine is the command analiser using second character. 144*53889Smckusick * If a command has found then switch to particular escape handling 145*53889Smckusick * routine, and directly called by mother routine. 146*53889Smckusick * The arguments are passed through the routine. 147*53889Smckusick */ 148*53889Smckusick esc_top_level(sp, c) 149*53889Smckusick register SCREEN *sp; 150*53889Smckusick char c; 151*53889Smckusick { 152*53889Smckusick register struct esc_sequence *estp; 153*53889Smckusick 154*53889Smckusick for (estp = esc_seq_table; estp->command ; estp++) { 155*53889Smckusick if (estp->command == c) { 156*53889Smckusick /* command found */ 157*53889Smckusick sp->s_estp = estp; 158*53889Smckusick if (*estp->terminators == '\0') { 159*53889Smckusick (*estp->esc_func)(sp); 160*53889Smckusick sp->s_current_stat &= ~ESCAPE; 161*53889Smckusick } else { 162*53889Smckusick sp->s_esc_handler = estp->esc_func; 163*53889Smckusick } 164*53889Smckusick return; 165*53889Smckusick } 166*53889Smckusick } 167*53889Smckusick sp->s_current_stat &= ~ESCAPE; 168*53889Smckusick } 169*53889Smckusick 170*53889Smckusick /* 171*53889Smckusick * Undo the ESCAPE flag, escape buffer 172*53889Smckusick * and the esc_handler routine 173*53889Smckusick * This routine has to be called when escape sequence has started. 174*53889Smckusick */ 175*53889Smckusick recover(sp) 176*53889Smckusick register SCREEN *sp; 177*53889Smckusick { 178*53889Smckusick register int *ip = (int *) esc_buf; 179*53889Smckusick register int *sup = (int *) (esc_buf + ESC_BUF_SIZ); 180*53889Smckusick 181*53889Smckusick sp->s_current_stat &= ~ESCAPE; 182*53889Smckusick sp->s_esc_handler = esc_top_level; 183*53889Smckusick while (ip < sup) 184*53889Smckusick *ip++ = 0; 185*53889Smckusick esc_bp = esc_buf; 186*53889Smckusick } 187*53889Smckusick 188*53889Smckusick /* 189*53889Smckusick * This routine in_str(c, string) returns 190*53889Smckusick * if string contains c then TRUE (1) else FALSE (0) 191*53889Smckusick */ 192*53889Smckusick in_str(c, string) 193*53889Smckusick char c; 194*53889Smckusick register char *string; 195*53889Smckusick { 196*53889Smckusick while(*string) 197*53889Smckusick if (c == *string++) 198*53889Smckusick return(TRUE); 199*53889Smckusick return(FALSE); 200*53889Smckusick } 201*53889Smckusick 202*53889Smckusick /* 203*53889Smckusick * Control sequence introducer (CSI) 204*53889Smckusick * Which begins `^[[' and terminates one of `ABCDfgHhJKLlMmPr' 205*53889Smckusick */ 206*53889Smckusick esc_csi(sp, c) 207*53889Smckusick register SCREEN *sp; 208*53889Smckusick unsigned int c; 209*53889Smckusick { 210*53889Smckusick static int bufc = 0; 211*53889Smckusick 212*53889Smckusick if (in_str(c, sp->s_estp->terminators)) { 213*53889Smckusick esc_csi_ansi(sp, esc_bp, c); 214*53889Smckusick sp->s_current_stat &= ~ESCAPE; 215*53889Smckusick bufc = 0; 216*53889Smckusick return; 217*53889Smckusick } 218*53889Smckusick /* buffering arguments */ 219*53889Smckusick if (bufc < ESC_BUF_SIZ) { 220*53889Smckusick if (c >= '0' && c <= '9') { 221*53889Smckusick *esc_bp = *esc_bp *10 + (c - '0'); 222*53889Smckusick } else if (c == ';') { 223*53889Smckusick esc_bp++; 224*53889Smckusick bufc++; 225*53889Smckusick } else if (c == '?') { 226*53889Smckusick if (esc_bp == esc_buf) { 227*53889Smckusick sp->s_esc_handler = esc_csi_dec; 228*53889Smckusick } else { 229*53889Smckusick esc_buf[0] = INVALID; 230*53889Smckusick } 231*53889Smckusick } else { 232*53889Smckusick sp->s_current_stat &= ~ESCAPE; 233*53889Smckusick bufc = 0; 234*53889Smckusick } 235*53889Smckusick } 236*53889Smckusick } 237*53889Smckusick 238*53889Smckusick #ifdef IPC_MRX 239*53889Smckusick #define SCC_KEYBOARD 0 240*53889Smckusick #endif 241*53889Smckusick 242*53889Smckusick /* 243*53889Smckusick * Ansi standard csi handler 244*53889Smckusick */ 245*53889Smckusick esc_csi_ansi(sp, esc_bp, terminator) 246*53889Smckusick register SCREEN *sp; 247*53889Smckusick char *esc_bp; 248*53889Smckusick char terminator; 249*53889Smckusick { 250*53889Smckusick register char *cp = esc_buf; 251*53889Smckusick register struct cursor *spc = &sp->s_csr; 252*53889Smckusick register char *p; 253*53889Smckusick register int i; 254*53889Smckusick 255*53889Smckusick if (*cp == INVALID) 256*53889Smckusick return; 257*53889Smckusick 258*53889Smckusick cursor_off(); 259*53889Smckusick switch (terminator) { 260*53889Smckusick case 'A': /* CUU */ 261*53889Smckusick if (spc->csr_y < sp->s_region.top_margin) { 262*53889Smckusick spc->csr_y = MAX(spc->csr_y - MAX(*cp, 1) 263*53889Smckusick ,TOP_M); 264*53889Smckusick } else { 265*53889Smckusick spc->csr_y = MAX(spc->csr_y - MAX(*cp, 1) 266*53889Smckusick ,sp->s_region.top_margin); 267*53889Smckusick } 268*53889Smckusick spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst; 269*53889Smckusick sp->s_current_stat &= ~WRAP; 270*53889Smckusick break; 271*53889Smckusick case 'B': /* CUD */ 272*53889Smckusick if (spc->csr_y > sp->s_region.btm_margin) { 273*53889Smckusick spc->csr_y = MIN(spc->csr_y + MAX(*cp, 1) 274*53889Smckusick ,btm_m); 275*53889Smckusick } else { 276*53889Smckusick spc->csr_y = MIN(spc->csr_y + MAX(*cp, 1) 277*53889Smckusick ,sp->s_region.btm_margin); 278*53889Smckusick } 279*53889Smckusick spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst; 280*53889Smckusick sp->s_current_stat &= ~WRAP; 281*53889Smckusick break; 282*53889Smckusick case 'C': /* CUF */ 283*53889Smckusick spc->csr_x = MIN(spc->csr_x + MAX(*cp, 1), rit_m); 284*53889Smckusick spc->csr_p.x = (spc->csr_x - 1) * char_w + x_ofst; 285*53889Smckusick sp->s_current_stat &= ~WRAP; 286*53889Smckusick break; 287*53889Smckusick case 'D': /* CUB */ 288*53889Smckusick spc->csr_x = MAX(spc->csr_x - MAX(*cp, 1), LFT_M); 289*53889Smckusick spc->csr_p.x = (spc->csr_x - 1) * char_w + x_ofst; 290*53889Smckusick sp->s_current_stat &= ~WRAP; 291*53889Smckusick break; 292*53889Smckusick case 'g': /* TBC */ 293*53889Smckusick switch (*cp) { 294*53889Smckusick case 0: 295*53889Smckusick sp->s_tab_pos[spc->csr_x] = 0; 296*53889Smckusick break; 297*53889Smckusick case 3: 298*53889Smckusick for (i = 0; i <= rit_m; i++) 299*53889Smckusick sp->s_tab_pos[i] = 0; 300*53889Smckusick break; 301*53889Smckusick default: 302*53889Smckusick break; 303*53889Smckusick } 304*53889Smckusick break; 305*53889Smckusick case 'f': /* HVP */ 306*53889Smckusick case 'H': /* CUP same as HVP */ 307*53889Smckusick csr_pos(sp, cp[1], cp[0]); 308*53889Smckusick sp->s_current_stat &= ~WRAP; 309*53889Smckusick break; 310*53889Smckusick case 'J': /* ED */ 311*53889Smckusick erase_disp(sp, cp[0]); 312*53889Smckusick sp->s_current_stat &= ~WRAP; 313*53889Smckusick break; 314*53889Smckusick case 'K': /* EL */ 315*53889Smckusick erase_line(sp, cp[0]); 316*53889Smckusick sp->s_current_stat &= ~WRAP; 317*53889Smckusick break; 318*53889Smckusick case 'L': /* IL */ 319*53889Smckusick insert_line(sp, cp[0]); 320*53889Smckusick break; 321*53889Smckusick case 'M': /* DL */ 322*53889Smckusick delete_line(sp, cp[0]); 323*53889Smckusick break; 324*53889Smckusick case 'P': /* DCH */ 325*53889Smckusick delete_char(sp, cp[0]); 326*53889Smckusick sp->s_current_stat &= ~WRAP; 327*53889Smckusick break; 328*53889Smckusick case 'r': /* DECSTBM */ 329*53889Smckusick cp[2] = MAX(cp[0] == 0 ? TOP_M: cp[0], TOP_M); 330*53889Smckusick cp[3] = MIN(cp[1] == 0 ? btm_m: cp[1], btm_m); 331*53889Smckusick if (cp[2] >= cp[3]) 332*53889Smckusick break; 333*53889Smckusick 334*53889Smckusick sp->s_region.top_margin = cp[2]; 335*53889Smckusick sp->s_region.btm_margin = cp[3]; 336*53889Smckusick 337*53889Smckusick spc->csr_x = LFT_M; 338*53889Smckusick spc->csr_p.x = x_ofst; 339*53889Smckusick if (sp->s_term_mode & DECOM) { 340*53889Smckusick spc->csr_y = sp->s_region.top_margin; 341*53889Smckusick spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst; 342*53889Smckusick } else { 343*53889Smckusick spc->csr_y = TOP_M; 344*53889Smckusick spc->csr_p.y = y_ofst; 345*53889Smckusick } 346*53889Smckusick break; 347*53889Smckusick case 'm': /* CRA */ 348*53889Smckusick while (cp <= esc_bp) { 349*53889Smckusick switch (*cp++) { 350*53889Smckusick case 0: 351*53889Smckusick spc->csr_attributes &= NORMALM; 352*53889Smckusick if (sp->s_term_mode & DECSCNM) { 353*53889Smckusick fcolor = sp->s_bgcol; 354*53889Smckusick bcolor = sp->s_plane; 355*53889Smckusick } 356*53889Smckusick else { 357*53889Smckusick fcolor = sp->s_plane; 358*53889Smckusick bcolor = sp->s_bgcol; 359*53889Smckusick } 360*53889Smckusick break; 361*53889Smckusick case 1: /* bold */ 362*53889Smckusick spc->csr_attributes |= BOLD; 363*53889Smckusick break; 364*53889Smckusick case 4: /* under score */ 365*53889Smckusick spc->csr_attributes |= USCORE; 366*53889Smckusick break; 367*53889Smckusick case 5: /* blinking */ 368*53889Smckusick spc->csr_attributes |= BLINK; 369*53889Smckusick break; 370*53889Smckusick case 7: /* reverse */ 371*53889Smckusick spc->csr_attributes |= REVERSE; 372*53889Smckusick if (sp->s_term_mode & DECSCNM) { 373*53889Smckusick fcolor = sp->s_plane; 374*53889Smckusick bcolor = sp->s_bgcol; 375*53889Smckusick } 376*53889Smckusick else { 377*53889Smckusick fcolor = sp->s_bgcol; 378*53889Smckusick bcolor = sp->s_plane; 379*53889Smckusick } 380*53889Smckusick break; 381*53889Smckusick case 22: /* unbold */ 382*53889Smckusick spc->csr_attributes &= ~BOLD; 383*53889Smckusick break; 384*53889Smckusick case 24: /* no under score */ 385*53889Smckusick spc->csr_attributes &= ~USCORE; 386*53889Smckusick break; 387*53889Smckusick case 25: /* no blinking */ 388*53889Smckusick spc->csr_attributes &= ~BLINK; 389*53889Smckusick break; 390*53889Smckusick case 27: /* re-reverse */ 391*53889Smckusick spc->csr_attributes &= ~REVERSE; 392*53889Smckusick if (sp->s_term_mode & DECSCNM) { 393*53889Smckusick fcolor = sp->s_bgcol; 394*53889Smckusick bcolor = sp->s_plane; 395*53889Smckusick } 396*53889Smckusick else { 397*53889Smckusick fcolor = sp->s_plane; 398*53889Smckusick bcolor = sp->s_bgcol; 399*53889Smckusick } 400*53889Smckusick break; 401*53889Smckusick default: 402*53889Smckusick break; 403*53889Smckusick } 404*53889Smckusick } 405*53889Smckusick break; 406*53889Smckusick case 'n': 407*53889Smckusick while (cp <= esc_bp) { /* DSR(status request) */ 408*53889Smckusick switch (*cp++) { 409*53889Smckusick case 6: /* inquiry cursor position */ 410*53889Smckusick key_str.key_string = c_pos_mess; 411*53889Smckusick key_str.key_length = spr(c_pos_mess, 412*53889Smckusick "\033[%d;%dR", (sp->s_term_mode & DECOM) ? 413*53889Smckusick spc->csr_y - sp->s_region.top_margin + 1: 414*53889Smckusick spc->csr_y, spc->csr_x); 415*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 416*53889Smckusick break; 417*53889Smckusick default: 418*53889Smckusick break; 419*53889Smckusick } 420*53889Smckusick } 421*53889Smckusick break; 422*53889Smckusick case 'h': /* SM */ 423*53889Smckusick while (cp <= esc_bp) { 424*53889Smckusick switch (*cp++) { 425*53889Smckusick case 2: /* Keyboard Action */ 426*53889Smckusick sp->s_term_mode |= KAM; 427*53889Smckusick break; 428*53889Smckusick case 4: /* Insert Replace */ 429*53889Smckusick sp->s_term_mode |= IRM; 430*53889Smckusick break; 431*53889Smckusick case 12: /* Local echo disable */ 432*53889Smckusick sp->s_term_mode |= SRM; 433*53889Smckusick break; 434*53889Smckusick case 20: /* Linefeed newline */ 435*53889Smckusick sp->s_term_mode |= LNM; 436*53889Smckusick break; 437*53889Smckusick default: 438*53889Smckusick break; 439*53889Smckusick } 440*53889Smckusick } 441*53889Smckusick break; 442*53889Smckusick case 'l': /* RM */ 443*53889Smckusick while (cp <= esc_bp) { 444*53889Smckusick switch (*cp++) { 445*53889Smckusick case 2: /* Keyboard Action */ 446*53889Smckusick sp->s_term_mode &= ~KAM; 447*53889Smckusick break; 448*53889Smckusick case 4: /* Insert Replace */ 449*53889Smckusick sp->s_term_mode &= ~IRM; 450*53889Smckusick break; 451*53889Smckusick case 12: /* Local echo disable */ 452*53889Smckusick sp->s_term_mode &= ~SRM; 453*53889Smckusick break; 454*53889Smckusick case 20: /* Linefeed newline */ 455*53889Smckusick sp->s_term_mode &= ~LNM; 456*53889Smckusick break; 457*53889Smckusick default: 458*53889Smckusick break; 459*53889Smckusick } 460*53889Smckusick } 461*53889Smckusick break; 462*53889Smckusick default: 463*53889Smckusick break; 464*53889Smckusick } 465*53889Smckusick cursor_on(&spc->csr_p); 466*53889Smckusick sp->s_current_stat &= ~ESCAPE; 467*53889Smckusick } 468*53889Smckusick 469*53889Smckusick 470*53889Smckusick /* 471*53889Smckusick * Cursor position. 472*53889Smckusick * csr_pos(sp, x, y) moves the cursor to (x, y). 473*53889Smckusick */ 474*53889Smckusick csr_pos(sp, x, y) 475*53889Smckusick register SCREEN *sp; 476*53889Smckusick register int x, y; 477*53889Smckusick { 478*53889Smckusick if (sp->s_term_mode & DECOM) { 479*53889Smckusick sp->s_csr.csr_y = MIN(sp->s_region.top_margin + 480*53889Smckusick MAX(y, 1) - 1, sp->s_region.btm_margin); 481*53889Smckusick } else { 482*53889Smckusick sp->s_csr.csr_y = MIN(TOP_M + MAX(y, 1) - 1, btm_m); 483*53889Smckusick } 484*53889Smckusick sp->s_csr.csr_x = MAX(MIN(x, rit_m), LFT_M); 485*53889Smckusick sp->s_csr.csr_p.x = (sp->s_csr.csr_x -1) * char_w + x_ofst; 486*53889Smckusick sp->s_csr.csr_p.y = (sp->s_csr.csr_y -1) * char_h + y_ofst; 487*53889Smckusick } 488*53889Smckusick 489*53889Smckusick 490*53889Smckusick /* 491*53889Smckusick * Erase in display. 492*53889Smckusick * erase_disp(sp, pn) erases display from the cursor to the end, from 493*53889Smckusick * the beginning to the cursor or completely according to pn = 0, 1 or 2 494*53889Smckusick * respectively. 495*53889Smckusick */ 496*53889Smckusick erase_disp(sp, pn) 497*53889Smckusick register SCREEN *sp; 498*53889Smckusick register int pn; 499*53889Smckusick { 500*53889Smckusick register struct cursor *spc = &sp->s_csr; 501*53889Smckusick 502*53889Smckusick switch (pn) { 503*53889Smckusick case 0: /* cursor to end */ 504*53889Smckusick erase_line(sp, 0); 505*53889Smckusick clear_lines(MIN(spc->csr_y + 1, btm_m), 506*53889Smckusick btm_m - spc->csr_y, sp->s_term_mode & DECSCNM, 507*53889Smckusick sp->s_plane, sp->s_bgcol); 508*53889Smckusick break; 509*53889Smckusick case 1: /* beginning to cursor */ 510*53889Smckusick erase_line(sp, 1); 511*53889Smckusick clear_lines(TOP_M, spc->csr_y - TOP_M, sp->s_term_mode & DECSCNM, 512*53889Smckusick sp->s_plane, sp->s_bgcol); 513*53889Smckusick break; 514*53889Smckusick case 2: /* whole */ 515*53889Smckusick clear_lines(TOP_M, btm_m - TOP_M + 1, 516*53889Smckusick sp->s_term_mode & DECSCNM, 517*53889Smckusick sp->s_plane, sp->s_bgcol); 518*53889Smckusick break; 519*53889Smckusick default: 520*53889Smckusick break; 521*53889Smckusick } 522*53889Smckusick } 523*53889Smckusick 524*53889Smckusick 525*53889Smckusick 526*53889Smckusick /* 527*53889Smckusick * Erase in line. 528*53889Smckusick * erase_line(sp, pn) erases line from the cursor to the end, from the 529*53889Smckusick * beginning to the cursor or completely according to pn = 0, 1 or 2 530*53889Smckusick * respectively. 531*53889Smckusick */ 532*53889Smckusick erase_line(sp, pn) 533*53889Smckusick register SCREEN *sp; 534*53889Smckusick register int pn; 535*53889Smckusick { 536*53889Smckusick register struct cursor *spc = &sp->s_csr; 537*53889Smckusick 538*53889Smckusick switch(pn) { 539*53889Smckusick case 0: 540*53889Smckusick clear_chars(spc->csr_x, spc->csr_y, 541*53889Smckusick rit_m - spc->csr_x + 1, sp->s_term_mode & DECSCNM, 542*53889Smckusick sp->s_plane, sp->s_bgcol); 543*53889Smckusick break; 544*53889Smckusick case 1: 545*53889Smckusick clear_chars(LFT_M, spc->csr_y, 546*53889Smckusick spc->csr_x - LFT_M + 1, sp->s_term_mode & DECSCNM, 547*53889Smckusick sp->s_plane, sp->s_bgcol); 548*53889Smckusick break; 549*53889Smckusick case 2: 550*53889Smckusick clear_lines(spc->csr_y, 1, sp->s_term_mode & DECSCNM, 551*53889Smckusick sp->s_plane, sp->s_bgcol); 552*53889Smckusick break; 553*53889Smckusick default: 554*53889Smckusick break; 555*53889Smckusick } 556*53889Smckusick } 557*53889Smckusick 558*53889Smckusick /* 559*53889Smckusick * Insert line. 560*53889Smckusick * insert_line(sp, pn) inserts pn lines in scroll region 561*53889Smckusick */ 562*53889Smckusick insert_line(sp, pn) 563*53889Smckusick register SCREEN *sp; 564*53889Smckusick register int pn; 565*53889Smckusick { 566*53889Smckusick register struct cursor *spc = &sp->s_csr; 567*53889Smckusick register struct region *spr = &sp->s_region; 568*53889Smckusick 569*53889Smckusick pn = MAX(pn, 1); 570*53889Smckusick if (spc->csr_y < spr->top_margin || spc->csr_y > spr->btm_margin) 571*53889Smckusick return; 572*53889Smckusick if (pn <= spr->btm_margin - spc->csr_y) { 573*53889Smckusick move_lines(spc->csr_y, spr->btm_margin - pn - spc->csr_y + 1, 574*53889Smckusick spc->csr_y + pn); 575*53889Smckusick } 576*53889Smckusick clear_lines(spc->csr_y, 577*53889Smckusick MIN(spc->csr_y + pn - 1, spr->btm_margin) - spc->csr_y + 1, 578*53889Smckusick sp->s_term_mode & DECSCNM, sp->s_plane, sp->s_bgcol); 579*53889Smckusick spc->csr_x = LFT_M; 580*53889Smckusick spc->csr_p.x = x_ofst; 581*53889Smckusick } 582*53889Smckusick 583*53889Smckusick /* 584*53889Smckusick * Delete line. 585*53889Smckusick * delete_line(sp, pn) deletes pn lines in scroll region 586*53889Smckusick */ 587*53889Smckusick delete_line(sp, pn) 588*53889Smckusick register SCREEN *sp; 589*53889Smckusick register int pn; 590*53889Smckusick { 591*53889Smckusick register struct cursor *spc = &sp->s_csr; 592*53889Smckusick register struct region *spr = &sp->s_region; 593*53889Smckusick register int aux; 594*53889Smckusick 595*53889Smckusick pn = MAX(pn, 1); 596*53889Smckusick if (spc->csr_y < spr->top_margin || spc->csr_y > spr->btm_margin) 597*53889Smckusick return; 598*53889Smckusick if (pn <= spr->btm_margin - spc->csr_y) { 599*53889Smckusick aux = spc->csr_y + pn; 600*53889Smckusick move_lines(aux, spr->btm_margin - aux + 1, spc->csr_y); 601*53889Smckusick } 602*53889Smckusick aux = MAX(spr->btm_margin - pn + 1, spc->csr_y); 603*53889Smckusick clear_lines(aux, spr->btm_margin - aux + 1, sp->s_term_mode & DECSCNM, 604*53889Smckusick sp->s_plane, sp->s_bgcol); 605*53889Smckusick spc->csr_x = LFT_M; 606*53889Smckusick spc->csr_p.x = x_ofst; 607*53889Smckusick } 608*53889Smckusick 609*53889Smckusick /* 610*53889Smckusick * Delete character. 611*53889Smckusick * delete_char(sp, pn) deletes pn characters right side of the cursor. 612*53889Smckusick */ 613*53889Smckusick delete_char(sp, pn) 614*53889Smckusick register SCREEN *sp; 615*53889Smckusick register int pn; 616*53889Smckusick { 617*53889Smckusick register struct cursor *spc = &sp->s_csr; 618*53889Smckusick register int aux; 619*53889Smckusick 620*53889Smckusick pn = MAX(pn, 1); 621*53889Smckusick if (pn < rit_m - spc->csr_x + 1) { 622*53889Smckusick move_chars(spc->csr_x + pn, spc->csr_y, 623*53889Smckusick rit_m - spc->csr_x - pn + 1 ,spc->csr_x); 624*53889Smckusick } 625*53889Smckusick aux = MAX(rit_m - pn + 1, spc->csr_x); 626*53889Smckusick clear_chars(aux, spc->csr_y, rit_m - aux + 1, 627*53889Smckusick sp->s_term_mode & DECSCNM, sp->s_plane, sp->s_bgcol); 628*53889Smckusick } 629*53889Smckusick 630*53889Smckusick /* 631*53889Smckusick * This escape control sequence begins `^[[?' and ends `h' or `l' 632*53889Smckusick */ 633*53889Smckusick esc_csi_dec(sp, c) 634*53889Smckusick register SCREEN *sp; 635*53889Smckusick char c; 636*53889Smckusick { 637*53889Smckusick register char *cp; 638*53889Smckusick 639*53889Smckusick if (in_str(c, sp->s_estp->terminators)) { 640*53889Smckusick if (esc_buf[0] != INVALID) { 641*53889Smckusick cursor_off(); 642*53889Smckusick switch (c) { 643*53889Smckusick case 'h': /* set mode */ 644*53889Smckusick for (cp = esc_buf; cp <= esc_bp; cp++) { 645*53889Smckusick switch (*cp) { 646*53889Smckusick case 1: /* cursor key application */ 647*53889Smckusick sp->s_term_mode |= DECCKM; 648*53889Smckusick change_csr_key_pad(APPLIC); 649*53889Smckusick break; 650*53889Smckusick case 3: /* 132 column mode */ 651*53889Smckusick sp->s_term_mode |= DECCOLM; 652*53889Smckusick break; 653*53889Smckusick case 4: /* jump scroll */ 654*53889Smckusick sp->s_term_mode |= DECSCLM; 655*53889Smckusick break; 656*53889Smckusick case 5: /* reverse */ 657*53889Smckusick if ((sp->s_term_mode & DECSCNM) == 0) 658*53889Smckusick reverse_rec(sp->s_bgcol, 659*53889Smckusick sp->s_plane); 660*53889Smckusick sp->s_term_mode |= DECSCNM; 661*53889Smckusick if (sp->s_csr.csr_attributes & REVERSE) 662*53889Smckusick { 663*53889Smckusick fcolor = sp->s_plane; 664*53889Smckusick bcolor = sp->s_bgcol; 665*53889Smckusick } else { 666*53889Smckusick fcolor = sp->s_bgcol; 667*53889Smckusick bcolor = sp->s_plane; 668*53889Smckusick } 669*53889Smckusick break; 670*53889Smckusick case 6: /* origin */ 671*53889Smckusick sp->s_term_mode |= DECOM; 672*53889Smckusick sp->s_csr.csr_x = LFT_M; 673*53889Smckusick sp->s_csr.csr_y = 674*53889Smckusick sp->s_region.top_margin; 675*53889Smckusick sp->s_csr.csr_p.x = x_ofst; 676*53889Smckusick sp->s_csr.csr_p.y = 677*53889Smckusick (sp->s_csr.csr_y - 1) * char_h + 678*53889Smckusick y_ofst; 679*53889Smckusick break; 680*53889Smckusick case 7: /* auto wrap */ 681*53889Smckusick sp->s_term_mode |= DECAWM; 682*53889Smckusick break; 683*53889Smckusick case 8: /* auto repeat */ 684*53889Smckusick if ((sp->s_term_mode & DECARM) == 0) { 685*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCREPT, 686*53889Smckusick (int *)0); 687*53889Smckusick } 688*53889Smckusick sp->s_term_mode |= DECARM; 689*53889Smckusick break; 690*53889Smckusick case 25: /* cursor active */ 691*53889Smckusick sp->s_term_mode |= DECCSR_ACTV; 692*53889Smckusick break; 693*53889Smckusick default: 694*53889Smckusick break; 695*53889Smckusick } 696*53889Smckusick } 697*53889Smckusick break; 698*53889Smckusick case 'l': /* reset mode */ 699*53889Smckusick for (cp = esc_buf; cp <= esc_bp; cp++) { 700*53889Smckusick switch (*cp) { 701*53889Smckusick case 1: /* cursor key application */ 702*53889Smckusick sp->s_term_mode &= ~DECCKM; 703*53889Smckusick change_csr_key_pad(NUMERIC); 704*53889Smckusick break; 705*53889Smckusick case 3: /* 132 column mode */ 706*53889Smckusick sp->s_term_mode &= ~DECCOLM; 707*53889Smckusick break; 708*53889Smckusick case 4: /* jump scroll */ 709*53889Smckusick sp->s_term_mode &= ~DECSCLM; 710*53889Smckusick break; 711*53889Smckusick case 5: /* reverse */ 712*53889Smckusick if (sp->s_term_mode & DECSCNM) 713*53889Smckusick reverse_rec(sp->s_plane, 714*53889Smckusick sp->s_bgcol); 715*53889Smckusick sp->s_term_mode &= ~DECSCNM; 716*53889Smckusick if (sp->s_csr.csr_attributes & REVERSE) 717*53889Smckusick { 718*53889Smckusick fcolor = sp->s_bgcol; 719*53889Smckusick bcolor = sp->s_plane; 720*53889Smckusick } else { 721*53889Smckusick fcolor = sp->s_plane; 722*53889Smckusick bcolor = sp->s_bgcol; 723*53889Smckusick } 724*53889Smckusick break; 725*53889Smckusick case 6: /* origin */ 726*53889Smckusick sp->s_term_mode &= ~DECOM; 727*53889Smckusick sp->s_csr.csr_x = LFT_M; 728*53889Smckusick sp->s_csr.csr_y = TOP_M; 729*53889Smckusick sp->s_csr.csr_p.x = x_ofst; 730*53889Smckusick sp->s_csr.csr_p.y = y_ofst; 731*53889Smckusick break; 732*53889Smckusick case 7: /* auto wrap */ 733*53889Smckusick sp->s_term_mode &= ~DECAWM; 734*53889Smckusick break; 735*53889Smckusick case 8: /* auto repeat */ 736*53889Smckusick if (sp->s_term_mode & DECARM) { 737*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCNRPT, 738*53889Smckusick (int *) 0); 739*53889Smckusick } 740*53889Smckusick sp->s_term_mode &= ~DECARM; 741*53889Smckusick break; 742*53889Smckusick case 25: /* cursor non-active */ 743*53889Smckusick sp->s_term_mode &= ~DECCSR_ACTV; 744*53889Smckusick break; 745*53889Smckusick default: 746*53889Smckusick break; 747*53889Smckusick } 748*53889Smckusick } 749*53889Smckusick break; 750*53889Smckusick default: 751*53889Smckusick break; 752*53889Smckusick } 753*53889Smckusick cursor_on(&sp->s_csr.csr_p); 754*53889Smckusick } 755*53889Smckusick sp->s_current_stat &= ~ESCAPE; 756*53889Smckusick } else { /* buffering arguments */ 757*53889Smckusick if (c >= '0' && c <= '9') { 758*53889Smckusick *esc_bp = *esc_bp * 10 + (c - '0'); 759*53889Smckusick } else if (c == ';') { 760*53889Smckusick esc_bp++; 761*53889Smckusick } else if (c == '?') { 762*53889Smckusick esc_buf[0] = INVALID; 763*53889Smckusick } else { 764*53889Smckusick sp->s_current_stat &= ~ESCAPE; 765*53889Smckusick } 766*53889Smckusick } 767*53889Smckusick } 768*53889Smckusick 769*53889Smckusick /* 770*53889Smckusick * changes cursor key pad to ansi_ctl 771*53889Smckusick */ 772*53889Smckusick static 773*53889Smckusick change_csr_key_pad(applic) 774*53889Smckusick register int applic; 775*53889Smckusick { 776*53889Smckusick char pad[4]; 777*53889Smckusick register Pfk_string *pfk = &pfk_str; 778*53889Smckusick register Key_string *kys = &pfk_str.pfk_string; 779*53889Smckusick register struct key_pad *kpd; 780*53889Smckusick register int i; 781*53889Smckusick 782*53889Smckusick kpd = &key_pad[UP-N0]; 783*53889Smckusick pad[0] = '\033'; 784*53889Smckusick pad[1] = (applic) ? 'O': '['; 785*53889Smckusick for (i = UP; i <= LEFT; i++) { 786*53889Smckusick pfk->pfk_num = i; 787*53889Smckusick kys->key_length = (applic) ? 3: 3; 788*53889Smckusick pad[2] = (applic) ? kpd->kpd_applic: kpd->kpd_numeric; 789*53889Smckusick kys->key_string = pad; 790*53889Smckusick kpd++; 791*53889Smckusick pfk->pfk_shift = PF_NORMAL; 792*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 793*53889Smckusick pfk->pfk_shift = PF_SHIFT; 794*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 795*53889Smckusick } 796*53889Smckusick } 797*53889Smckusick 798*53889Smckusick extern struct cursor inner_buf_csr; 799*53889Smckusick extern int inner_buf_tstat; 800*53889Smckusick /* 801*53889Smckusick * Store cursor position and attributes. 802*53889Smckusick * The SCREEN structure is stored inner structure. 803*53889Smckusick */ 804*53889Smckusick esc_store_csr(sp) 805*53889Smckusick register SCREEN *sp; 806*53889Smckusick { 807*53889Smckusick inner_buf_csr = sp->s_csr; 808*53889Smckusick inner_buf_tstat = (DECOM|DECAWM) & sp->s_term_mode; 809*53889Smckusick } 810*53889Smckusick 811*53889Smckusick /* 812*53889Smckusick * Restore cursor position and attributes. 813*53889Smckusick * The SCREEN structure is restored from inner structure. 814*53889Smckusick * Prevail error from unexpected use of this command, inner structure 815*53889Smckusick * must be initialized. 816*53889Smckusick */ 817*53889Smckusick esc_restore_csr(sp) 818*53889Smckusick register SCREEN *sp; 819*53889Smckusick { 820*53889Smckusick cursor_off(); 821*53889Smckusick sp->s_csr = inner_buf_csr; 822*53889Smckusick sp->s_term_mode = (sp->s_term_mode & ~(DECOM|DECAWM)) | inner_buf_tstat; 823*53889Smckusick cursor_on(&sp->s_csr.csr_p); 824*53889Smckusick } 825*53889Smckusick 826*53889Smckusick /* 827*53889Smckusick * index() 828*53889Smckusick * esc_index(sp) moves the cursor down if the cursor is not at 829*53889Smckusick * bottom margin. If the cursor is at the bottom margin then 830*53889Smckusick * scroll up. 831*53889Smckusick */ 832*53889Smckusick esc_index(sp) 833*53889Smckusick register SCREEN *sp; 834*53889Smckusick { 835*53889Smckusick cursor_off(); 836*53889Smckusick if (sp->s_csr.csr_y == sp->s_region.btm_margin) 837*53889Smckusick scroll_up(sp->s_region.top_margin, 838*53889Smckusick sp->s_region.btm_margin, sp->s_term_mode & DECSCNM, 839*53889Smckusick sp->s_plane, sp->s_bgcol); 840*53889Smckusick else { 841*53889Smckusick if (sp->s_csr.csr_y < btm_m) { 842*53889Smckusick sp->s_csr.csr_y += 1; 843*53889Smckusick sp->s_csr.csr_p.y += char_h; 844*53889Smckusick } 845*53889Smckusick } 846*53889Smckusick sp->s_current_stat &= ~WRAP; 847*53889Smckusick cursor_on(&sp->s_csr.csr_p); 848*53889Smckusick } 849*53889Smckusick 850*53889Smckusick /* 851*53889Smckusick * next line 852*53889Smckusick * esc_next_line(sp) moves the cursor down like index but the cursor 853*53889Smckusick * position is the beginning of the next line. 854*53889Smckusick */ 855*53889Smckusick esc_next_line(sp) 856*53889Smckusick register SCREEN *sp; 857*53889Smckusick { 858*53889Smckusick sp->s_csr.csr_x = LFT_M; 859*53889Smckusick sp->s_csr.csr_p.x = x_ofst; 860*53889Smckusick esc_index(sp); 861*53889Smckusick } 862*53889Smckusick 863*53889Smckusick /* 864*53889Smckusick * tabulation set 865*53889Smckusick * esc_tab_set(sp) sets tabulation stop at the current cursor point. 866*53889Smckusick */ 867*53889Smckusick esc_tab_set(sp) 868*53889Smckusick register SCREEN *sp; 869*53889Smckusick { 870*53889Smckusick sp->s_tab_pos[sp->s_csr.csr_x] = 1; 871*53889Smckusick } 872*53889Smckusick 873*53889Smckusick /* 874*53889Smckusick * reverse index 875*53889Smckusick * esc_rev_index(sp) moves the cursor up if the cursor is not at the top 876*53889Smckusick * margin. If the cursor is at the top margin then the screen takes place 877*53889Smckusick * scroll down. 878*53889Smckusick */ 879*53889Smckusick esc_rev_index(sp) 880*53889Smckusick register SCREEN *sp; 881*53889Smckusick { 882*53889Smckusick cursor_off(); 883*53889Smckusick if (sp->s_csr.csr_y == sp->s_region.top_margin) 884*53889Smckusick scroll_down(sp->s_region.top_margin, 885*53889Smckusick sp->s_region.btm_margin, sp->s_term_mode & DECSCNM, 886*53889Smckusick sp->s_plane, sp->s_bgcol); 887*53889Smckusick else { 888*53889Smckusick if (sp->s_csr.csr_y > TOP_M) { 889*53889Smckusick sp->s_csr.csr_y -= 1; 890*53889Smckusick sp->s_csr.csr_p.y -= char_h; 891*53889Smckusick } 892*53889Smckusick } 893*53889Smckusick sp->s_current_stat &= ~WRAP; 894*53889Smckusick cursor_on(&sp->s_csr.csr_p); 895*53889Smckusick } 896*53889Smckusick 897*53889Smckusick /* 898*53889Smckusick * numeric key pad 899*53889Smckusick * esc_numeric_kpad(sp) changes key pad of cursor to numeric one. 900*53889Smckusick * This sequence is used in vi. 901*53889Smckusick * currently not supported 902*53889Smckusick */ 903*53889Smckusick esc_numeric_kpad(sp) 904*53889Smckusick register SCREEN *sp; 905*53889Smckusick { 906*53889Smckusick change_aux_key_pad(NUMERIC); 907*53889Smckusick sp->s_current_stat &= ~ESCAPE; 908*53889Smckusick } 909*53889Smckusick 910*53889Smckusick /* 911*53889Smckusick * application key pad 912*53889Smckusick * esc_application_kpad(sp) changes key pad of cursor to application one. 913*53889Smckusick * This sequence is also used in vi. 914*53889Smckusick * currently not supported. 915*53889Smckusick */ 916*53889Smckusick esc_application_kpad(sp) 917*53889Smckusick register SCREEN *sp; 918*53889Smckusick { 919*53889Smckusick change_aux_key_pad(APPLIC); 920*53889Smckusick sp->s_current_stat &= ~ESCAPE; 921*53889Smckusick } 922*53889Smckusick 923*53889Smckusick /* 924*53889Smckusick * change auxiliary keypad 925*53889Smckusick */ 926*53889Smckusick static 927*53889Smckusick change_aux_key_pad(applic) 928*53889Smckusick register int applic; 929*53889Smckusick { 930*53889Smckusick char pad[4]; 931*53889Smckusick register Pfk_string *pfk = &pfk_str; 932*53889Smckusick register Key_string *kys = &pfk_str.pfk_string; 933*53889Smckusick register struct key_pad *kpd; 934*53889Smckusick register int i; 935*53889Smckusick 936*53889Smckusick kpd = &key_pad[0]; 937*53889Smckusick if (applic) { 938*53889Smckusick pad[0] = '\033'; 939*53889Smckusick pad[1] = 'O'; 940*53889Smckusick } 941*53889Smckusick for (i = N0; i <= NENTER; i++) { 942*53889Smckusick 943*53889Smckusick pfk->pfk_num = i; 944*53889Smckusick kys->key_length = (applic) ? 3: 1; 945*53889Smckusick if (applic) { 946*53889Smckusick pad[2] = kpd->kpd_applic; 947*53889Smckusick } else { 948*53889Smckusick pad[0] = kpd->kpd_numeric; 949*53889Smckusick } 950*53889Smckusick kys->key_string = pad; 951*53889Smckusick kpd++; 952*53889Smckusick pfk->pfk_shift = PF_NORMAL; 953*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 954*53889Smckusick pfk->pfk_shift = PF_SHIFT; 955*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 956*53889Smckusick } 957*53889Smckusick if (!applic) { 958*53889Smckusick pfk->pfk_shift = PF_SHIFT; 959*53889Smckusick kys->key_length = 1; 960*53889Smckusick 961*53889Smckusick pfk->pfk_num = MINUS; 962*53889Smckusick kys->key_string = "/"; 963*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 964*53889Smckusick 965*53889Smckusick pfk->pfk_num = PLUS; 966*53889Smckusick kys->key_string = "*"; 967*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 968*53889Smckusick 969*53889Smckusick pfk->pfk_num = COMMA; 970*53889Smckusick kys->key_string = "="; 971*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 972*53889Smckusick } 973*53889Smckusick } 974*53889Smckusick 975*53889Smckusick extern struct csr_buf local_csr_buf; 976*53889Smckusick /* 977*53889Smckusick * change line size 978*53889Smckusick * esc_line_size(sp, pn) changes line size. 979*53889Smckusick * c = `3' double side double height(top half) 980*53889Smckusick * c = `4' double side double height(bottom half) 981*53889Smckusick * c = `5' sigle width line 982*53889Smckusick * c = `6' double width line 983*53889Smckusick * currently not supported 984*53889Smckusick */ 985*53889Smckusick esc_line_size(sp, c) 986*53889Smckusick register SCREEN *sp; 987*53889Smckusick char c; 988*53889Smckusick { 989*53889Smckusick register int i; 990*53889Smckusick register int j; 991*53889Smckusick int save_f, save_b; 992*53889Smckusick 993*53889Smckusick cursor_off(); 994*53889Smckusick switch (c) { 995*53889Smckusick case '5': 996*53889Smckusick local_csr_buf.csr_number = 1; 997*53889Smckusick break; 998*53889Smckusick case '6': 999*53889Smckusick local_csr_buf.csr_number = 2; 1000*53889Smckusick break; 1001*53889Smckusick case '8': 1002*53889Smckusick sp->s_region.top_margin = TOP_M; 1003*53889Smckusick sp->s_region.btm_margin = btm_m; 1004*53889Smckusick save_f = fcolor; 1005*53889Smckusick save_b = bcolor; 1006*53889Smckusick fcolor = sp->s_bgcol; 1007*53889Smckusick bcolor = sp->s_plane; 1008*53889Smckusick sp->s_csr.csr_p.y = y_ofst; 1009*53889Smckusick for (i = TOP_M; i <= btm_m; i++) { 1010*53889Smckusick sp->s_csr.csr_p.x = x_ofst; 1011*53889Smckusick sp->s_csr.csr_y = i; 1012*53889Smckusick for (j = LFT_M; j <= rit_m; j++) { 1013*53889Smckusick sp->s_csr.csr_x = j; 1014*53889Smckusick copy_char(sp, 'E', 0); 1015*53889Smckusick sp->s_csr.csr_p.x += char_w; 1016*53889Smckusick } 1017*53889Smckusick sp->s_csr.csr_p.y += char_h; 1018*53889Smckusick } 1019*53889Smckusick sp->s_csr.csr_x = LFT_M; 1020*53889Smckusick sp->s_csr.csr_y = TOP_M; 1021*53889Smckusick sp->s_csr.csr_p.x = x_ofst; 1022*53889Smckusick sp->s_csr.csr_p.y = y_ofst; 1023*53889Smckusick fcolor = save_f; 1024*53889Smckusick bcolor = save_b; 1025*53889Smckusick break; 1026*53889Smckusick default: 1027*53889Smckusick break; 1028*53889Smckusick } 1029*53889Smckusick cursor_on(&sp->s_csr.csr_p); 1030*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1031*53889Smckusick } 1032*53889Smckusick 1033*53889Smckusick /* 1034*53889Smckusick * character set 1035*53889Smckusick * esc_char_setr sets which character set you use in right graphic set. 1036*53889Smckusick * currently not supported 1037*53889Smckusick */ 1038*53889Smckusick esc_char_setr(sp, c) 1039*53889Smckusick register SCREEN *sp; 1040*53889Smckusick int c; 1041*53889Smckusick { 1042*53889Smckusick #if defined(IPC_MRX) || defined(CPU_SINGLE) 1043*53889Smckusick switch (c) { 1044*53889Smckusick case 'J': 1045*53889Smckusick case 'H': 1046*53889Smckusick font_jisroman(); 1047*53889Smckusick #ifdef CPU_SINGLE 1048*53889Smckusick font_jisroman24(); 1049*53889Smckusick #endif 1050*53889Smckusick sp->s_current_stat &= ~JKANJI; 1051*53889Smckusick break; 1052*53889Smckusick case 'B': 1053*53889Smckusick font_ascii(); 1054*53889Smckusick #ifdef CPU_SINGLE 1055*53889Smckusick font_ascii24(); 1056*53889Smckusick #endif 1057*53889Smckusick sp->s_current_stat &= ~JKANJI; 1058*53889Smckusick break; 1059*53889Smckusick } 1060*53889Smckusick #else /* IPC_MRX || CPU_SINGLE */ 1061*53889Smckusick if (c == 'B' || c == 'J' || c == 'H') { 1062*53889Smckusick sp->s_current_stat &= ~JKANJI; 1063*53889Smckusick } 1064*53889Smckusick #endif /* IPC_MRX || CPU_SINGLE */ 1065*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1066*53889Smckusick } 1067*53889Smckusick 1068*53889Smckusick /* 1069*53889Smckusick * character set to left graphic set 1070*53889Smckusick * esc_char_setl sets which character set you use in left graphic set. 1071*53889Smckusick * currently not supported 1072*53889Smckusick */ 1073*53889Smckusick esc_char_setl(sp, c) 1074*53889Smckusick register SCREEN *sp; 1075*53889Smckusick int c; 1076*53889Smckusick { 1077*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1078*53889Smckusick } 1079*53889Smckusick 1080*53889Smckusick extern tmode; 1081*53889Smckusick extern unsigned int first_jcode; 1082*53889Smckusick /* 1083*53889Smckusick * character set to kanji 1084*53889Smckusick * esc_kanji_set sets kanji 1085*53889Smckusick */ 1086*53889Smckusick esc_kanji_set(sp, c) 1087*53889Smckusick register SCREEN *sp; 1088*53889Smckusick int c; 1089*53889Smckusick { 1090*53889Smckusick 1091*53889Smckusick #ifdef KM_JIS 1092*53889Smckusick if (tmode == KM_JIS && (c == 'B' || c == '@')) { 1093*53889Smckusick sp->s_current_stat |= JKANJI; 1094*53889Smckusick first_jcode = 0; 1095*53889Smckusick } 1096*53889Smckusick #endif 1097*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1098*53889Smckusick } 1099*53889Smckusick 1100*53889Smckusick static short parm_buf[PARM_BUF_SIZ]; 1101*53889Smckusick static short *parm_bp = parm_buf; 1102*53889Smckusick static int sensitive = 0; 1103*53889Smckusick static int pval = 0; 1104*53889Smckusick /* 1105*53889Smckusick * terminal parameter set command 1106*53889Smckusick * esc_parm_set(sp, c) sets terminal parameters such as font-width, 1107*53889Smckusick * font-height, character-width, character-height, character-position, 1108*53889Smckusick * underlind-position, screen-width, screen-height, x-offset, y-offset, 1109*53889Smckusick * right-mergin, bottom-mergin, dimmer-count, bell-length. 1110*53889Smckusick */ 1111*53889Smckusick esc_parm_set(sp, c) 1112*53889Smckusick register SCREEN *sp; 1113*53889Smckusick register unsigned int c; 1114*53889Smckusick { 1115*53889Smckusick static int bufc = 0; 1116*53889Smckusick 1117*53889Smckusick if (in_str(c, sp->s_estp->terminators)) { 1118*53889Smckusick if (sensitive) { 1119*53889Smckusick *parm_bp++ = pval; 1120*53889Smckusick } else { 1121*53889Smckusick *parm_bp++ = -1; 1122*53889Smckusick } 1123*53889Smckusick *parm_bp++ = -1; 1124*53889Smckusick parm_set(sp, parm_buf, c); 1125*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1126*53889Smckusick sensitive = pval = 0; 1127*53889Smckusick parm_bp = parm_buf; 1128*53889Smckusick bufc = 0; 1129*53889Smckusick return; 1130*53889Smckusick } 1131*53889Smckusick /* buffering arguments */ 1132*53889Smckusick if (bufc < PARM_BUF_SIZ) { 1133*53889Smckusick if (c >= '0' && c <= '9') { 1134*53889Smckusick pval = pval *10 + (c - '0'); 1135*53889Smckusick sensitive = 1; 1136*53889Smckusick } else if (c == ';') { 1137*53889Smckusick if (sensitive) { 1138*53889Smckusick *parm_bp++ = pval; 1139*53889Smckusick } else { 1140*53889Smckusick *parm_bp++ = -1; 1141*53889Smckusick } 1142*53889Smckusick sensitive = pval = 0; 1143*53889Smckusick bufc++; 1144*53889Smckusick } else { 1145*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1146*53889Smckusick sensitive = pval = 0; 1147*53889Smckusick parm_bp = parm_buf; 1148*53889Smckusick bufc = 0; 1149*53889Smckusick } 1150*53889Smckusick } 1151*53889Smckusick } 1152*53889Smckusick 1153*53889Smckusick static char an_buf[AN_BUF_SIZ]; 1154*53889Smckusick 1155*53889Smckusick parm_set(sp, parm, terminator) 1156*53889Smckusick SCREEN *sp; 1157*53889Smckusick short *parm; 1158*53889Smckusick unsigned int terminator; 1159*53889Smckusick { 1160*53889Smckusick register char *bp = an_buf; 1161*53889Smckusick register char *p; 1162*53889Smckusick 1163*53889Smckusick switch (terminator) { 1164*53889Smckusick case 'f': 1165*53889Smckusick if (parm[0] >= FONT_W_MIN && parm[0] <= consfb->font_w && 1166*53889Smckusick parm[0] < char_w) 1167*53889Smckusick font_w = parm[0]; 1168*53889Smckusick 1169*53889Smckusick if (parm[1] >= FONT_H_MIN && parm[1] <= consfb->font_h && 1170*53889Smckusick parm[1] <= (char_h - ch_pos)) 1171*53889Smckusick font_h = parm[1]; 1172*53889Smckusick break; 1173*53889Smckusick case 'c': 1174*53889Smckusick if (parm[0] >= CHAR_W_MIN && parm[0] > font_w && 1175*53889Smckusick parm[0] <= CHAR_W_MAX) 1176*53889Smckusick char_w = parm[0]; 1177*53889Smckusick 1178*53889Smckusick if (parm[1] >= CHAR_H_MIN && parm[1] >= (font_h + ch_pos) && 1179*53889Smckusick parm[1] > ul_pos && parm[1] <= CHAR_H_MAX) 1180*53889Smckusick char_h = parm[1]; 1181*53889Smckusick 1182*53889Smckusick break; 1183*53889Smckusick case 'p': 1184*53889Smckusick if (parm[0] >= UL_POS_MIN && parm[0] <= UL_POS_MAX && 1185*53889Smckusick parm[0] < char_h) { 1186*53889Smckusick ul_pos = parm[0]; 1187*53889Smckusick } 1188*53889Smckusick if (parm[1] >= CH_POS_MIN && parm[1] <= CH_POS_MAX && 1189*53889Smckusick parm[1] < (char_h - font_h)) { 1190*53889Smckusick ch_pos = parm[1]; 1191*53889Smckusick } 1192*53889Smckusick break; 1193*53889Smckusick case 's': 1194*53889Smckusick if (parm[0] > SCR_W_MIN && parm[0] <= consfb->scr_w) 1195*53889Smckusick scr_w = (parm[0] < char_w) ? char_w: parm[0]; 1196*53889Smckusick if (parm[1] > SCR_H_MIN && parm[1] <= consfb->scr_h) 1197*53889Smckusick scr_h = (parm[1] < char_h) ? char_h: parm[1]; 1198*53889Smckusick break; 1199*53889Smckusick case 'o': 1200*53889Smckusick if (parm[0] >= X_OFST_MIN && parm[0] <= X_OFST_MAX) 1201*53889Smckusick x_ofst = (parm[0] > scr_w - char_w) ? 1202*53889Smckusick (scr_w - char_w): parm[0]; 1203*53889Smckusick if (parm[1] >= Y_OFST_MIN && parm[1] <= Y_OFST_MAX) 1204*53889Smckusick y_ofst = (parm[1] > scr_h - char_h) ? 1205*53889Smckusick (scr_h - char_h): parm[1]; 1206*53889Smckusick break; 1207*53889Smckusick case 'm': 1208*53889Smckusick if (parm[0] >= RIT_M_MIN) { 1209*53889Smckusick if (parm[0] > RIT_M_MAX /* consfb->rit_m */) { 1210*53889Smckusick parm[0] = consfb->rit_m; 1211*53889Smckusick } 1212*53889Smckusick rit_m = (parm[0] > (scr_w - x_ofst)/char_w) ? 1213*53889Smckusick (scr_w - x_ofst)/char_w: parm[0]; 1214*53889Smckusick } 1215*53889Smckusick if (parm[1] >= BTM_M_MIN) { 1216*53889Smckusick if (parm[1] > BTM_M_MAX /* consfb->btm_m */) { 1217*53889Smckusick parm[1] = consfb->btm_m; 1218*53889Smckusick } 1219*53889Smckusick btm_m = (parm[1] > (scr_h - y_ofst)/char_h) ? 1220*53889Smckusick (scr_h - y_ofst)/char_h: parm[1]; 1221*53889Smckusick } 1222*53889Smckusick break; 1223*53889Smckusick case 'd': 1224*53889Smckusick if (parm[0] >= DIM_CNT_MIN && parm[0] <= DIM_CNT_MAX) 1225*53889Smckusick dim_cnt = a_dim_on = parm[0]; 1226*53889Smckusick else 1227*53889Smckusick a_dim_on = 0; 1228*53889Smckusick break; 1229*53889Smckusick case 'b': 1230*53889Smckusick if (parm[0] >= BELL_LEN_MIN && parm[0] <= BELL_LEN_MAX) 1231*53889Smckusick bell_len = parm[0]; 1232*53889Smckusick break; 1233*53889Smckusick case 'D': 1234*53889Smckusick set_default_param(); 1235*53889Smckusick vt100init(); 1236*53889Smckusick bitmapinit(); 1237*53889Smckusick break; 1238*53889Smckusick case 'i': 1239*53889Smckusick cursor_off(); 1240*53889Smckusick csr_pos(sp, LFT_M, TOP_M); 1241*53889Smckusick key_str.key_string = c_pos_mess; 1242*53889Smckusick key_str.key_length = spr(c_pos_mess, "f=(%d,%d), ", 1243*53889Smckusick font_w, font_h); 1244*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1245*53889Smckusick 1246*53889Smckusick key_str.key_length = spr(c_pos_mess, "c=(%d,%d), ", 1247*53889Smckusick char_w, char_h); 1248*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1249*53889Smckusick 1250*53889Smckusick csr_pos(sp, LFT_M, (TOP_M - 1)); 1251*53889Smckusick key_str.key_string = c_pos_mess; 1252*53889Smckusick key_str.key_length = spr(c_pos_mess, "p=(%d,%d), ", 1253*53889Smckusick ul_pos, ch_pos); 1254*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1255*53889Smckusick key_str.key_length = spr(c_pos_mess, "s=(%d,%d), ", 1256*53889Smckusick scr_w, scr_h); 1257*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1258*53889Smckusick 1259*53889Smckusick csr_pos(sp, LFT_M, (TOP_M - 2)); 1260*53889Smckusick key_str.key_string = c_pos_mess; 1261*53889Smckusick key_str.key_length = spr(c_pos_mess, "o=(%d,%d), ", 1262*53889Smckusick x_ofst, y_ofst); 1263*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1264*53889Smckusick key_str.key_length = spr(c_pos_mess, "m=(%d,%d)", 1265*53889Smckusick rit_m, btm_m); 1266*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1267*53889Smckusick 1268*53889Smckusick cursor_on(&sp->s_csr.csr_p); 1269*53889Smckusick return; 1270*53889Smckusick case 'G': 1271*53889Smckusick line(parm); 1272*53889Smckusick return; 1273*53889Smckusick case 'C': 1274*53889Smckusick if (parm[0] >= 0) { 1275*53889Smckusick sp->s_plane = fbbm_get_pixel(consfb, parm[0]); 1276*53889Smckusick } 1277*53889Smckusick if (parm[1] >= 0) { 1278*53889Smckusick sp->s_bgcol = fbbm_get_pixel(consfb, parm[1]); 1279*53889Smckusick } 1280*53889Smckusick cursor_off(); 1281*53889Smckusick if ((sp->s_csr.csr_attributes & REVERSE) ^ 1282*53889Smckusick (sp->s_term_mode & DECSCNM)) { 1283*53889Smckusick fcolor = sp->s_bgcol; 1284*53889Smckusick bcolor = sp->s_plane; 1285*53889Smckusick } 1286*53889Smckusick else { 1287*53889Smckusick fcolor = sp->s_plane; 1288*53889Smckusick bcolor = sp->s_bgcol; 1289*53889Smckusick } 1290*53889Smckusick cursor_on(&sp->s_csr.csr_p); 1291*53889Smckusick return; 1292*53889Smckusick case 'T': 1293*53889Smckusick if (parm[0] < 0 || consfb->Mono) 1294*53889Smckusick return; 1295*53889Smckusick /* 1296*53889Smckusick * what value is defined on pallet N? 1297*53889Smckusick * put string in an_buf 1298*53889Smckusick */ 1299*53889Smckusick *bp++ = '\033'; 1300*53889Smckusick *bp++ = '~'; 1301*53889Smckusick bp += itoa(bm_pallet_read(parm[0]), 10, bp); 1302*53889Smckusick *bp++ = 'a'; 1303*53889Smckusick key_str.key_length = bp - an_buf; 1304*53889Smckusick key_str.key_string = an_buf; 1305*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1306*53889Smckusick return; 1307*53889Smckusick case 't': 1308*53889Smckusick if (parm[0] >= 0 && !consfb->Mono) { 1309*53889Smckusick bm_pallet_write(parm[0], 1310*53889Smckusick (unsigned) parm[1] << 16 1311*53889Smckusick | (unsigned) parm[2] << 8 1312*53889Smckusick | (unsigned) parm[3] 1313*53889Smckusick ); 1314*53889Smckusick } 1315*53889Smckusick return; 1316*53889Smckusick default: 1317*53889Smckusick return; 1318*53889Smckusick } 1319*53889Smckusick if (char_w < font_w) char_w = font_w; 1320*53889Smckusick if (char_h < font_h) char_h = font_h; 1321*53889Smckusick if (ch_pos > char_h - font_h) { 1322*53889Smckusick ch_pos = char_h - font_h; 1323*53889Smckusick ul_pos = char_h - 1; 1324*53889Smckusick } 1325*53889Smckusick if (rit_m > (scr_w - x_ofst)/char_w) 1326*53889Smckusick rit_m = (scr_w - x_ofst)/char_w; 1327*53889Smckusick if (btm_m > (scr_h - y_ofst)/char_h) 1328*53889Smckusick btm_m = (scr_h - y_ofst)/char_h; 1329*53889Smckusick sp->s_region.top_margin = TOP_M; 1330*53889Smckusick sp->s_region.btm_margin = btm_m; 1331*53889Smckusick font_r1.extent.x = font_w; 1332*53889Smckusick font_r1.extent.y = font_h; 1333*53889Smckusick font_r2.extent.x = font_w * 2; 1334*53889Smckusick font_r2.extent.y = font_h; 1335*53889Smckusick font_len1 = (font_w + 0x0f)>>4; 1336*53889Smckusick font_len2 = (font_w*2 + 0x0f)>>4; 1337*53889Smckusick cursor_off(); 1338*53889Smckusick char_r1.extent.x = char_w; 1339*53889Smckusick char_r1.extent.y = char_h; 1340*53889Smckusick char_r2.extent.x = char_w * 2; 1341*53889Smckusick char_r2.extent.y = char_h; 1342*53889Smckusick csr_pos(sp, sp->s_csr.csr_x, sp->s_csr.csr_y); 1343*53889Smckusick sp->s_csr.csr_p.x = (sp->s_csr.csr_x - 1) * char_w + x_ofst; 1344*53889Smckusick sp->s_csr.csr_p.y = (sp->s_csr.csr_y - 1) * char_h + y_ofst; 1345*53889Smckusick cursor_on(&sp->s_csr.csr_p); 1346*53889Smckusick } 1347*53889Smckusick 1348*53889Smckusick /* VARARGS */ 1349*53889Smckusick spr(s, fmt, ad, dummy) 1350*53889Smckusick register char *s, *fmt; 1351*53889Smckusick u_int ad; 1352*53889Smckusick { 1353*53889Smckusick register int b, c; 1354*53889Smckusick register u_int *adx = &ad; 1355*53889Smckusick char *base = s; 1356*53889Smckusick 1357*53889Smckusick for (;;) { 1358*53889Smckusick while ((c = *fmt++) != '%') { 1359*53889Smckusick *s++ = c; 1360*53889Smckusick if (c == '\0') 1361*53889Smckusick return (s - base - 1); 1362*53889Smckusick } 1363*53889Smckusick 1364*53889Smckusick c = *fmt++; 1365*53889Smckusick switch (c) { 1366*53889Smckusick 1367*53889Smckusick case 'x': case 'X': 1368*53889Smckusick b = 16; 1369*53889Smckusick goto number; 1370*53889Smckusick case 'd': case 'D': 1371*53889Smckusick b = 10; 1372*53889Smckusick goto number; 1373*53889Smckusick case 'o': case 'O': 1374*53889Smckusick b = 8; 1375*53889Smckusick number: 1376*53889Smckusick s += itoa(*adx, b, s); 1377*53889Smckusick break; 1378*53889Smckusick 1379*53889Smckusick case 'c': 1380*53889Smckusick *s++ = *adx; 1381*53889Smckusick break; 1382*53889Smckusick 1383*53889Smckusick case '%': 1384*53889Smckusick *s++ = c; 1385*53889Smckusick break; 1386*53889Smckusick } 1387*53889Smckusick adx++; 1388*53889Smckusick } 1389*53889Smckusick } 1390*53889Smckusick 1391*53889Smckusick static int pfn = -1; 1392*53889Smckusick static int active_buf = 0; 1393*53889Smckusick /* 1394*53889Smckusick * define the programable function keys and answer back message. 1395*53889Smckusick * the vt100 facilities do not contain this command! 1396*53889Smckusick * command sequence is as follows: 1397*53889Smckusick * "^[Pn|n1;n2;...;nmp" (normal mode) 1398*53889Smckusick * or 1399*53889Smckusick * "^[Pn|n1;n2;...;nmP" (shift mode) 1400*53889Smckusick * or 1401*53889Smckusick * "^[Pn|n1;n2;...;nmZ" (answer backe message) 1402*53889Smckusick * where, `n' denotes the decimal number asigned to function key, 1403*53889Smckusick * from `n1' to `nm' denote hexa number, finally, 1404*53889Smckusick * `p' , `E' or `Z' tells that the sequence has terminated. 1405*53889Smckusick * remark: 1406*53889Smckusick * when the terminator is `Z', the function number `n' can be omitted, 1407*53889Smckusick * and even though the number is specified, there is no affection to 1408*53889Smckusick * the result. 1409*53889Smckusick * 1410*53889Smckusick * 1411*53889Smckusick * ADDITION: 1412*53889Smckusick * there is a question: what strings are defined in programable function 1413*53889Smckusick * key of key-number n? 1414*53889Smckusick * in order to anwer this question, another escape sequence has appended. 1415*53889Smckusick * command sequence is as follows: 1416*53889Smckusick * 1417*53889Smckusick * "^[Pn|i" (normal mode) 1418*53889Smckusick * or 1419*53889Smckusick * "^[Pn|I" (shift mode) 1420*53889Smckusick * 1421*53889Smckusick * then the answer is 1422*53889Smckusick * 1423*53889Smckusick * "^[Pn|n1;n2;...;nmr" (normal mode) 1424*53889Smckusick * or 1425*53889Smckusick * "^[Pn|n1;n2;...;nmR" (shift mode) 1426*53889Smckusick * 1427*53889Smckusick */ 1428*53889Smckusick esc_pf_define(sp, c) 1429*53889Smckusick SCREEN *sp; 1430*53889Smckusick unsigned int c; 1431*53889Smckusick { 1432*53889Smckusick static bufc = 0; 1433*53889Smckusick 1434*53889Smckusick if (in_str(c, sp->s_estp->terminators)) { 1435*53889Smckusick pf_define(pfn, esc_bp - esc_buf + active_buf, c); 1436*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1437*53889Smckusick active_buf = 0; 1438*53889Smckusick pfn = -1; 1439*53889Smckusick bufc = 0; 1440*53889Smckusick return; 1441*53889Smckusick } 1442*53889Smckusick /* buffering arguments */ 1443*53889Smckusick if (bufc < ESC_BUF_SIZ) { 1444*53889Smckusick if (pfn < 0) { 1445*53889Smckusick if (c >= '0' && c <= '9') { 1446*53889Smckusick *esc_bp = *esc_bp *10 + (c - '0'); 1447*53889Smckusick } else if (c == '|') { 1448*53889Smckusick pfn = *esc_bp; 1449*53889Smckusick *esc_bp = 0; 1450*53889Smckusick } else { 1451*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1452*53889Smckusick active_buf = 0; 1453*53889Smckusick pfn = -1; 1454*53889Smckusick } 1455*53889Smckusick } else { 1456*53889Smckusick active_buf = 1; 1457*53889Smckusick if (c >= '0' && c <= '9') { 1458*53889Smckusick *esc_bp = *esc_bp * 16 + (c - '0'); 1459*53889Smckusick } else if (c >= 'a' && c <= 'f') { 1460*53889Smckusick *esc_bp = *esc_bp * 16 + (c - 'a' + 10); 1461*53889Smckusick } else if (c >= 'A' && c <= 'F') { 1462*53889Smckusick *esc_bp = *esc_bp * 16 + (c - 'A' + 10); 1463*53889Smckusick } else if (c == ';') { 1464*53889Smckusick esc_bp++; 1465*53889Smckusick bufc++; 1466*53889Smckusick } else { 1467*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1468*53889Smckusick pfn = -1; 1469*53889Smckusick active_buf = 0; 1470*53889Smckusick bufc = 0; 1471*53889Smckusick } 1472*53889Smckusick } 1473*53889Smckusick } else { 1474*53889Smckusick active_buf = 0; 1475*53889Smckusick } 1476*53889Smckusick } 1477*53889Smckusick 1478*53889Smckusick pf_define(pfn, length, terminator) 1479*53889Smckusick int pfn; 1480*53889Smckusick int length; 1481*53889Smckusick unsigned int terminator; 1482*53889Smckusick { 1483*53889Smckusick register Pfk_string *pfk = &pfk_str; 1484*53889Smckusick register Key_string *kys = &pfk_str.pfk_string; 1485*53889Smckusick 1486*53889Smckusick if (terminator == 'Z') 1487*53889Smckusick return; 1488*53889Smckusick 1489*53889Smckusick if (pfn < 0 || pfn > N_PFK) 1490*53889Smckusick return; 1491*53889Smckusick if (terminator == 'i' || terminator == 'I') { 1492*53889Smckusick pf_answer(pfn, terminator); 1493*53889Smckusick return; 1494*53889Smckusick } 1495*53889Smckusick pfk->pfk_num = pfn ? pfn: 1; 1496*53889Smckusick pfk->pfk_shift = (terminator == 'p') ? PF_NORMAL: PF_SHIFT; 1497*53889Smckusick kys->key_length = length; 1498*53889Smckusick kys->key_string = esc_buf; 1499*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk); 1500*53889Smckusick } 1501*53889Smckusick 1502*53889Smckusick /* 1503*53889Smckusick * pf_answer(pfn, terminator) 1504*53889Smckusick * this routine answers what strings defined on pfn. 1505*53889Smckusick */ 1506*53889Smckusick 1507*53889Smckusick char def_seq[ESC_BUF_SIZ]; 1508*53889Smckusick 1509*53889Smckusick pf_answer(pfn, terminator) 1510*53889Smckusick int pfn; 1511*53889Smckusick unsigned int terminator; 1512*53889Smckusick { 1513*53889Smckusick register Pfk_string *pfk = &pfk_str; 1514*53889Smckusick register Key_string *kys = &pfk_str.pfk_string; 1515*53889Smckusick register char *bp = an_buf; 1516*53889Smckusick register char *p = def_seq; 1517*53889Smckusick register int length; 1518*53889Smckusick register int j; 1519*53889Smckusick 1520*53889Smckusick /* 1521*53889Smckusick * function key inquiry 1522*53889Smckusick * get string in def_seq 1523*53889Smckusick */ 1524*53889Smckusick pfk->pfk_num = pfn ? pfn: 1; 1525*53889Smckusick pfk->pfk_shift = (terminator == 'i') ? PF_NORMAL: PF_SHIFT; 1526*53889Smckusick kys->key_length = ESC_BUF_SIZ; 1527*53889Smckusick kys->key_string = def_seq; 1528*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCGETS, pfk); 1529*53889Smckusick length = kys->key_length; 1530*53889Smckusick 1531*53889Smckusick /* 1532*53889Smckusick * function key answer 1533*53889Smckusick * put string in an_buf 1534*53889Smckusick */ 1535*53889Smckusick *bp++ = '\033'; 1536*53889Smckusick *bp++ = 'P'; 1537*53889Smckusick bp += itoa(pfn, 10, bp); 1538*53889Smckusick *bp++ = '|'; 1539*53889Smckusick key_str.key_length = bp - an_buf; 1540*53889Smckusick key_str.key_string = an_buf; 1541*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str); 1542*53889Smckusick 1543*53889Smckusick bp = an_buf; 1544*53889Smckusick if (length--) { 1545*53889Smckusick bp += itoa(*p++ & 0xff, 16, bp); 1546*53889Smckusick } 1547*53889Smckusick while (length > 0) { 1548*53889Smckusick for (j = 0; (j < 10) && (length-- > 0); j++) { 1549*53889Smckusick *bp++ = ';'; 1550*53889Smckusick bp += itoa(*p++ & 0xff, 16, bp); 1551*53889Smckusick } 1552*53889Smckusick key_str.key_length = bp - an_buf; 1553*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, (int *)&key_str); 1554*53889Smckusick bp = an_buf; 1555*53889Smckusick } 1556*53889Smckusick *bp++ = (terminator == 'i') ? 'r': 'R'; 1557*53889Smckusick key_str.key_length = bp - an_buf; 1558*53889Smckusick kbd_ioctl(SCC_KEYBOARD, KIOCBACK, (int *)&key_str); 1559*53889Smckusick } 1560*53889Smckusick 1561*53889Smckusick /* 1562*53889Smckusick * ignore 1563*53889Smckusick * esc_ignore(sp) is not called ordinally work. 1564*53889Smckusick */ 1565*53889Smckusick esc_ignore(sp) 1566*53889Smckusick register SCREEN *sp; 1567*53889Smckusick { 1568*53889Smckusick sp->s_current_stat &= ~ESCAPE; 1569*53889Smckusick } 1570*53889Smckusick 1571*53889Smckusick static char *nmr = "0123456789abcdef"; 1572*53889Smckusick /* 1573*53889Smckusick * itoa 1574*53889Smckusick * this routine converts binary to ascii decimal or hexa number 1575*53889Smckusick * according to mod. 1576*53889Smckusick */ 1577*53889Smckusick static 1578*53889Smckusick itoa(n, mod, buf) 1579*53889Smckusick register int n; 1580*53889Smckusick register int mod; 1581*53889Smckusick register char *buf; 1582*53889Smckusick { 1583*53889Smckusick register int i = 0; 1584*53889Smckusick register int cnt; 1585*53889Smckusick int first = 1; 1586*53889Smckusick int k; 1587*53889Smckusick 1588*53889Smckusick n &= 0xffff; 1589*53889Smckusick for (cnt = mod*mod*mod*mod*mod*mod*mod; cnt > 0; cnt /= mod) { 1590*53889Smckusick k = n / cnt; 1591*53889Smckusick n -= k * cnt; 1592*53889Smckusick if (k == 0) { 1593*53889Smckusick if (first == 0) { 1594*53889Smckusick *buf++ = nmr[k]; 1595*53889Smckusick i++; 1596*53889Smckusick } 1597*53889Smckusick } else { 1598*53889Smckusick *buf++ = nmr[k]; 1599*53889Smckusick i++; 1600*53889Smckusick first = 0; 1601*53889Smckusick } 1602*53889Smckusick } 1603*53889Smckusick if (first == 1) { 1604*53889Smckusick *buf++ = '0'; 1605*53889Smckusick i++; 1606*53889Smckusick } 1607*53889Smckusick return(i); 1608*53889Smckusick } 1609