xterm - patch #31 - T.Dickey
This implements vt52 emulation in xterm (ifdef'd so it can be removed).
I've been using it for testing for the past month or so.
--------------------------------------------------------------------------------
VTPrsTbl.c | 655 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
VTparse.def | 1
VTparse.h | 10
charproc.c | 105 ++++++++-
ctlseqs.ms | 62 ++++-
input.c | 52 ++++
ptyx.h | 10
xterm.man | 1
8 files changed, 868 insertions, 28 deletions
--------------------------------------------------------------------------------
Index: VTPrsTbl.c
--- xterm-29+/VTPrsTbl.c Sun Sep 15 21:51:25 1996
+++ xterm-30/VTPrsTbl.c Sat Oct 5 20:36:26 1996
@@ -28,12 +28,15 @@
#include "VTparse.h"
+/* FIXME: there should be a single config.h */
+#define OPT_VT52_MODE 1 /* true if xterm supports VT52 emulation */
+
/*
* Stupid Apollo C preprocessor can't handle long lines. So... To keep
* it happy, we put each onto a separate line.... Sigh...
*/
-Const PARSE_T groundtable[] =
+Const PARSE_T ansi_table[] =
{
/* NUL SOH STX ETX */
CASE_IGNORE,
@@ -4572,3 +4575,653 @@
CASE_IGNORE,
CASE_IGNORE,
};
+
+#if OPT_VT52_MODE
+Const PARSE_T vt52_table[] =
+{
+/* NUL SOH STX ETX */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* EOT ENQ ACK BEL */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_BELL,
+/* BS HT NL VT */
+CASE_BS,
+CASE_TAB,
+CASE_VMOT,
+CASE_IGNORE,
+/* NP CR SO SI */
+CASE_VMOT,
+CASE_CR,
+CASE_IGNORE,
+CASE_IGNORE,
+/* DLE DC1 DC2 DC3 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* DC4 NAK SYN ETB */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* CAN EM SUB ESC */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_ESC,
+/* FS GS RS US */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* SP ! " # */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* $ % & ' */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* ( ) * + */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* , - . / */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* 0 1 2 3 */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* 4 5 6 7 */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* 8 9 : ; */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* < = > ? */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* @ A B C */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* D E F G */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* H I J K */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* L M N O */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* P Q R S */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* T U V W */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* X Y Z [ */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* \ ] ^ _ */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* ` a b c */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* d e f g */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* h i j k */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* l m n o */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* p q r s */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* t u v w */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* x y z { */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+/* | } ~ DEL */
+CASE_PRINT,
+CASE_PRINT,
+CASE_PRINT,
+CASE_IGNORE,
+/* 0x80 0x81 0x82 0x83 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x84 0x85 0x86 0x87 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x88 0x89 0x8a 0x8b */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x8c 0x8d 0x8e 0x8f */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x90 0x91 0x92 0x93 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x94 0x95 0x96 0x97 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x98 0x99 0x9a 0x9b */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x9c 0x9d 0x9e 0x9f */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* nobreakspace exclamdown cent sterling */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* currency yen brokenbar section */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* diaeresis copyright ordfeminine guillemotleft */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* notsign hyphen registered macron */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* degree plusminus twosuperior threesuperior */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* acute mu paragraph periodcentered */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* cedilla onesuperior masculine guillemotright */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* onequarter onehalf threequarters questiondown */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Agrave Aacute Acircumflex Atilde */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Adiaeresis Aring AE Ccedilla */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Egrave Eacute Ecircumflex Ediaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Igrave Iacute Icircumflex Idiaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Eth Ntilde Ograve Oacute */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Ocircumflex Otilde Odiaeresis multiply */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Ooblique Ugrave Uacute Ucircumflex */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Udiaeresis Yacute Thorn ssharp */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* agrave aacute acircumflex atilde */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* adiaeresis aring ae ccedilla */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* egrave eacute ecircumflex ediaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* igrave iacute icircumflex idiaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* eth ntilde ograve oacute */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* ocircumflex otilde odiaeresis division */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* oslash ugrave uacute ucircumflex */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* udiaeresis yacute thorn ydiaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+};
+
+Const PARSE_T vt52_esc_table[] =
+{
+/* NUL SOH STX ETX */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* EOT ENQ ACK BEL */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* BS HT NL VT */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* NP CR SO SI */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* DLE DC1 DC2 DC3 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* DC4 NAK SYN ETB */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* CAN EM SUB ESC */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_ESC,
+/* FS GS RS US */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* SP ! " # */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* $ % & ' */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* ( ) * + */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* , - . / */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0 1 2 3 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 4 5 6 7 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 8 9 : ; */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* < = > ? */
+CASE_ANSI_LEVEL_1,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* @ A B C */
+CASE_IGNORE,
+CASE_CUU,
+CASE_CUD,
+CASE_CUF,
+/* D E F G */
+CASE_CUB,
+CASE_IGNORE,
+CASE_SO,
+CASE_SI,
+/* H I J K */
+CASE_CUP,
+CASE_RI,
+CASE_ED,
+CASE_EL,
+/* L M N O */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* P Q R S */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* T U V W */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* X Y Z [ */
+CASE_IGNORE,
+CASE_VT52_CUP,
+CASE_DECID,
+CASE_IGNORE,
+/* \ ] ^ _ */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* ` a b c */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* d e f g */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* h i j k */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* l m n o */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* p q r s */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* t u v w */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* x y z { */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* | } ~ DEL */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x80 0x81 0x82 0x83 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x84 0x85 0x86 0x87 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x88 0x89 0x8a 0x8b */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x8c 0x8d 0x8e 0x8f */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x90 0x91 0x92 0x93 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x94 0x95 0x96 0x97 */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x98 0x99 0x9a 0x9b */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* 0x9c 0x9d 0x9e 0x9f */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* nobreakspace exclamdown cent sterling */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* currency yen brokenbar section */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* diaeresis copyright ordfeminine guillemotleft */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* notsign hyphen registered macron */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* degree plusminus twosuperior threesuperior */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* acute mu paragraph periodcentered */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* cedilla onesuperior masculine guillemotright */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* onequarter onehalf threequarters questiondown */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Agrave Aacute Acircumflex Atilde */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Adiaeresis Aring AE Ccedilla */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Egrave Eacute Ecircumflex Ediaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Igrave Iacute Icircumflex Idiaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Eth Ntilde Ograve Oacute */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Ocircumflex Otilde Odiaeresis multiply */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Ooblique Ugrave Uacute Ucircumflex */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* Udiaeresis Yacute Thorn ssharp */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* agrave aacute acircumflex atilde */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* adiaeresis aring ae ccedilla */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* egrave eacute ecircumflex ediaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* igrave iacute icircumflex idiaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* eth ntilde ograve oacute */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* ocircumflex otilde odiaeresis division */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* oslash ugrave uacute ucircumflex */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+/* udiaeresis yacute thorn ydiaeresis */
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+CASE_IGNORE,
+};
+#endif /* OPT_VT52_MODE */
Index: VTparse.def
--- xterm-29+/VTparse.def Sun Sep 15 21:42:20 1996
+++ xterm-30/VTparse.def Sat Oct 5 20:35:38 1996
@@ -112,3 +112,4 @@
CASE_DA2
CASE_DEC3_STATE
CASE_DECRPTUI
+CASE_VT52_CUP
Index: VTparse.h
--- xterm-29+/VTparse.h Sun Sep 15 21:48:11 1996
+++ xterm-30/VTparse.h Sat Oct 5 20:35:38 1996
@@ -36,21 +36,26 @@
*/
typedef char PARSE_T;
+extern Const PARSE_T ansi_table[];
extern Const PARSE_T csi_quo_table[];
extern Const PARSE_T csi_table[];
-extern Const PARSE_T dec_table[];
extern Const PARSE_T dec2_table[];
extern Const PARSE_T dec3_table[];
+extern Const PARSE_T dec_table[];
extern Const PARSE_T eigtable[];
extern Const PARSE_T esc_sp_table[];
extern Const PARSE_T esc_table[];
-extern Const PARSE_T groundtable[];
extern Const PARSE_T iestable[];
extern Const PARSE_T igntable[];
extern Const PARSE_T scrtable[];
extern Const PARSE_T scstable[];
extern Const PARSE_T sos_table[];
+#if OPT_VT52_MODE
+extern Const PARSE_T vt52_table[];
+extern Const PARSE_T vt52_esc_table[];
+#endif
+
/*
* The following list of definitions is generated from VTparse.def using the
* following command line:
@@ -168,3 +173,4 @@
#define CASE_DA2 103
#define CASE_DEC3_STATE 104
#define CASE_DECRPTUI 105
+#define CASE_VT52_CUP 106
Index: charproc.c
--- xterm-29+/charproc.c Sun Sep 15 21:47:26 1996
+++ xterm-30/charproc.c Sat Oct 5 20:36:19 1996
@@ -321,7 +321,7 @@
static int defaultNMarginBell = N_MARGINBELL;
static int defaultMultiClickTime = MULTICLICKTIME;
static int defaultBellSuppressTime = BELLSUPPRESSMSEC;
-static int default_DECID = MIN_DECID;
+static int default_DECID = DFT_DECID;
static char * _Font_Selected_ = "yes"; /* string is arbitrary */
#if OPT_BLINK_CURS
@@ -847,6 +847,11 @@
static Char *string_area;
static Size_t string_size, string_used;
+#if OPT_VT52_MODE
+ static Bool vt52_cup = FALSE;
+#endif
+
+ Const PARSE_T *groundtable = ansi_table;
register TScreen *screen = &term->screen;
register Const PARSE_T *parsestate;
register unsigned int c;
@@ -858,6 +863,7 @@
/* We longjmp back to this point in VTReset() */
(void)setjmp(vtjmpbuf);
+ groundtable = screen->ansi_level ? ansi_table : vt52_table;
parsestate = groundtable;
scstype = 0;
private_function = False;
@@ -881,6 +887,29 @@
string_used = 0;
}
+ /*
+ * VT52 is a little ugly in the one place it has a parameterized
+ * control sequence, since the parameter falls after the character
+ * that denotes the type of sequence.
+ */
+#if OPT_VT52_MODE
+ if (vt52_cup) {
+ param[nparam++] = (c & 0x7f) - 32;
+ if (nparam < 2)
+ continue;
+ vt52_cup = FALSE;
+ if((row = param[0]) < 0)
+ row = 0;
+ if((col = param[1]) < 0)
+ col = 0;
+ CursorSet(screen, row, col, term->flags);
+ parsestate = vt52_table;
+ param[0] = 0;
+ param[1] = 0;
+ continue;
+ }
+#endif
+
switch (parsestate[c]) {
case CASE_PRINT:
/* printable characters */
@@ -888,6 +917,10 @@
cp = bptr;
*--bptr = c;
while(top > 0 && isprint(*cp & 0x7f)) {
+#if OPT_VT52_MODE
+ if (screen->ansi_level <= 1)
+ *cp &= 0x7f;
+#endif
top--;
bcnt--;
cp++;
@@ -959,9 +992,19 @@
case CASE_ESC:
/* escape */
+ if_OPT_VT52_MODE(screen,{
+ parsestate = vt52_esc_table;
+ break;})
parsestate = esc_table;
break;
+#if OPT_VT52_MODE
+ case CASE_VT52_CUP:
+ vt52_cup = TRUE;
+ nparam = 0;
+ break;
+#endif
+
case CASE_VMOT:
/*
* form feed, line feed, vertical tab
@@ -998,10 +1041,12 @@
case CASE_SI:
screen->curgl = 0;
+ parsestate = groundtable;
break;
case CASE_SO:
screen->curgl = 1;
+ parsestate = groundtable;
break;
case CASE_SCR_STATE:
@@ -1202,6 +1247,13 @@
break;
case CASE_DECID:
+ if_OPT_VT52_MODE(screen,{
+ unparseputc(ESC, screen->respond);
+ unparseputc('/', screen->respond);
+ unparseputc('Z', screen->respond);
+ parsestate = groundtable;
+ break;
+ })
param[0] = -1; /* Default ID parameter */
/* FALLTHRU */
case CASE_DA1:
@@ -1519,6 +1571,12 @@
case CASE_DECRST:
/* DECRST */
dpmodes(term, bitclr);
+#if OPT_VT52_MODE
+ if (screen->ansi_level == 0)
+ groundtable = vt52_table;
+ else if (screen->terminal_id >= 100)
+ groundtable = ansi_table;
+#endif
parsestate = groundtable;
break;
@@ -1583,14 +1641,22 @@
* equivalents of DECSCL - T.Dickey)
*/
case CASE_ANSI_LEVEL_1:
- screen->ansi_level = 1;
- screen->control_eight_bits = False;
+ if (screen->terminal_id >= 100) {
+ screen->ansi_level = 1;
+ screen->control_eight_bits = False;
+#if OPT_VT52_MODE
+ groundtable =
+ parsestate = ansi_table;
+#endif
+ }
break;
case CASE_ANSI_LEVEL_2:
- screen->ansi_level = 2;
+ if (screen->terminal_id >= 200)
+ screen->ansi_level = 2;
break;
case CASE_ANSI_LEVEL_3:
- screen->ansi_level = 3;
+ if (screen->terminal_id >= 300)
+ screen->ansi_level = 3;
break;
case CASE_DECSCL:
@@ -1772,6 +1838,10 @@
break;
case CASE_S8C1T:
+#if OPT_VT52_MODE
+ if (screen->ansi_level <= 1)
+ break;
+#endif
screen->control_eight_bits = True;
parsestate = groundtable;
break;
@@ -2333,14 +2403,26 @@
update_appcursor();
break;
case 2: /* ANSI/VT52 mode */
- if (func == bitset) {
+ if (func == bitset) { /* ANSI (VT100) */
screen->gsets[0] =
- screen->gsets[1] =
- screen->gsets[2] =
- screen->gsets[3] = 'B';
+ screen->gsets[1] =
+ screen->gsets[2] =
+ screen->gsets[3] = 'B';
screen->curgl = 0;
screen->curgr = 2;
+ if_OPT_VT52_MODE(screen,{
+ screen->ansi_level = 1;})
+ }
+#if OPT_VT52_MODE
+ else if (screen->terminal_id >= 100) { /* VT52 */
+ screen->ansi_level = 0;
+ param[0] = 0;
+ param[1] = 0;
+ screen->curgl = 0;
+ screen->gsets[0] = 'B';
+ screen->gsets[1] = '0';
}
+#endif
break;
case 3: /* DECCOLM */
if(screen->c132) {
@@ -2449,6 +2531,9 @@
FromAlternate(screen);
}
break;
+ case 66: /* DECNKM */
+ /* FIXME: numeric keypad */
+ break;
case 67: /* DECBKM */
/* FIXME: back-arrow mapped to backspace or delete(D)*/
break;
@@ -2867,7 +2952,7 @@
register int inters;
unparseputc1(c = ap->a_type, fd);
- if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) {
+ if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC || c==SS3) {
if (ap->a_pintro != 0)
unparseputc((char) ap->a_pintro, fd);
for (i=0; i<ap->a_nparam; ++i) {
Index: ctlseqs.ms
--- xterm-29+/ctlseqs.ms Sun Sep 15 22:00:25 1996
+++ xterm-30/ctlseqs.ms Sat Oct 5 20:35:39 1996
@@ -135,6 +135,8 @@
.[] : :
.[] ; ;
.[] = =
+.[] / /
+.[] < <
.[] > >
.[] ? ?
.[] @ @
@@ -160,6 +162,7 @@
.[] V V
.[] W W
.[] XX X
+.[] Y Y
.[] Z Z
.[] [[ [
.[] ]] ]
@@ -295,8 +298,8 @@
.LP
Most of these control sequences are standard VT102 control sequences,
but there is support for later DEC VT terminals (i.e., VT220 and VT320), too.
-VT102 features not supported are double size
-characters, blinking characters, and VT52 mode.
+VT102 features not supported are
+double size characters and blinking characters.
There are additional control sequences to provide
\fIxterm-\fPdependent functions, such as the scrollbar or window size.
Where the function is specified by DEC or ISO 6429, the code assigned
@@ -539,7 +542,7 @@
.IP \\*(Cs\\*(Ps\\*s\\*S
Scroll up \*(Ps lines (default = 1) (SU)
.
-.IP \\*(Cs\\*(Ps\\*s\\*\\*T
+.IP \\*(Cs\\*(Ps\\*s\\*T
Scroll down \*(Ps lines (default = 1) (SD, according to DEC)
.
.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*T
@@ -553,7 +556,7 @@
.IP \\*(Cs\\*(Ps\\*s\\*Z
Cursor Backward Tabulation \*(Ps tab stops (default = 1) (CBT)
.
-.IP \\*(Cs\\*(Ps\\*s\\*\\*^
+.IP \\*(Cs\\*(Ps\\*s\\*^
Scroll down \*(Ps lines (default = 1) (SD, according to ISO)
.
.IP \\*(Cs\\*(Ps\\*s\\*c
@@ -691,9 +694,8 @@
.IP \\*(Cs\\*?\\*(Pm\\*s\\*h
DEC Private Mode Set (DECSET)
\*(Ps = \*1 \(-> Application Cursor Keys (DECCKM)
- \*(Ps = \*2 \(-> Designate USASCII for character sets G0-G3.
-(In the VT102, this selects VT52 mode (DECANM), which \fIxterm\fP
-doesn't support.)
+ \*(Ps = \*2 \(-> Designate USASCII for character sets G0-G3 (DECANM),
+and set VT100 mode.
\*(Ps = \*3 \(-> 132 Column Mode (DECCOLM)
\*(Ps = \*4 \(-> Smooth (Slow) Scroll (DECSCLM)
\*(Ps = \*5 \(-> Reverse Video (DECSCNM)
@@ -720,6 +722,7 @@
.IP \\*(Cs\\*?\\*(Pm\\*s\\*l
DEC Private Mode Reset (DECRST)
\*(Ps = \*1 \(-> Normal Cursor Keys (DECCKM)
+ \*(Ps = \*2 \(-> Designate VT52 mode (DECANM).
\*(Ps = \*3 \(-> 80 Column Mode (DECCOLM)
\*(Ps = \*4 \(-> Jump (Fast) Scroll (DECSCLM)
\*(Ps = \*5 \(-> Normal Video (DECSCNM)
@@ -934,4 +937,49 @@
.IP \\*(Us
Alpha Mode (Ctrl-_)
.Ed
+.
+.
+.br
+.ds RH VT52 Mode
+.SH
+VT52 Mode
+.LP
+Parameters for cursor movement are at the end of the \*(Es\*Y escape sequence.
+Each ordinate is encoded in a single character as \fIvalue\fP+040.
+For example, \*! is 1.
+The screen coodinate system is 0-based.
+.St
+.IP \\*(Es\\*A
+Cursor up.
+.IP \\*(Es\\*(cB
+Cursor down.
+.IP \\*(Es\\*C
+Cursor right.
+.IP \\*(Es\\*D
+Cursor left.
+.IP \\*(Es\\*F
+Enter graphics mode.
+.IP \\*(Es\\*G
+Exit graphics mode.
+.IP \\*(Es\\*H
+Move the cursor to the home position.
+.IP \\*(Es\\*I
+Reverse line feed.
+.IP \\*(Es\\*J
+Erase from the cursor to the end of the screen.
+.IP \\*(Es\\*K
+Erase from the cursor to the end of the line.
+.IP \\*(Es\\*Y\\*(Ps\\*s\\*(Ps
+Move the cursor to given row and column.
+.IP \\*(Es\\*Z
+Identify
+ \(-> \*(Es\*s\*/\*s\*Z (``I am a VT52.'')
+.IP \\*(Es\\*=
+Enter alternate keypad mode.
+.IP \\*(Es\\*>
+Exit alternate keypad mode.
+.IP \\*(Es\\*<
+Exit VT52 mode (Enter VT100 mode).
+.Ed
+.
.if n .pl \n(nlu+1v
Index: input.c
--- xterm-29+/input.c Tue Aug 13 14:51:20 1996
+++ xterm-30/input.c Sat Oct 5 20:35:39 1996
@@ -109,19 +109,33 @@
keysym += XK_Home - XK_KP_Home;
}
+#define VT52_KEYPAD \
+ if_OPT_VT52_MODE(screen,{ \
+ reply.a_type = ESC; \
+ reply.a_pintro = '?'; \
+ })
+
+#define VT52_CURSOR_KEYS \
+ if_OPT_VT52_MODE(screen,{ \
+ reply.a_type = ESC; \
+ })
+
if (IsPFKey(keysym)) {
reply.a_type = SS3;
+ reply.a_final = keysym-XK_KP_F1+'P';
+ VT52_CURSOR_KEYS
unparseseq(&reply, pty);
- unparseputc((char)(keysym-XK_KP_F1+'P'), pty);
key = TRUE;
} else if (IsCursorKey(keysym) &&
keysym != XK_Prior && keysym != XK_Next) {
if (keyboard->flags & CURSOR_APL) {
reply.a_type = SS3;
+ reply.a_final = cur[keysym-XK_Home];
+ VT52_CURSOR_KEYS
unparseseq(&reply, pty);
- unparseputc(cur[keysym-XK_Home], pty);
} else {
reply.a_type = CSI;
+ if_OPT_VT52_MODE(screen,{ reply.a_type = ESC; })
reply.a_final = cur[keysym-XK_Home];
unparseseq(&reply, pty);
}
@@ -130,17 +144,32 @@
keysym == XK_Prior || keysym == XK_Next ||
keysym == DXK_Remove || keysym == XK_KP_Delete ||
keysym == XK_KP_Insert) {
- if ((string = udk_lookup(funcvalue(keysym), &nbytes)) != 0) {
+ int dec_code = funcvalue(keysym);
+ if ((string = udk_lookup(dec_code, &nbytes)) != 0) {
while (nbytes-- > 0)
unparseputc(*string++, pty);
- } else {
+ }
+#if OPT_VT52_MODE
+ /*
+ * Interpret F1-F4 as PF1-PF4 for VT52, VT100
+ */
+ else if (screen->ansi_level <= 1
+ && (dec_code >= 11 && dec_code <= 14))
+ {
+ reply.a_type = SS3;
+ VT52_CURSOR_KEYS
+ reply.a_final = dec_code - 11 + 'P';
+ unparseseq(&reply, pty);
+ }
+#endif
+ else {
reply.a_type = CSI;
reply.a_nparam = 1;
if (sunFunctionKeys) {
reply.a_param[0] = sunfuncvalue (keysym);
reply.a_final = 'z';
} else {
- reply.a_param[0] = funcvalue (keysym);
+ reply.a_param[0] = dec_code;
reply.a_final = '~';
}
if (reply.a_param[0] > 0)
@@ -148,10 +177,21 @@
}
key = TRUE;
} else if (IsKeypadKey(keysym)) {
+#if OPT_VT52_MODE
+ /*
+ * DEC keyboards don't have keypad(+), but do have keypad(,)
+ * instead. Other (Sun, PC) keyboards commonly have keypad(+),
+ * but no keypad(,) - it's a pain for users to work around.
+ */
+ if (!sunFunctionKeys
+ && keysym == XK_KP_Add)
+ keysym = XK_KP_Separator;
+#endif
if (keyboard->flags & KYPD_APL) {
reply.a_type = SS3;
+ reply.a_final = kypd_apl[keysym-XK_KP_Space];
+ VT52_KEYPAD
unparseseq(&reply, pty);
- unparseputc(kypd_apl[keysym-XK_KP_Space], pty);
} else
unparseputc(kypd_num[keysym-XK_KP_Space], pty);
key = TRUE;
Index: ptyx.h
--- xterm-29+/ptyx.h Sun Sep 15 21:27:09 1996
+++ xterm-30/ptyx.h Sat Oct 5 20:35:39 1996
@@ -188,7 +188,8 @@
#define APC 0x9F
#define RDEL 0xFF
-#define MIN_DECID 100 /* emulate VT100 */
+#define MIN_DECID 52 /* can emulate VT52 */
+#define DFT_DECID 100 /* default VT100 */
#define MAX_DECID 420 /* ...through VT420 */
#define NMENUFONTS 9 /* entries in fontMenu */
@@ -286,6 +287,7 @@
#define OPT_ISO_COLORS 1 /* true if xterm is configured with ISO colors */
#define OPT_BLINK_CURS 0 /* FIXME: do this later (96/7/31) */
+#define OPT_VT52_MODE 1 /* true if xterm supports VT52 emulation */
/***====================================================================***/
@@ -321,6 +323,12 @@
#define MAX_PTRS term->num_ptrs
#else
#define MAX_PTRS 2
+#endif
+
+#if OPT_VT52_MODE
+#define if_OPT_VT52_MODE(screen, code) if(screen->ansi_level == 0) code
+#else
+#define if_OPT_VT52_MODE(screen, code) /* nothing */
#endif
/* ScrnBuf-level macros */
Index: xterm.man
--- xterm-29+/xterm.man Sun Sep 15 19:58:11 1996
+++ xterm-30/xterm.man Sat Oct 5 20:35:39 1996
@@ -56,7 +56,6 @@
menu in the 4014 window.
.SH EMULATIONS
The VT102 emulation is fairly complete, but does not support
-VT52 mode,
autorepeat,
the blinking character attribute
nor the double-wide and double-size character sets.