head 1.6; access ; symbols ; locks ; comment @ * @; 1.6 date 89.05.02.13.25.08; author pkern; state Exp; branches ; next 1.5; 1.5 date 89.03.23.19.12.29; author pkern; state Exp; branches ; next 1.4; 1.4 date 89.02.03.14.25.57; author pkern; state Exp; branches ; next 1.3; 1.3 date 89.02.03.13.53.35; author pkern; state Exp; branches ; next 1.2; 1.2 date 89.01.31.14.03.05; author pkern; state Exp; branches ; next 1.1; 1.1 date 89.01.31.13.19.58; author pkern; state Exp; branches ; next ; desc @@ 1.6 log @*** empty log message *** @ text @/* * esc.c: * Escape sequence handling routines. The "guts" of vt100-ness. * * Copyright (c) 1989 University of Toronto. All rights reserved. * Anyone may use or copy this software, except that it may not be * sold for profit, that this copyright notice remain intact, and that * credit is given where it is due. The University of Toronto and the * author make no warranty and accept no liability for this software. */ static char rcsid[] = "$Header: esc.c,v 1.5 89/03/23 19:12:29 pkern Exp $"; /* * layout based in part on connect.inc from Qkermit. */ #include "cterm.h" /* some xt100 modes (and their default) */ uchar m_ansi = ANSI; /* ANSI/VT52 mode (ANSI) */ uchar m_newline = 0; /* linefeed/newline (linefeed) */ uchar m_repeat = 1; /* auto repeat (on) */ uchar m_wrap = 1; /* wraparound (on) */ uchar m_smooth = 0; /* scrolling mode (jump) */ uchar m_print = 0; /* printer controller mode (exit) */ uchar m_autopr = 0; /* auto print mode (exit) */ uchar m_prxtent = 1; /* print extent (full page) */ uchar m_prterm = 0; /* print termintation (none) */ uchar m_origin = 0; /* origin mode (absolute) */ uchar m_reverse = 0; /* screen mode (normal) */ uchar m_insert = 0; /* insertion/replacement (replacement) */ uchar m_columns = 80; /* column mode (80 cols) */ uchar m_crskey = KEYNORM; /* cursor key mode (cursor) */ uchar m_keypad = KEYNORM; /* keypad mode (numeric) */ uchar srgn_top=1, srgn_bot=24; /* scroll region markers */ static int attrb, o_attr, o_x, o_y=0; /* storage */ static char *o_cset; /* more storage */ extern uchar cx, cy; extern char tabs[], led[]; extern char *cset, *g0, *g1; extern char *ukascii, *usascii; extern int nbaud; extern uchar parity, bpc, m_prty; extern int avofs; extern char *vt100ids[]; extern uchar vtidnum; #define EBMAX 256 char ebuf[EBMAX]; /* escape sequence storage buffer */ int (*esc)(); extern int zip(); static char *p; static uchar qmark; /* question mark flag */ static int ebi, i; static int n, pn[11], pnc; /* pn[]: parameter "Pn" storage */ /* * gather and process an ANSI escape sequence */ ansi(c, st) /* VT100 */ int c; uchar st; { int vt52(); int insurpc(), burpc(); switch (st) { case 0: /* start a new ESC sequence */ for (i=0; i<11; i++) pn[i] = 0; qmark = i = ebi = 0; ebuf[ebi++] = ESC; break; /* continue building current ESC sequence */ case 1: goto a1; break; case 2: goto a2; break; case 3: goto a3; break; case 4: goto a4; break; case 5: goto a5; break; case 6: goto a6; break; case 7: goto a7; break; default: return(0); /* NOTREACHED */ break; } return(1); a1: ebuf[ebi++] = c; switch (c) { case '#': /* misc. special screen commands */ return(2); a2: ebuf[ebi++] = c; switch (c) { case '3': /* double size, top half */ case '4': /* double size, bottom half */ case '5': /* single width, single height */ case '6': /* double width, single height */ break; case '8': /* alignment test */ e_screen(); /* homes cursor, too */ srgn_top = cx = cy = 1; srgn_bot = 24; break; } break; case '(': case ')': /* select character set */ /* case '*': case '+': /* vt200 extensions */ return(3); a3: ebuf[ebi++] = c; switch (c) { case 'A': case '0': p = ukascii; break; case 'B': default: p = usascii; break; } if (ebuf[1] == '(') g0 = p; else g1 = p; break; case 'D': case 'E': /* index, newline */ if (c == 'E') curs_xy(cx=1, cy); if (cy == srgn_bot) #ifdef TI /* TI scrolling: see comment in term() */ if (srgn_top-1 || cy < 24) scrl_up(1, srgn_top, srgn_bot, cx, cy); else burp(LF, cx, cy); #else scrl_up(1, srgn_top, srgn_bot, cx, cy); #endif else if (cy < 24) curs_xy(cx, ++cy); break; case 'M': /* reverse index */ if (cy == srgn_top) scrl_down(1, srgn_top, srgn_bot, cx, cy); else if (cy > 1) curs_xy(cx, --cy); break; case '7': /* save cursor & attributes */ o_x = cx, o_y = cy, o_attr = attrb; o_cset = cset; break; case '8': /* restore cursor & attributes */ if (!o_y) break; /* nothing saved yet */ curs_xy(cx=o_x, cy=o_y); attribs(o_attr); cset = o_cset; break; case 'H': /* set tab stop */ tabs[cx-1] = 'T'; break; case '=': m_keypad = KEYAPPL; break; case '>': m_keypad = KEYNORM; break; case '@@': /* NB: this ain't ANSI ! */ /* an extension to access graphics screens for */ /* those too lazy to emulate Tektronix (ie. me) */ do { return(7); a7: ebuf[ebi++] = c; } while ((c >= '0' && c <= '9') || c == ';'); ebuf[ebi] = NUL; gfx(ebuf, ebi); break; case '[': /* CSI (command sequence introducer) */ qmark = 0; return(4); a4: if (c == '?') { qmark = 1; return(5); a5: } while ((c >= '0' && c <= '9') || c == ';') { ebuf[ebi++] = c; return(6); a6: } ebuf[ebi++] = c; /* get parameter numbers */ for (i=2, pnc=0; i=0 && n<=9) pn[pnc] = pn[pnc] * 10 + n; else /* it's ';' or it's the final char */ pn[++pnc] = 0; } switch (c) { case 'A': /* cursor up */ if (!pn[0]) pn[0] = 1; while (cy>1 && pn[0]-- && cy != srgn_top) cy--; curs_xy(cx, cy); break; case 'B': /* cursor down */ if (!pn[0]) pn[0] = 1; while (cy<24 && pn[0]-- && cy != srgn_bot) cy++; curs_xy(cx, cy); break; case 'C': /* cursor right */ if (!pn[0]) pn[0] = 1; if ((cx += pn[0]) > m_columns) cx = m_columns; curs_xy(cx, cy); break; case 'D': /* cursor left */ if (!pn[0]) pn[0] = 1; cx = (cx > pn[0]) ? (cx - pn[0]) : 1; curs_xy(cx, cy); break; case 'H': case 'f': /* direct cursor address */ if (!(cx = pn[1])) cx = 1; if (!(cy = pn[0])) cy = 1; if (m_origin) { cy += (srgn_top-1); if (cy > srgn_bot) cy = srgn_bot; } if (cx > m_columns) cx = m_columns; if (cy > 24) cy = 24; curs_xy(cx, cy); break; case 'K': /* line erase */ switch (pn[0]) { case 0: eol_erase(cx, cy); break; case 1: bol_erase(cx, cy); break; case 2: line_erase(cx, cy); break; } break; case 'J': /* screen erase */ switch (pn[0]) { case 0: eos_erase(cx, cy); break; case 1: bos_erase(cx, cy); break; case 2: all_erase(cx, cy); break; } break; case 'L': /* insert line */ if (cy < srgn_top || cy > srgn_bot) break; if (!pn[0]) pn[0] = 1; cx = 1; line_ins(pn[0], cx, cy, srgn_bot); break; case 'M': /* delete line */ if (cy < srgn_top || cy > srgn_bot) break; if (!pn[0]) pn[0] = 1; cx = 1; line_del(pn[0], cx, cy, srgn_bot); break; case '@@': /* insert char */ if (!pn[0]) pn[0] = 1; char_ins(pn[0], cx, cy); break; case 'P': /* delete char */ if (!pn[0]) pn[0] = 1; char_del(pn[0], cx, cy); break; case 'm': /* attributes */ for (i=0; i1 && cy != srgn_top) curs_xy(cx, --cy); break; case 'B': if (cy<24 && cy != srgn_bot) curs_xy(cx, ++cy); break; case 'C': if (cx < 80) curs_xy(++cx, cy); break; case 'D': if (cx > 1) curs_xy(--cx, cy); break; case 'F': /* UK ASCII */ cset = ukascii; break; case 'G': /* US ASCII */ cset = usascii; break; case 'H': curs_xy(cx=1, cy=1); break; case 'I': /* reverse line feed */ if (cy == srgn_top) scrl_down(1, srgn_top, srgn_bot, cx, cy); else if (cy > 1) curs_xy(cx, --cy); break; case 'J': eos_erase(cx, cy); break; case 'K': eol_erase(cx, cy); break; case 'Y': /* cursor addressing */ return(2); v2: ebuf[ebi++] = c; return(3); v3: ebuf[ebi++] = c; /* ignore address if it's out of bounds */ if (ebuf[2] > '7' || ebuf[3] > 'o') break; cy = ebuf[2] - SP; cx = ebuf[3] - SP; curs_xy(++cx, ++cy); break; case 'Z': /* vt52 identify */ p = "\033/Z"; zip(p); break; case '=': m_keypad = KEYAPPL; break; case '>': m_keypad = KEYNORM; break; case '<': /* return to ANSI mode */ m_ansi = ANSI; avofs = ANSOFS; cset = usascii; esc = ansi; break; /* printer commands */ case 'W': m_print = 1; break; /* enter printer mode */ case 'X': m_print = 0; break; /* exit printer mode */ case '^': m_autopr = 1; break; /* auto print mode on */ case '_': m_autopr = 0; break; /* auto print mode off */ case 'V': pr_line(); break; /* print line */ case ']': pr_page(); break; /* print page */ } ebuf[ebi] = NUL; return(0); } @ 1.5 log @column mode switching now supported (sort of). @ text @d11 1 a11 1 static char rcsid[] = "$Header: esc.c,v 1.4 89/02/03 14:25:57 pkern Exp $"; a100 1 m_reverse = 0; d302 1 a302 1 case 3: if (qmark) d304 2 d310 1 a310 1 case 5: if (qmark) m_reverse = 1; break; d347 1 a347 1 case 3: if (qmark) d349 2 d355 1 a355 1 case 5: if (qmark) m_reverse = 0; break; @ 1.4 log @*** empty log message *** @ text @d5 5 a9 1 * copyright (c) University of Toronto, 1988. d11 1 a11 1 static char rcsid[] = "$Header: esc.c,v 1.3 89/02/03 13:53:35 pkern Exp $"; d303 3 a305 2 case 3: if (qmark) m_columns = 80; break; /* not yet supported case 3: if (qmark) m_columns = 132; break; */ d346 3 a348 1 case 3: if (qmark) m_columns = 80; break; @ 1.3 log @TI scroll optimizing #ifdef-ed @ text @d7 1 a7 1 static char rcsid[] = "$Header: esc.c,v 1.2 89/01/31 14:03:05 pkern Exp $"; d47 1 a47 2 char ebuf[EBMAX]; /* escape sequence buffer: place to collect */ /* chars for potential future post-mortems */ d53 1 a53 1 static uchar qmark; d55 1 a55 1 static int n, pn[11], pnc; d68 2 a69 1 case 0: d73 1 d78 1 a78 1 default: return(0); break; a183 2 pn[0] = pn[1] = pn[2] = pn[3] = pn[4] = 0; pn[5] = pn[6] = pn[7] = pn[8] = pn[9] = pn[10] = 0; d300 1 a300 1 /* (not supported) case 3: if (qmark) m_columns = 132; break; */ d337 1 d427 1 a427 1 default: return(0); break; d473 1 a473 1 case '<': @ 1.2 log @*** empty log message *** @ text @d7 1 a7 1 static char rcsid[] = "$Header$"; d122 1 a122 1 burpc(CR, cx=1, cy); d124 2 d129 4 a132 1 burpc(LF, cx, cy); d134 1 a134 1 burpc(LF, cx, ++cy); d301 1 a301 1 /* (not supported) case 3: if (qmark) m_columns = 132; break; */ d406 1 a406 1 ebuf[ebi] = '\0'; d485 1 a485 1 ebuf[ebi] = '\0'; @ 1.1 log @Initial revision @ text @d7 1 a10 2 static char *ID = "esc.c Oct/88 Univ. of Toronto"; #include "common.h" d12 2 d294 1 a294 2 /* nb: fake entry case 2: if (qmark) m_ansi = ANSI; break; */ /* case 3: if (qmark) m_columns = 132; break; */ d296 1 d473 6 a478 7 case 'W': /* enter printer mode */ case 'X': /* exit printer mode */ case '^': /* auto print mode on */ case '_': /* auto print mode off */ case 'V': /* print line */ case ']': /* print page */ break; @