From 3614af01cd2ad47c8b88a74f2b2be1a62deb2b81 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Fri, 13 Aug 2010 15:19:36 +0000 Subject: [PATCH] Fix #2673 : allow use of \E(0 to switch to line drawing character set. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38088 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/terminal/TermParse.cpp | 37 +++- src/apps/terminal/VTPrsTbl.c | 326 ++++++++++++++++++++++++++++++++ src/apps/terminal/VTparse.h | 2 + 3 files changed, 359 insertions(+), 6 deletions(-) diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp index acb30c2ceb..109d88ccd7 100644 --- a/src/apps/terminal/TermParse.cpp +++ b/src/apps/terminal/TermParse.cpp @@ -44,6 +44,8 @@ extern int gIesTable[]; /* ignore ESC table */ extern int gEscIgnoreTable[]; /* ESC ignore table */ extern int gMbcsTable[]; /* ESC $ */ +extern int gLineDrawTable[]; /* ESC ( 0 */ + #define DEFAULT -1 #define NPARAM 10 // Max parameters @@ -448,6 +450,30 @@ TermParse::EscParse() fBuffer->InsertChar(dstbuf, dstLen, fAttr); break; + case CASE_PRINT_GRA: + /* "Special characters and line drawing" enabled by \E(0 */ + switch (c) { + case 'j': + fBuffer->InsertChar("\xE2\x94\x98",3,fAttr); + break; + case 'k': + fBuffer->InsertChar("\xE2\x94\x90",3,fAttr); + break; + case 'l': + fBuffer->InsertChar("\xE2\x94\x8C",3,fAttr); + break; + case 'm': + fBuffer->InsertChar("\xE2\x94\x94",3,fAttr); + break; + case 'q': + break; + case 'x': + break; + default: + fBuffer->InsertChar((char)c, fAttr); + } + break; + case CASE_LF: fBuffer->InsertLF(); break; @@ -516,13 +542,12 @@ TermParse::EscParse() break; case CASE_SCS_STATE: - { - cs96 = 0; - _NextParseChar(); - // skip next char - parsestate = groundtable; + if (_NextParseChar() == '0') + parsestate = gLineDrawTable; + else + parsestate = groundtable; break; - } + case CASE_GROUND_STATE: /* exit ignore mode */ parsestate = groundtable; diff --git a/src/apps/terminal/VTPrsTbl.c b/src/apps/terminal/VTPrsTbl.c index 1d9040370a..724f3e507d 100644 --- a/src/apps/terminal/VTPrsTbl.c +++ b/src/apps/terminal/VTPrsTbl.c @@ -4722,3 +4722,329 @@ CASE_SJIS_INSTRING, CASE_SJIS_INSTRING, CASE_SJIS_INSTRING, }; + + +// #pragma mark Line drawing table +int gLineDrawTable[] = +{ +/* 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_LF, +CASE_LF, /* CASE_UP*/ +/* NP CR SO SI */ +CASE_LF, /* CASE_IGNORE*/ +CASE_CR, +CASE_SO, +CASE_SI, +/* 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_GRA, +CASE_PRINT_GRA, +/* l m n o */ +CASE_PRINT_GRA, +CASE_PRINT_GRA, +CASE_PRINT, +CASE_PRINT, +/* p q r s */ +CASE_PRINT, +CASE_PRINT_GRA, +CASE_PRINT, +CASE_PRINT, +/* t u v w */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* x y z { */ +CASE_PRINT_GRA, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* | } ~ DEL */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x84 0x85 0x86 0x87 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x88 0x89 0x8a 0x8b */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x90 0x91 0x92 0x93 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x94 0x95 0x96 0x97 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x99 0x99 0x9a 0x9b */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xa0 0xa1 0xa2 0xa3 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xa4 0xa5 0xa6 0xa7 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xa8 0xa9 0xaa 0xab */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xac 0xad 0xae 0xaf */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xb0 0xb1 0xb2 0xb3 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xb4 0xb5 0xb6 0xb7 */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xb8 0xb9 0xba 0xbb */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xbc 0xbd 0xbe 0xbf */ +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +CASE_UTF8_INSTRING, +/* 0xc0 0xc1 0xc2 0xc3 */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xc4 0xc5 0xc6 0xc7 */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xc8 0xc9 0xca 0xcb */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xcc 0xcd 0xce 0xcf */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xd0 0xd1 0xd2 0xd3 */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xd4 0xd5 0xd6 0xd7 */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xd8 0xd9 0xda 0xdb */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xdc 0xdd 0xde 0xdf */ +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +CASE_UTF8_2BYTE, +/* 0xe0 0xe1 0xe2 0xe3 */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xe4 0xe5 0xe6 0xe7 */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xe8 0xe9 0xea 0xeb */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xec 0xed 0xee 0xef */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xf0 0xf1 0xf2 0xf3 */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xf4 0xf5 0xf6 0xf7 */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xf8 0xf9 0xfa 0xfb */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +/* 0xfc 0xfd 0xfe 0xff */ +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +CASE_UTF8_3BYTE, +}; diff --git a/src/apps/terminal/VTparse.h b/src/apps/terminal/VTparse.h index 4fc92a8552..2ec8b8184c 100644 --- a/src/apps/terminal/VTparse.h +++ b/src/apps/terminal/VTparse.h @@ -123,3 +123,5 @@ #define CASE_SU 89 /* scroll screen up */ #define CASE_SD 90 /* scroll screen down */ #define CASE_ECH 91 /* erase characters */ + +#define CASE_PRINT_GRA 92