Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3491 - (hide annotations) (download) (as text)
Mon Jun 15 08:20:51 2009 UTC (14 years, 9 months ago) by doda
Original Path: trunk/teraterm/teraterm/vtterm.c
File MIME type: text/x-csrc
File size: 82688 byte(s)
VT100 モード時や Accept8BitCtrl が off の時は ST に反応しないように変更。

1 maya 3227 /* Tera Term
2     Copyright(C) 1994-1998 T. Teranishi
3     All rights reserved. */
4    
5     /* TERATERM.EXE, VT terminal emulation */
6     #include "teraterm.h"
7     #include "tttypes.h"
8     #include <stdio.h>
9     #include <string.h>
10     #include <stdlib.h>
11     #include <mbstring.h>
12     #include <locale.h>
13    
14     #include "buffer.h"
15     #include "ttwinman.h"
16     #include "ttcommon.h"
17     #include "commlib.h"
18     #include "vtdisp.h"
19     #include "keyboard.h"
20     #include "ttlib.h"
21     #include "ttftypes.h"
22     #include "filesys.h"
23     #include "teraprn.h"
24     #include "telnet.h"
25    
26     #include "vtterm.h"
27    
28 doda 3443 #define MAPSIZE(x) (sizeof(x)/sizeof((x)[0]))
29 doda 3491 #define Accept8BitCtrl ((ts.TerminalID>=IdVT220J) && (ts.TermFlag & TF_ACCEPT8BITCTRL))
30 doda 3443
31 maya 3227 /* Parsing modes */
32     #define ModeFirst 0
33     #define ModeESC 1
34     #define ModeDCS 2
35     #define ModeDCUserKey 3
36     #define ModeSOS 4
37     #define ModeCSI 5
38     #define ModeXS 6
39     #define ModeDLE 7
40     #define ModeCAN 8
41    
42     #define NParamMax 16
43     #define IntCharMax 5
44    
45     void VisualBell();
46    
47     /* character attribute */
48     static TCharAttr CharAttr;
49    
50     /* various modes of VT emulation */
51     static BOOL RelativeOrgMode;
52     static BOOL InsertMode;
53     static BOOL LFMode;
54     static BOOL AutoWrapMode;
55     static BOOL FocusReportMode;
56     int MouseReportMode;
57    
58     // save/restore cursor
59     typedef struct {
60     int CursorX, CursorY;
61     TCharAttr Attr;
62     int Glr[2], Gn[4]; // G0-G3, GL & GR
63     BOOL AutoWrapMode;
64     BOOL RelativeOrgMode;
65     } TStatusBuff;
66     typedef TStatusBuff *PStatusBuff;
67    
68     // status buffer for main screen & status line
69     static TStatusBuff SBuff1, SBuff2;
70    
71     static BOOL ESCFlag, JustAfterESC;
72     static BOOL KanjiIn;
73     static BOOL EUCkanaIn, EUCsupIn;
74     static int EUCcount;
75     static BOOL Special;
76    
77     static int Param[NParamMax+1];
78     static int NParam;
79     static BOOL FirstPrm;
80     static BYTE IntChar[IntCharMax+1];
81     static int ICount;
82     static BYTE Prv;
83     static int ParseMode, SavedMode;
84     static int ChangeEmu;
85    
86     /* user defined keys */
87     static BOOL WaitKeyId, WaitHi;
88    
89     /* GL, GR code group */
90     static int Glr[2];
91     /* G0, G1, G2, G3 code group */
92     static int Gn[4];
93     /* GL for single shift 2/3 */
94     static int GLtmp;
95     /* single shift 2/3 flag */
96     static BOOL SSflag;
97     /* JIS -> SJIS conversion flag */
98     static BOOL ConvJIS;
99     static WORD Kanji;
100    
101     // variables for status line mode
102     static int StatusX=0;
103     static BOOL StatusWrap=FALSE;
104     static BOOL StatusCursor=TRUE;
105     static int MainX, MainY; //cursor registers
106     static int MainTop, MainBottom; // scroll region registers
107     static BOOL MainWrap;
108     static BOOL MainCursor=TRUE;
109    
110     /* status for printer escape sequences */
111     static BOOL PrintEX = TRUE; // printing extent
112     // (TRUE: screen, FALSE: scroll region)
113     static BOOL AutoPrintMode = FALSE;
114     static BOOL PrinterMode = FALSE;
115     static BOOL DirectPrn = FALSE;
116    
117     /* User key */
118     static BYTE NewKeyStr[FuncKeyStrMax];
119     static int NewKeyId, NewKeyLen;
120    
121 doda 3450 static _locale_t CLocale = NULL;
122 maya 3227
123     void ResetSBuffers()
124     {
125     SBuff1.CursorX = 0;
126     SBuff1.CursorY = 0;
127     SBuff1.Attr = DefCharAttr;
128     if (ts.Language==IdJapanese)
129     {
130     SBuff1.Gn[0] = IdASCII;
131     SBuff1.Gn[1] = IdKatakana;
132     SBuff1.Gn[2] = IdKatakana;
133     SBuff1.Gn[3] = IdKanji;
134     SBuff1.Glr[0] = 0;
135     if ((ts.KanjiCode==IdJIS) &&
136     (ts.JIS7Katakana==0))
137     SBuff1.Glr[1] = 2; // 8-bit katakana
138     else
139     SBuff1.Glr[1] = 3;
140     }
141     else {
142     SBuff1.Gn[0] = IdASCII;
143     SBuff1.Gn[1] = IdSpecial;
144     SBuff1.Gn[2] = IdASCII;
145     SBuff1.Gn[3] = IdASCII;
146     SBuff1.Glr[0] = 0;
147     SBuff1.Glr[1] = 0;
148     }
149     SBuff1.AutoWrapMode = TRUE;
150     SBuff1.RelativeOrgMode = FALSE;
151     // copy SBuff1 to SBuff2
152     SBuff2 = SBuff1;
153     }
154    
155     void ResetTerminal() /*reset variables but don't update screen */
156     {
157     DispReset();
158     BuffReset();
159    
160     /* Attribute */
161     CharAttr = DefCharAttr;
162     Special = FALSE;
163     BuffSetCurCharAttr(CharAttr);
164    
165     /* Various modes */
166     InsertMode = FALSE;
167     LFMode = (ts.CRSend == IdCRLF);
168     AutoWrapMode = TRUE;
169     AppliKeyMode = FALSE;
170     AppliCursorMode = FALSE;
171     RelativeOrgMode = FALSE;
172     ts.ColorFlag &= ~CF_REVERSEVIDEO;
173     AutoRepeatMode = TRUE;
174     Send8BitMode = ts.Send8BitCtrl;
175     FocusReportMode = FALSE;
176     MouseReportMode = IdMouseTrackNone;
177    
178 doda 3450 if (CLocale == NULL) {
179     CLocale = _create_locale(LC_ALL, "C");
180     }
181 maya 3227
182     /* Character sets */
183     ResetCharSet();
184    
185     /* ESC flag for device control sequence */
186     ESCFlag = FALSE;
187     /* for TEK sequence */
188     JustAfterESC = FALSE;
189    
190     /* Parse mode */
191     ParseMode = ModeFirst;
192    
193     /* Clear printer mode */
194     PrinterMode = FALSE;
195    
196     // status buffers
197     ResetSBuffers();
198     }
199    
200     void ResetCharSet()
201     {
202     if (ts.Language==IdJapanese)
203     {
204     Gn[0] = IdASCII;
205     Gn[1] = IdKatakana;
206     Gn[2] = IdKatakana;
207     Gn[3] = IdKanji;
208     Glr[0] = 0;
209     if ((ts.KanjiCode==IdJIS) &&
210     (ts.JIS7Katakana==0))
211     Glr[1] = 2; // 8-bit katakana
212     else
213     Glr[1] = 3;
214     }
215     else {
216     Gn[0] = IdASCII;
217     Gn[1] = IdSpecial;
218     Gn[2] = IdASCII;
219     Gn[3] = IdASCII;
220     Glr[0] = 0;
221     Glr[1] = 0;
222     cv.SendCode = IdASCII;
223     cv.SendKanjiFlag = FALSE;
224     cv.EchoCode = IdASCII;
225     cv.EchoKanjiFlag = FALSE;
226     }
227     /* Kanji flag */
228     KanjiIn = FALSE;
229     EUCkanaIn = FALSE;
230     EUCsupIn = FALSE;
231     SSflag = FALSE;
232    
233     cv.Language = ts.Language;
234     cv.CRSend = ts.CRSend;
235     cv.KanjiCodeEcho = ts.KanjiCode;
236     cv.JIS7KatakanaEcho = ts.JIS7Katakana;
237     cv.KanjiCodeSend = ts.KanjiCodeSend;
238     cv.JIS7KatakanaSend = ts.JIS7KatakanaSend;
239     cv.KanjiIn = ts.KanjiIn;
240     cv.KanjiOut = ts.KanjiOut;
241     }
242    
243     void ResetKeypadMode(BOOL DisabledModeOnly)
244     {
245     if (!DisabledModeOnly || ts.DisableAppKeypad) AppliKeyMode = FALSE;
246     if (!DisabledModeOnly || ts.DisableAppCursor) AppliCursorMode = FALSE;
247     }
248    
249     void MoveToMainScreen()
250     {
251     StatusX = CursorX;
252     StatusWrap = Wrap;
253     StatusCursor = IsCaretEnabled();
254    
255     CursorTop = MainTop;
256     CursorBottom = MainBottom;
257     Wrap = MainWrap;
258     DispEnableCaret(MainCursor);
259     MoveCursor(MainX,MainY); // move to main screen
260     }
261    
262     void MoveToStatusLine()
263     {
264     MainX = CursorX;
265     MainY = CursorY;
266     MainTop = CursorTop;
267     MainBottom = CursorBottom;
268     MainWrap = Wrap;
269     MainCursor = IsCaretEnabled();
270    
271     DispEnableCaret(StatusCursor);
272     MoveCursor(StatusX,NumOfLines-1); // move to status line
273     CursorTop = NumOfLines-1;
274     CursorBottom = CursorTop;
275     Wrap = StatusWrap;
276     }
277    
278     void HideStatusLine()
279     {
280     if ((StatusLine>0) &&
281     (CursorY==NumOfLines-1))
282     MoveToMainScreen();
283     StatusX = 0;
284     StatusWrap = FALSE;
285     StatusCursor = TRUE;
286     ShowStatusLine(0); //hide
287     }
288    
289     void ChangeTerminalSize(int Nx, int Ny)
290     {
291     BuffChangeTerminalSize(Nx,Ny);
292     StatusX = 0;
293     MainX = 0;
294     MainY = 0;
295     MainTop = 0;
296     MainBottom = NumOfColumns-1;
297     }
298    
299 doda 3471 void SendCSIstr(char *str, int len) {
300     if (str == NULL || len <= 0)
301     return;
302    
303     if (Send8BitMode)
304     CommBinaryOut(&cv,"\233", 1);
305     else
306     CommBinaryOut(&cv,"\033[", 2);
307    
308     CommBinaryOut(&cv, str, len);
309     }
310    
311     void SendOSCstr(char *str, int len) {
312     if (str == NULL || len <= 0)
313     return;
314    
315 doda 3486 if (Send8BitMode) {
316 doda 3471 CommBinaryOut(&cv,"\235", 1);
317 doda 3486 CommBinaryOut(&cv, str, len);
318     CommBinaryOut(&cv,"\234", 1);
319     }
320     else {
321 doda 3471 CommBinaryOut(&cv,"\033]", 2);
322 doda 3486 CommBinaryOut(&cv, str, len);
323     CommBinaryOut(&cv,"\033\\", 2);
324     }
325 doda 3471
326     }
327    
328 maya 3227 void BackSpace()
329     {
330     if (CursorX == 0)
331     {
332     if ((CursorY>0) &&
333     ((ts.TermFlag & TF_BACKWRAP)!=0))
334     {
335     MoveCursor(NumOfColumns-1,CursorY-1);
336     // if (cv.HLogBuf!=0) Log1Byte(BS);
337     // (2005.2.20 yutaka)
338     if (cv.HLogBuf!=0 && !ts.LogTypePlainText) Log1Byte(BS);
339     }
340     }
341     else if (CursorX > 0)
342     {
343     MoveCursor(CursorX-1,CursorY);
344     // if (cv.HLogBuf!=0) Log1Byte(BS);
345     // (2005.2.20 yutaka)
346     if (cv.HLogBuf!=0 && !ts.LogTypePlainText) Log1Byte(BS);
347     }
348     }
349    
350     void CarriageReturn(BOOL logFlag)
351     {
352     #ifndef NO_COPYLINE_FIX
353     if (!ts.EnableContinuedLineCopy || logFlag)
354     #endif /* NO_COPYLINE_FIX */
355     if (cv.HLogBuf!=0) Log1Byte(CR);
356    
357     if (CursorX>0)
358     MoveCursor(0,CursorY);
359     }
360    
361     void LineFeed(BYTE b, BOOL logFlag)
362     {
363     /* for auto print mode */
364     if ((AutoPrintMode) &&
365     (b>=LF) && (b<=FF))
366     BuffDumpCurrentLine(b);
367    
368     #ifndef NO_COPYLINE_FIX
369     if (!ts.EnableContinuedLineCopy || logFlag)
370     #endif /* NO_COPYLINE_FIX */
371     if (cv.HLogBuf!=0) Log1Byte(LF);
372    
373     if (CursorY < CursorBottom)
374     MoveCursor(CursorX,CursorY+1);
375     else if (CursorY == CursorBottom) BuffScrollNLines(1);
376     else if (CursorY < NumOfLines-StatusLine-1)
377     MoveCursor(CursorX,CursorY+1);
378    
379 doda 3312 #ifndef NO_COPYLINE_FIX
380     ClearLineContinued();
381     #endif /* NO_COPYLINE_FIX */
382    
383 maya 3227 if (LFMode) CarriageReturn(logFlag);
384     }
385    
386     void Tab()
387     {
388     if (Wrap && !ts.VTCompatTab) {
389     CarriageReturn(FALSE);
390     LineFeed(LF,FALSE);
391     #ifndef NO_COPYLINE_FIX
392     if (ts.EnableContinuedLineCopy) {
393     SetLineContinued();
394     }
395     #endif /* NO_COPYLINE_FIX */
396     Wrap = FALSE;
397     }
398     CursorForwardTab(1, AutoWrapMode);
399     if (cv.HLogBuf!=0) Log1Byte(HT);
400     }
401    
402     void PutChar(BYTE b)
403     {
404     BOOL SpecialNew;
405     TCharAttr CharAttrTmp;
406    
407     CharAttrTmp = CharAttr;
408    
409     if (PrinterMode) { // printer mode
410     WriteToPrnFile(b,TRUE);
411     return;
412     }
413    
414     if (Wrap)
415     {
416     CarriageReturn(FALSE);
417     LineFeed(LF,FALSE);
418     #ifndef NO_COPYLINE_FIX
419     CharAttrTmp.Attr |= ts.EnableContinuedLineCopy ? AttrLineContinued : 0;
420     #endif /* NO_COPYLINE_FIX */
421     }
422    
423     // if (cv.HLogBuf!=0) Log1Byte(b);
424     // (2005.2.20 yutaka)
425     if (ts.LogTypePlainText) {
426     if (__isascii(b) && !isprint(b)) {
427     // ASCII�������A���\�������������O�����������B
428     } else {
429     if (cv.HLogBuf!=0) Log1Byte(b);
430     }
431     } else {
432     if (cv.HLogBuf!=0) Log1Byte(b);
433     }
434    
435     Wrap = FALSE;
436    
437     SpecialNew = FALSE;
438     if ((b>0x5F) && (b<0x80))
439     {
440     if (SSflag)
441     SpecialNew = (Gn[GLtmp]==IdSpecial);
442     else
443     SpecialNew = (Gn[Glr[0]]==IdSpecial);
444     }
445     else if (b>0xDF)
446     {
447     if (SSflag)
448     SpecialNew = (Gn[GLtmp]==IdSpecial);
449     else
450     SpecialNew = (Gn[Glr[1]]==IdSpecial);
451     }
452    
453     if (SpecialNew != Special)
454     {
455     UpdateStr();
456     Special = SpecialNew;
457     }
458    
459     if (Special)
460     {
461     b = b & 0x7F;
462     CharAttrTmp.Attr |= AttrSpecial;
463     }
464     else
465     CharAttrTmp.Attr |= CharAttr.Attr;
466    
467     BuffPutChar(b, CharAttrTmp, InsertMode);
468    
469     if (CursorX < NumOfColumns-1)
470     MoveRight();
471     else {
472     UpdateStr();
473     Wrap = AutoWrapMode;
474     }
475     }
476    
477     void PutDecSp(BYTE b)
478     {
479     TCharAttr CharAttrTmp;
480    
481     CharAttrTmp = CharAttr;
482    
483     if (PrinterMode) { // printer mode
484     WriteToPrnFile(b, TRUE);
485     return;
486     }
487    
488     if (Wrap) {
489     CarriageReturn(FALSE);
490     LineFeed(LF, FALSE);
491     #ifndef NO_COPYLINE_FIX
492     CharAttrTmp.Attr |= ts.EnableContinuedLineCopy ? AttrLineContinued : 0;
493     #endif /* NO_COPYLINE_FIX */
494     }
495    
496     if (cv.HLogBuf!=0) Log1Byte(b);
497     /*
498     if (ts.LogTypePlainText && __isascii(b) && !isprint(b)) {
499     // ASCII�������A���\�������������O�����������B
500     } else {
501     if (cv.HLogBuf!=0) Log1Byte(b);
502     }
503     */
504    
505     Wrap = FALSE;
506    
507     if (!Special) {
508     UpdateStr();
509     Special = TRUE;
510     }
511    
512     CharAttrTmp.Attr |= AttrSpecial;
513     BuffPutChar(b, CharAttrTmp, InsertMode);
514    
515     if (CursorX < NumOfColumns-1)
516     MoveRight();
517     else {
518     UpdateStr();
519     Wrap = AutoWrapMode;
520     }
521     }
522    
523     void PutKanji(BYTE b)
524     {
525     #ifndef NO_COPYLINE_FIX
526     TCharAttr CharAttrTmp;
527    
528     CharAttrTmp = CharAttr;
529     #endif /* NO_COPYLINE_FIX */
530     Kanji = Kanji + b;
531    
532     if (PrinterMode && DirectPrn)
533     {
534     WriteToPrnFile(HIBYTE(Kanji),FALSE);
535     WriteToPrnFile(LOBYTE(Kanji),TRUE);
536     return;
537     }
538    
539     if (ConvJIS)
540     Kanji = JIS2SJIS((WORD)(Kanji & 0x7f7f));
541    
542     if (PrinterMode) { // printer mode
543     WriteToPrnFile(HIBYTE(Kanji),FALSE);
544     WriteToPrnFile(LOBYTE(Kanji),TRUE);
545     return;
546     }
547    
548     if (Wrap)
549     {
550     CarriageReturn(FALSE);
551     LineFeed(LF,FALSE);
552     #ifndef NO_COPYLINE_FIX
553     if (ts.EnableContinuedLineCopy)
554     CharAttrTmp.Attr |= AttrLineContinued;
555     #endif /* NO_COPYLINE_FIX */
556     }
557     else if (CursorX > NumOfColumns-2)
558     if (AutoWrapMode)
559     {
560     #ifndef NO_COPYLINE_FIX
561     if (ts.EnableContinuedLineCopy)
562     {
563     CharAttrTmp.Attr |= AttrLineContinued;
564     if (CursorX == NumOfColumns-1)
565     BuffPutChar(0x20, CharAttr, FALSE);
566     }
567     #endif /* NO_COPYLINE_FIX */
568     CarriageReturn(FALSE);
569     LineFeed(LF,FALSE);
570     }
571     else return;
572    
573     Wrap = FALSE;
574    
575     if (cv.HLogBuf!=0)
576     {
577     Log1Byte(HIBYTE(Kanji));
578     Log1Byte(LOBYTE(Kanji));
579     }
580    
581     if (Special)
582     {
583     UpdateStr();
584     Special = FALSE;
585     }
586    
587     #ifndef NO_COPYLINE_FIX
588     BuffPutKanji(Kanji, CharAttrTmp, InsertMode);
589     #else
590     BuffPutKanji(Kanji, CharAttr, InsertMode);
591     #endif /* NO_COPYLINE_FIX */
592    
593     if (CursorX < NumOfColumns-2)
594     {
595     MoveRight();
596     MoveRight();
597     }
598     else {
599     UpdateStr();
600     Wrap = AutoWrapMode;
601     }
602     }
603    
604     void PutDebugChar(BYTE b)
605     {
606     InsertMode = FALSE;
607     AutoWrapMode = TRUE;
608    
609     if ((b & 0x80) == 0x80)
610     {
611     UpdateStr();
612     CharAttr.Attr = AttrReverse;
613     b = b & 0x7f;
614     }
615    
616     if (b<=US)
617     {
618     PutChar('^');
619     PutChar((char)(b+0x40));
620     }
621     else if (b==DEL)
622     {
623     PutChar('<');
624     PutChar('D');
625     PutChar('E');
626     PutChar('L');
627     PutChar('>');
628     }
629     else
630     PutChar(b);
631    
632     if (CharAttr.Attr != AttrDefault)
633     {
634     UpdateStr();
635     CharAttr.Attr = AttrDefault;
636     }
637     }
638    
639     void PrnParseControl(BYTE b) // printer mode
640     {
641     switch (b) {
642     case NUL: return;
643     case SO:
644     if (! DirectPrn)
645     {
646     if ((ts.Language==IdJapanese) &&
647     (ts.KanjiCode==IdJIS) &&
648     (ts.JIS7Katakana==1) &&
649     ((ts.TermFlag & TF_FIXEDJIS)!=0))
650     Gn[1] = IdKatakana;
651     Glr[0] = 1; /* LS1 */
652     return;
653     }
654     break;
655     case SI:
656     if (! DirectPrn)
657     {
658     Glr[0] = 0; /* LS0 */
659     return;
660     }
661     break;
662     case DC1:
663     case DC3: return;
664     case ESC:
665     ICount = 0;
666     JustAfterESC = TRUE;
667     ParseMode = ModeESC;
668     WriteToPrnFile(0,TRUE); // flush prn buff
669     return;
670     case CSI:
671 doda 3491 if (! Accept8BitCtrl) {
672 maya 3227 PutChar(b); /* Disp C1 char in VT100 mode */
673     return;
674     }
675     ICount = 0;
676     FirstPrm = TRUE;
677     NParam = 1;
678     Param[1] = -1;
679     Prv = 0;
680     ParseMode = ModeCSI;
681     WriteToPrnFile(0,TRUE); // flush prn buff
682     WriteToPrnFile(b,FALSE);
683     return;
684     }
685     /* send the uninterpreted character to printer */
686     WriteToPrnFile(b,TRUE);
687     }
688    
689     void ParseControl(BYTE b)
690     {
691     if (PrinterMode) { // printer mode
692     PrnParseControl(b);
693     return;
694     }
695    
696     if (b>=0x80) /* C1 char */
697     {
698     /* English mode */
699     if (ts.Language==IdEnglish)
700     {
701 doda 3491 if (!Accept8BitCtrl) {
702 maya 3227 PutChar(b); /* Disp C1 char in VT100 mode */
703     return;
704     }
705     }
706     else { /* Japanese mode */
707     if ((ts.TermFlag & TF_ACCEPT8BITCTRL)==0)
708     return; /* ignore C1 char */
709     /* C1 chars are interpreted as C0 chars in VT100 mode */
710     if (ts.TerminalID<IdVT220J)
711     b = b & 0x7F;
712     }
713     }
714     switch (b) {
715     /* C0 group */
716     case ENQ:
717     CommBinaryOut(&cv,&(ts.Answerback[0]),ts.AnswerbackLen);
718     break;
719     case BEL:
720     switch (ts.Beep) {
721     case IdBeepOff:
722     /* nothing to do */
723     break;
724     case IdBeepOn:
725     MessageBeep(0);
726     break;
727     case IdBeepVisual:
728     VisualBell();
729     break;
730     }
731     break;
732     case BS: BackSpace(); break;
733     case HT: Tab(); break;
734    
735     case LF:
736     // ���M�������s�R�[�h�� LF ���������A�T�[�o���� LF ���������������������������A
737     // CR+LF���������������������B
738     // cf. http://www.neocom.ca/forum/viewtopic.php?t=216
739     // (2007.1.21 yutaka)
740     if (ts.CRReceive == IdLF) {
741     CarriageReturn(TRUE);
742     LineFeed(b, TRUE);
743     break;
744     }
745    
746     case VT: LineFeed(b,TRUE); break;
747    
748     case FF:
749     if ((ts.AutoWinSwitch>0) && JustAfterESC)
750     {
751     CommInsert1Byte(&cv,b);
752     CommInsert1Byte(&cv,ESC);
753     ChangeEmu = IdTEK; /* Enter TEK Mode */
754     }
755     else
756     LineFeed(b,TRUE);
757     break;
758     case CR:
759     CarriageReturn(TRUE);
760     if (ts.CRReceive==IdCRLF)
761     CommInsert1Byte(&cv,LF);
762     break;
763     case SO:
764     if ((ts.Language==IdJapanese) &&
765     (ts.KanjiCode==IdJIS) &&
766     (ts.JIS7Katakana==1) &&
767     ((ts.TermFlag & TF_FIXEDJIS)!=0))
768     Gn[1] = IdKatakana;
769    
770     Glr[0] = 1; /* LS1 */
771     break;
772     case SI: Glr[0] = 0; break; /* LS0 */
773     case DLE:
774     if ((ts.FTFlag & FT_BPAUTO)!=0)
775     ParseMode = ModeDLE; /* Auto B-Plus activation */
776     break;
777     case CAN:
778     if ((ts.FTFlag & FT_ZAUTO)!=0)
779     ParseMode = ModeCAN; /* Auto ZMODEM activation */
780     // else if (ts.AutoWinSwitch>0)
781     // ChangeEmu = IdTEK; /* Enter TEK Mode */
782     else
783     ParseMode = ModeFirst;
784     break;
785     case SUB: ParseMode = ModeFirst; break;
786     case ESC:
787     ICount = 0;
788     JustAfterESC = TRUE;
789     ParseMode = ModeESC;
790     break;
791     case FS:
792     case GS:
793     case RS:
794     case US:
795     if (ts.AutoWinSwitch>0)
796     {
797     CommInsert1Byte(&cv,b);
798     ChangeEmu = IdTEK; /* Enter TEK Mode */
799     }
800     break;
801    
802     /* C1 char */
803     case IND: LineFeed(0,TRUE); break;
804     case NEL:
805     LineFeed(0,TRUE);
806     CarriageReturn(TRUE);
807     break;
808     case HTS: SetTabStop(); break;
809     case RI: CursorUpWithScroll(); break;
810     case SS2:
811     GLtmp = 2;
812     SSflag = TRUE;
813     break;
814     case SS3:
815     GLtmp = 3;
816     SSflag = TRUE;
817     break;
818     case DCS:
819     SavedMode = ParseMode;
820     ESCFlag = FALSE;
821     NParam = 1;
822     Param[1] = -1;
823     ParseMode = ModeDCS;
824     break;
825     case SOS:
826     SavedMode = ParseMode;
827     ESCFlag = FALSE;
828     ParseMode = ModeSOS;
829     break;
830     case CSI:
831     ICount = 0;
832     FirstPrm = TRUE;
833     NParam = 1;
834     Param[1] = -1;
835     Prv = 0;
836     ParseMode = ModeCSI;
837     break;
838     case OSC:
839     Param[1] = 0;
840     ParseMode = ModeXS;
841     break;
842     case PM:
843     case APC:
844     SavedMode = ParseMode;
845     ESCFlag = FALSE;
846     ParseMode = ModeSOS;
847     break;
848     }
849     }
850    
851     void SaveCursor()
852     {
853     int i;
854     PStatusBuff Buff;
855    
856     if ((StatusLine>0) &&
857     (CursorY==NumOfLines-1))
858     Buff = &SBuff2; // for status line
859     else
860     Buff = &SBuff1; // for main screen
861    
862     Buff->CursorX = CursorX;
863     Buff->CursorY = CursorY;
864     Buff->Attr = CharAttr;
865     Buff->Glr[0] = Glr[0];
866     Buff->Glr[1] = Glr[1];
867     for (i=0 ; i<=3; i++)
868     Buff->Gn[i] = Gn[i];
869     Buff->AutoWrapMode = AutoWrapMode;
870     Buff->RelativeOrgMode = RelativeOrgMode;
871     }
872    
873     void RestoreCursor()
874     {
875     int i;
876     PStatusBuff Buff;
877     UpdateStr();
878    
879     if ((StatusLine>0) &&
880     (CursorY==NumOfLines-1))
881     Buff = &SBuff2; // for status line
882     else
883     Buff = &SBuff1; // for main screen
884    
885     if (Buff->CursorX > NumOfColumns-1)
886     Buff->CursorX = NumOfColumns-1;
887     if (Buff->CursorY > NumOfLines-1-StatusLine)
888     Buff->CursorY = NumOfLines-1-StatusLine;
889     MoveCursor(Buff->CursorX,Buff->CursorY);
890     CharAttr = Buff->Attr;
891     Glr[0] = Buff->Glr[0];
892     Glr[1] = Buff->Glr[1];
893     for (i=0 ; i<=3; i++)
894     Gn[i] = Buff->Gn[i];
895     AutoWrapMode = Buff->AutoWrapMode;
896     RelativeOrgMode = Buff->RelativeOrgMode;
897     }
898    
899     void AnswerTerminalType()
900     {
901     char Tmp[31];
902    
903     if (ts.TerminalID<IdVT320)
904     strncpy_s(Tmp, sizeof(Tmp),"\033[?", _TRUNCATE);
905     else
906     strncpy_s(Tmp, sizeof(Tmp),"\233?", _TRUNCATE);
907    
908     switch (ts.TerminalID) {
909     case IdVT100:
910     strncat_s(Tmp,sizeof(Tmp),"1;2",_TRUNCATE);
911     break;
912     case IdVT100J:
913     strncat_s(Tmp,sizeof(Tmp),"5;2",_TRUNCATE);
914     break;
915     case IdVT101:
916     strncat_s(Tmp,sizeof(Tmp),"1;0",_TRUNCATE);
917     break;
918     case IdVT102:
919     strncat_s(Tmp,sizeof(Tmp),"6",_TRUNCATE);
920     break;
921     case IdVT102J:
922     strncat_s(Tmp,sizeof(Tmp),"15",_TRUNCATE);
923     break;
924     case IdVT220J:
925     strncat_s(Tmp,sizeof(Tmp),"62;1;2;5;6;7;8",_TRUNCATE);
926     break;
927     case IdVT282:
928     strncat_s(Tmp,sizeof(Tmp),"62;1;2;4;5;6;7;8;10;11",_TRUNCATE);
929     break;
930     case IdVT320:
931     strncat_s(Tmp,sizeof(Tmp),"63;1;2;6;7;8",_TRUNCATE);
932     break;
933     case IdVT382:
934     strncat_s(Tmp,sizeof(Tmp),"63;1;2;4;5;6;7;8;10;15",_TRUNCATE);
935     break;
936     }
937     strncat_s(Tmp,sizeof(Tmp),"c",_TRUNCATE);
938    
939     CommBinaryOut(&cv,Tmp,strlen(Tmp)); /* Report terminal ID */
940     }
941    
942     void ESCSpace(BYTE b)
943     {
944     switch (b) {
945     case 'F': Send8BitMode = FALSE; break; // S7C1T
946     case 'G': Send8BitMode = TRUE; break; // S8C1T
947     }
948     }
949    
950     void ESCSharp(BYTE b)
951     {
952     switch (b) {
953     case '8': /* Fill screen with "E" */
954     BuffUpdateScroll();
955     BuffFillWithE();
956     MoveCursor(0,0);
957     ParseMode = ModeFirst;
958     break;
959     }
960     }
961    
962     /* select double byte code set */
963     void ESCDBCSSelect(BYTE b)
964     {
965     int Dist;
966    
967     if (ts.Language!=IdJapanese) return;
968    
969     switch (ICount) {
970     case 1:
971     if ((b=='@') || (b=='B'))
972     {
973     Gn[0] = IdKanji; /* Kanji -> G0 */
974     if ((ts.TermFlag & TF_AUTOINVOKE)!=0)
975     Glr[0] = 0; /* G0->GL */
976     }
977     break;
978     case 2:
979     /* Second intermediate char must be
980     '(' or ')' or '*' or '+'. */
981     Dist = (IntChar[2]-'(') & 3; /* G0 - G3 */
982     if ((b=='1') || (b=='3') ||
983     (b=='@') || (b=='B'))
984     {
985     Gn[Dist] = IdKanji; /* Kanji -> G0-3 */
986     if (((ts.TermFlag & TF_AUTOINVOKE)!=0) &&
987     (Dist==0))
988     Glr[0] = 0; /* G0->GL */
989     }
990     break;
991     }
992     }
993    
994     void ESCSelectCode(BYTE b)
995     {
996     switch (b) {
997     case '0':
998     if (ts.AutoWinSwitch>0)
999     ChangeEmu = IdTEK; /* enter TEK mode */
1000     break;
1001     }
1002     }
1003    
1004     /* select single byte code set */
1005     void ESCSBCSSelect(BYTE b)
1006     {
1007     int Dist;
1008    
1009     /* Intermediate char must be
1010     '(' or ')' or '*' or '+'. */
1011     Dist = (IntChar[1]-'(') & 3; /* G0 - G3 */
1012    
1013     switch (b) {
1014     case '0': Gn[Dist] = IdSpecial; break;
1015     case '<': Gn[Dist] = IdASCII; break;
1016     case '>': Gn[Dist] = IdASCII; break;
1017     case 'A': Gn[Dist] = IdASCII; break;
1018     case 'B': Gn[Dist] = IdASCII; break;
1019     case 'H': Gn[Dist] = IdASCII; break;
1020     case 'I':
1021     if (ts.Language==IdJapanese)
1022     Gn[Dist] = IdKatakana;
1023     break;
1024     case 'J': Gn[Dist] = IdASCII; break;
1025     }
1026    
1027     if (((ts.TermFlag & TF_AUTOINVOKE)!=0) &&
1028     (Dist==0))
1029     Glr[0] = 0; /* G0->GL */
1030     }
1031    
1032     void PrnParseEscape(BYTE b) // printer mode
1033     {
1034     int i;
1035    
1036     ParseMode = ModeFirst;
1037     switch (ICount) {
1038     /* no intermediate char */
1039     case 0:
1040     switch (b) {
1041     case '[': /* CSI */
1042     ICount = 0;
1043     FirstPrm = TRUE;
1044     NParam = 1;
1045     Param[1] = -1;
1046     Prv = 0;
1047     WriteToPrnFile(ESC,FALSE);
1048     WriteToPrnFile('[',FALSE);
1049     ParseMode = ModeCSI;
1050     return;
1051     } /* end of case Icount=0 */
1052     break;
1053     /* one intermediate char */
1054     case 1:
1055     switch (IntChar[1]) {
1056     case '$':
1057     if (! DirectPrn)
1058     {
1059     ESCDBCSSelect(b);
1060     return;
1061     }
1062     break;
1063     case '(':
1064     case ')':
1065     case '*':
1066     case '+':
1067     if (! DirectPrn)
1068     {
1069     ESCSBCSSelect(b);
1070     return;
1071     }
1072     break;
1073     }
1074     break;
1075     /* two intermediate char */
1076     case 2:
1077     if ((! DirectPrn) &&
1078     (IntChar[1]=='$') &&
1079     ('('<=IntChar[2]) &&
1080     (IntChar[2]<='+'))
1081     {
1082     ESCDBCSSelect(b);
1083     return;
1084     }
1085     break;
1086     }
1087     // send the uninterpreted sequence to printer
1088     WriteToPrnFile(ESC,FALSE);
1089     for (i=1; i<=ICount; i++)
1090     WriteToPrnFile(IntChar[i],FALSE);
1091     WriteToPrnFile(b,TRUE);
1092     }
1093    
1094     void ParseEscape(BYTE b) /* b is the final char */
1095     {
1096     if (PrinterMode) { // printer mode
1097     PrnParseEscape(b);
1098     return;
1099     }
1100    
1101     switch (ICount) {
1102     /* no intermediate char */
1103     case 0:
1104     switch (b) {
1105     case '7': SaveCursor(); break;
1106     case '8': RestoreCursor(); break;
1107     case '=': AppliKeyMode = TRUE; break;
1108     case '>': AppliKeyMode = FALSE; break;
1109     case 'D': /* IND */
1110     LineFeed(0,TRUE);
1111     break;
1112     case 'E': /* NEL */
1113     MoveCursor(0,CursorY);
1114     LineFeed(0,TRUE);
1115     break;
1116     case 'H': /* HTS */
1117     SetTabStop();
1118     break;
1119     case 'M': /* RI */
1120     CursorUpWithScroll();
1121     break;
1122     case 'N': /* SS2 */
1123     GLtmp = 2;
1124     SSflag = TRUE;
1125     break;
1126     case 'O': /* SS3 */
1127     GLtmp = 3;
1128     SSflag = TRUE;
1129     break;
1130     case 'P': /* DCS */
1131     SavedMode = ParseMode;
1132     ESCFlag = FALSE;
1133     NParam = 1;
1134     Param[1] = -1;
1135     ParseMode = ModeDCS;
1136     return;
1137     case 'X': /* SOS */
1138     SavedMode = ParseMode;
1139     ESCFlag = FALSE;
1140     ParseMode = ModeSOS;
1141     return;
1142     case 'Z': AnswerTerminalType(); break;
1143     case '[': /* CSI */
1144     ICount = 0;
1145     FirstPrm = TRUE;
1146     NParam = 1;
1147     Param[1] = -1;
1148     Prv = 0;
1149     ParseMode = ModeCSI;
1150     return;
1151     case '\\': break; /* ST */
1152     case ']': /* XTERM sequence (OSC) */
1153     NParam = 1;
1154     Param[1] = 0;
1155     ParseMode = ModeXS;
1156     return;
1157     case '^':
1158     case '_': /* PM, APC */
1159     SavedMode = ParseMode;
1160     ESCFlag = FALSE;
1161     ParseMode = ModeSOS;
1162     return;
1163     case 'c': /* Hardware reset */
1164     HideStatusLine();
1165     ResetTerminal();
1166     ClearUserKey();
1167     ClearBuffer();
1168     if (ts.PortType==IdSerial) // reset serial port
1169     CommResetSerial(&ts, &cv, TRUE);
1170     break;
1171     case 'g': /* Visual Bell (screen original?) */
1172     VisualBell();
1173     break;
1174     case 'n': Glr[0] = 2; break; /* LS2 */
1175     case 'o': Glr[0] = 3; break; /* LS3 */
1176     case '|': Glr[1] = 3; break; /* LS3R */
1177     case '}': Glr[1] = 2; break; /* LS2R */
1178     case '~': Glr[1] = 1; break; /* LS1R */
1179     } /* end of case Icount=0 */
1180     break;
1181     /* one intermediate char */
1182     case 1:
1183     switch (IntChar[1]) {
1184     case ' ': ESCSpace(b); break;
1185     case '#': ESCSharp(b); break;
1186     case '$': ESCDBCSSelect(b); break;
1187     case '%': break;
1188     case '(':
1189     case ')':
1190     case '*':
1191     case '+':
1192     ESCSBCSSelect(b);
1193     break;
1194     }
1195     break;
1196     /* two intermediate char */
1197     case 2:
1198     if ((IntChar[1]=='$') &&
1199     ('('<=IntChar[2]) &&
1200     (IntChar[2]<='+'))
1201     ESCDBCSSelect(b);
1202     else if ((IntChar[1]=='%') &&
1203     (IntChar[2]=='!'))
1204     ESCSelectCode(b);
1205     break;
1206     }
1207     ParseMode = ModeFirst;
1208     }
1209    
1210     void EscapeSequence(BYTE b)
1211     {
1212     if (b<=US)
1213     ParseControl(b);
1214     else if ((b>=0x20) && (b<=0x2F))
1215     {
1216     if (ICount<IntCharMax) ICount++;
1217     IntChar[ICount] = b;
1218     }
1219     else if ((b>=0x30) && (b<=0x7E))
1220     ParseEscape(b);
1221     else if ((b>=0x80) && (b<=0x9F))
1222     ParseControl(b);
1223    
1224     JustAfterESC = FALSE;
1225     }
1226    
1227     void CSInsertCharacter()
1228     {
1229     // Insert space characters at cursor
1230     int Count;
1231    
1232     BuffUpdateScroll();
1233     if (Param[1]<1) Param[1] = 1;
1234     Count = Param[1];
1235     BuffInsertSpace(Count);
1236     }
1237    
1238     void CSCursorUp()
1239     {
1240     if (Param[1]<1) Param[1] = 1;
1241    
1242     if (CursorY >= CursorTop)
1243     {
1244     if (CursorY-Param[1] > CursorTop)
1245     MoveCursor(CursorX,CursorY-Param[1]);
1246     else
1247     MoveCursor(CursorX,CursorTop);
1248     }
1249     else {
1250     if (CursorY > 0)
1251     MoveCursor(CursorX,CursorY-Param[1]);
1252     else
1253     MoveCursor(CursorX,0);
1254     }
1255     }
1256    
1257     void CSCursorUp1()
1258     {
1259     MoveCursor(0,CursorY);
1260     CSCursorUp();
1261     }
1262    
1263     void CSCursorDown()
1264     {
1265     if (Param[1]<1) Param[1] = 1;
1266    
1267     if (CursorY <= CursorBottom)
1268     {
1269     if (CursorY+Param[1] < CursorBottom)
1270     MoveCursor(CursorX,CursorY+Param[1]);
1271     else
1272     MoveCursor(CursorX,CursorBottom);
1273     }
1274     else {
1275     if (CursorY < NumOfLines-StatusLine-1)
1276     MoveCursor(CursorX,CursorY+Param[1]);
1277     else
1278     MoveCursor(CursorX,NumOfLines-StatusLine);
1279     }
1280     }
1281    
1282     void CSCursorDown1()
1283     {
1284     MoveCursor(0,CursorY);
1285     CSCursorDown();
1286     }
1287    
1288     void CSScreenErase()
1289     {
1290     if (Param[1] == -1) Param[1] = 0;
1291     BuffUpdateScroll();
1292     switch (Param[1]) {
1293     case 0:
1294     // <ESC>[H(Cursor in left upper corner)�������J�[�\�������������w�������������A
1295     // <ESC>[J��<ESC>[2J�����������������A�����������A���s�o�b�t�@���X�N���[���A�E�g
1296     // �����������������B(2005.5.29 yutaka)
1297     // �R���t�B�O���[�V�������������������������������B(2008.5.3 yutaka)
1298     if (ts.ScrollWindowClearScreen &&
1299     (CursorX == 0 && CursorY == 0)) {
1300     // Erase screen (scroll out)
1301     BuffClearScreen();
1302     UpdateWindow(HVTWin);
1303    
1304     } else {
1305     // Erase characters from cursor to the end of screen
1306     BuffEraseCurToEnd();
1307     }
1308     break;
1309    
1310     case 1:
1311     // Erase characters from home to cursor
1312     BuffEraseHomeToCur();
1313     break;
1314    
1315     case 2:
1316     // Erase screen (scroll out)
1317     BuffClearScreen();
1318     UpdateWindow(HVTWin);
1319     break;
1320     }
1321     }
1322    
1323     void CSInsertLine()
1324     {
1325     // Insert lines at current position
1326     int Count, YEnd;
1327    
1328     if (CursorY < CursorTop) return;
1329     if (CursorY > CursorBottom) return;
1330     if (Param[1]<1) Param[1] = 1;
1331     Count = Param[1];
1332    
1333     YEnd = CursorBottom;
1334     if (CursorY > YEnd) YEnd = NumOfLines-1-StatusLine;
1335     if (Count > YEnd+1 - CursorY) Count = YEnd+1 - CursorY;
1336    
1337     BuffInsertLines(Count,YEnd);
1338     }
1339    
1340     void CSLineErase()
1341     {
1342     if (Param[1] == -1) Param[1] = 0;
1343     BuffUpdateScroll();
1344     switch (Param[1]) {
1345     /* erase char from cursor to end of line */
1346     case 0:
1347     BuffEraseCharsInLine(CursorX,NumOfColumns-CursorX);
1348     break;
1349     /* erase char from start of line to cursor */
1350     case 1:
1351     BuffEraseCharsInLine(0,CursorX+1);
1352     break;
1353     /* erase entire line */
1354     case 2:
1355     BuffEraseCharsInLine(0,NumOfColumns);
1356     break;
1357     }
1358     }
1359    
1360     void CSDeleteNLines()
1361     // Delete lines from current line
1362     {
1363     int Count, YEnd;
1364    
1365     if (CursorY < CursorTop) return;
1366     if (CursorY > CursorBottom) return;
1367     Count = Param[1];
1368     if (Count<1) Count = 1;
1369    
1370     YEnd = CursorBottom;
1371     if (CursorY > YEnd) YEnd = NumOfLines-1-StatusLine;
1372     if (Count > YEnd+1-CursorY) Count = YEnd+1-CursorY;
1373     BuffDeleteLines(Count,YEnd);
1374     }
1375    
1376     void CSDeleteCharacter()
1377     {
1378     // Delete characters in current line from cursor
1379    
1380     if (Param[1]<1) Param[1] = 1;
1381     BuffUpdateScroll();
1382     BuffDeleteChars(Param[1]);
1383     }
1384    
1385     void CSEraseCharacter()
1386     {
1387     if (Param[1]<1) Param[1] = 1;
1388     BuffUpdateScroll();
1389     BuffEraseChars(Param[1]);
1390     }
1391    
1392     void CSScrollUP()
1393     {
1394     if (Param[1]<1) Param[1] = 1;
1395     BuffUpdateScroll();
1396     BuffRegionScrollUpNLines(Param[1]);
1397     }
1398    
1399     void CSScrollDown()
1400     {
1401     if (Param[1]<1) Param[1] = 1;
1402     BuffUpdateScroll();
1403     BuffRegionScrollDownNLines(Param[1]);
1404     }
1405    
1406     void CSForwardTab()
1407     {
1408     if (Param[1]<1) Param[1] = 1;
1409     CursorForwardTab(Param[1], AutoWrapMode);
1410     }
1411    
1412     void CSBackwardTab()
1413     {
1414     if (Param[1]<1) Param[1] = 1;
1415     CursorBackwardTab(Param[1]);
1416     }
1417    
1418     void CSMoveToColumnN()
1419     {
1420     if (Param[1]<1) Param[1] = 1;
1421     Param[1]--;
1422     if (Param[1] < 0) Param[1] = 0;
1423     if (Param[1] > NumOfColumns-1) Param[1] = NumOfColumns-1;
1424     MoveCursor(Param[1],CursorY);
1425     }
1426    
1427     void CSCursorRight()
1428     {
1429     if (Param[1]<1) Param[1] = 1;
1430     if (CursorX + Param[1] > NumOfColumns-1)
1431     MoveCursor(NumOfColumns-1,CursorY);
1432     else
1433     MoveCursor(CursorX+Param[1],CursorY);
1434     }
1435    
1436     void CSCursorLeft()
1437     {
1438     if (Param[1]<1) Param[1] = 1;
1439     if (CursorX-Param[1] < 0)
1440     MoveCursor(0,CursorY);
1441     else
1442     MoveCursor(CursorX-Param[1],CursorY);
1443     }
1444    
1445     void CSMoveToLineN()
1446     {
1447     if (Param[1]<1) Param[1] = 1;
1448     if (RelativeOrgMode)
1449     {
1450     if (CursorTop+Param[1]-1 > CursorBottom)
1451     MoveCursor(CursorX,CursorBottom);
1452     else
1453     MoveCursor(CursorX,CursorTop+Param[1]-1);
1454     }
1455     else {
1456     if (Param[1] > NumOfLines-StatusLine)
1457     MoveCursor(CursorX,NumOfLines-1-StatusLine);
1458     else
1459     MoveCursor(CursorX,Param[1]-1);
1460     }
1461     }
1462    
1463     void CSMoveToXY()
1464     {
1465     int NewX, NewY;
1466    
1467     if (Param[1]<1) Param[1] = 1;
1468     if ((NParam < 2) || (Param[2]<1)) Param[2] = 1;
1469     NewX = Param[2] - 1;
1470     if (NewX > NumOfColumns-1) NewX = NumOfColumns-1;
1471    
1472     if ((StatusLine>0) && (CursorY==NumOfLines-1))
1473     NewY = CursorY;
1474     else if (RelativeOrgMode)
1475     {
1476     NewY = CursorTop + Param[1] - 1;
1477     if (NewY > CursorBottom) NewY = CursorBottom;
1478     }
1479     else {
1480     NewY = Param[1] - 1;
1481     if (NewY > NumOfLines-1-StatusLine)
1482     NewY = NumOfLines-1-StatusLine;
1483     }
1484     MoveCursor(NewX,NewY);
1485     }
1486    
1487     void CSDeleteTabStop()
1488     {
1489     if (Param[1]==-1) Param[1] = 0;
1490     ClearTabStop(Param[1]);
1491     }
1492    
1493     void CS_h_Mode()
1494     {
1495     switch (Param[1]) {
1496 doda 3311 case 2: // KAM
1497     KeybEnabled = FALSE; break;
1498     case 4: // IRM
1499     InsertMode = TRUE; break;
1500     case 12: // SRM
1501 doda 3485 ts.LocalEcho = 0;
1502     if (cv.Ready && cv.TelFlag && (ts.TelEcho>0))
1503     TelChangeEcho();
1504     break;
1505 doda 3311 case 20: // LF/NL
1506 doda 3485 LFMode = TRUE;
1507     ts.CRSend = IdCRLF;
1508     cv.CRSend = IdCRLF;
1509     break;
1510 doda 3311 case 33: // WYSTCURM
1511 doda 3485 if (ts.WindowFlag & WF_CURSORCHANGE) {
1512     ts.NonblinkingCursor = TRUE;
1513     ChangeCaret();
1514     }
1515     break;
1516 doda 3311 case 34: // WYULCURM
1517 doda 3485 if (ts.WindowFlag & WF_CURSORCHANGE) {
1518     ts.CursorShape = IdHCur;
1519     ChangeCaret();
1520     }
1521     break;
1522 maya 3227 }
1523     }
1524    
1525     void CS_i_Mode()
1526     {
1527     if (Param[1]==-1) Param[1] = 0;
1528     switch (Param[1]) {
1529     /* print screen */
1530     // PrintEX -- TRUE: print screen
1531     // FALSE: scroll region
1532     case 0: BuffPrint(! PrintEX); break;
1533     /* printer controller mode off */
1534     case 4: break; /* See PrnParseCS() */
1535     /* printer controller mode on */
1536     case 5:
1537     if (! AutoPrintMode)
1538     OpenPrnFile();
1539     DirectPrn = (ts.PrnDev[0]!=0);
1540     PrinterMode = TRUE;
1541     break;
1542     }
1543     }
1544    
1545     void CS_l_Mode()
1546     {
1547     switch (Param[1]) {
1548 doda 3311 case 2: // KAM
1549     KeybEnabled = TRUE; break;
1550     case 4: // IRM
1551     InsertMode = FALSE; break;
1552     case 12: // SRM
1553 doda 3485 ts.LocalEcho = 1;
1554     if (cv.Ready && cv.TelFlag && (ts.TelEcho>0))
1555     TelChangeEcho();
1556     break;
1557 doda 3311 case 20: // LF/NL
1558 doda 3485 LFMode = FALSE;
1559     ts.CRSend = IdCR;
1560     cv.CRSend = IdCR;
1561     break;
1562 doda 3311 case 33: // WYSTCURM
1563 doda 3485 if (ts.WindowFlag & WF_CURSORCHANGE) {
1564     ts.NonblinkingCursor = FALSE;
1565     ChangeCaret();
1566     }
1567     break;
1568 doda 3311 case 34: // WYULCURM
1569 doda 3485 if (ts.WindowFlag & WF_CURSORCHANGE) {
1570     ts.CursorShape = IdBlkCur;
1571     ChangeCaret();
1572     }
1573     break;
1574 maya 3227 }
1575     }
1576    
1577     void CS_n_Mode()
1578     {
1579     char Report[16];
1580 doda 3471 int Y, len;
1581 maya 3227
1582     switch (Param[1]) {
1583     case 5:
1584 doda 3311 /* Device Status Report -> Ready */
1585 doda 3471 SendCSIstr("0n", 2);
1586 maya 3227 break;
1587     case 6:
1588     /* Cursor Position Report */
1589     Y = CursorY+1;
1590     if ((StatusLine>0) &&
1591     (Y==NumOfLines))
1592     Y = 1;
1593 doda 3471 len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%u;%uR", CLocale, Y, CursorX+1);
1594     SendCSIstr(Report, len);
1595 maya 3227 break;
1596     }
1597     }
1598    
1599     void CSSetAttr()
1600     {
1601     int i, P;
1602    
1603     UpdateStr();
1604     for (i=1 ; i<=NParam ; i++)
1605     {
1606     P = Param[i];
1607     if (P<0) P = 0;
1608     switch (P) {
1609     case 0: /* Clear all */
1610     CharAttr = DefCharAttr;
1611     BuffSetCurCharAttr(CharAttr);
1612     break;
1613    
1614     case 1: /* Bold */
1615     CharAttr.Attr |= AttrBold;
1616     BuffSetCurCharAttr(CharAttr);
1617     break;
1618    
1619     case 4: /* Under line */
1620     CharAttr.Attr |= AttrUnder;
1621     BuffSetCurCharAttr(CharAttr);
1622     break;
1623    
1624     case 5: /* Blink */
1625     CharAttr.Attr |= AttrBlink;
1626     BuffSetCurCharAttr(CharAttr);
1627     break;
1628    
1629     case 7: /* Reverse */
1630     CharAttr.Attr |= AttrReverse;
1631     BuffSetCurCharAttr(CharAttr);
1632     break;
1633    
1634     case 22: /* Bold off */
1635     CharAttr.Attr &= ~ AttrBold;
1636     BuffSetCurCharAttr(CharAttr);
1637     break;
1638    
1639     case 24: /* Under line off */
1640     CharAttr.Attr &= ~ AttrUnder;
1641     BuffSetCurCharAttr(CharAttr);
1642     break;
1643    
1644     case 25: /* Blink off */
1645     CharAttr.Attr &= ~ AttrBlink;
1646     BuffSetCurCharAttr(CharAttr);
1647     break;
1648    
1649     case 27: /* Reverse off */
1650     CharAttr.Attr &= ~ AttrReverse;
1651     BuffSetCurCharAttr(CharAttr);
1652     break;
1653    
1654     case 30:
1655     case 31:
1656     case 32:
1657     case 33:
1658     case 34:
1659     case 35:
1660     case 36:
1661     case 37: /* text color */
1662     CharAttr.Attr2 |= Attr2Fore;
1663     CharAttr.Fore = P - 30;
1664     BuffSetCurCharAttr(CharAttr);
1665     break;
1666    
1667     case 38: /* text color (256color mode) */
1668     if ((ts.ColorFlag & CF_XTERM256) && i < NParam && Param[i+1] == 5) {
1669     i++;
1670     if (i < NParam) {
1671     P = Param[++i];
1672     if (P<0) {
1673     P = 0;
1674     }
1675     CharAttr.Attr2 |= Attr2Fore;
1676     CharAttr.Fore = P;
1677     BuffSetCurCharAttr(CharAttr);
1678     }
1679     }
1680     break;
1681    
1682     case 39: /* Reset text color */
1683     CharAttr.Attr2 &= ~ Attr2Fore;
1684     CharAttr.Fore = AttrDefaultFG;
1685     BuffSetCurCharAttr(CharAttr);
1686     break;
1687    
1688     case 40:
1689     case 41:
1690     case 42:
1691     case 43:
1692     case 44:
1693     case 45:
1694     case 46:
1695     case 47: /* Back color */
1696     CharAttr.Attr2 |= Attr2Back;
1697     CharAttr.Back = P - 40;
1698     BuffSetCurCharAttr(CharAttr);
1699     break;
1700    
1701     case 48: /* Back color (256color mode) */
1702     if ((ts.ColorFlag & CF_XTERM256) && i < NParam && Param[i+1] == 5) {
1703     i++;
1704     if (i < NParam) {
1705     P = Param[++i];
1706     if (P<0) {
1707     P = 0;
1708     }
1709     CharAttr.Attr2 |= Attr2Back;
1710     CharAttr.Back = P;
1711     BuffSetCurCharAttr(CharAttr);
1712     }
1713     }
1714     break;
1715    
1716     case 49: /* Reset back color */
1717     CharAttr.Attr2 &= ~ Attr2Back;
1718     CharAttr.Back = AttrDefaultBG;
1719     BuffSetCurCharAttr(CharAttr);
1720     break;
1721    
1722     case 90:
1723     case 91:
1724     case 92:
1725     case 93:
1726     case 94:
1727     case 95:
1728     case 96:
1729     case 97: /* aixterm style text color */
1730     if (ts.ColorFlag & CF_AIXTERM16) {
1731     CharAttr.Attr2 |= Attr2Fore;
1732     CharAttr.Fore = P - 90 + 8;
1733     BuffSetCurCharAttr(CharAttr);
1734     }
1735     break;
1736    
1737     case 100:
1738     if (! (ts.ColorFlag & CF_AIXTERM16)) {
1739     /* Reset text and back color */
1740     CharAttr.Attr2 &= ~ (Attr2Fore | Attr2Back);
1741     CharAttr.Fore = AttrDefaultFG;
1742     CharAttr.Back = AttrDefaultBG;
1743     BuffSetCurCharAttr(CharAttr);
1744     break;
1745     }
1746     /* fall through to aixterm style back color */
1747    
1748     case 101:
1749     case 102:
1750     case 103:
1751     case 104:
1752     case 105:
1753     case 106:
1754     case 107: /* aixterm style back color */
1755     if (ts.ColorFlag & CF_AIXTERM16) {
1756     CharAttr.Attr2 |= Attr2Back;
1757     CharAttr.Back = P - 100 + 8;
1758     BuffSetCurCharAttr(CharAttr);
1759     }
1760     break;
1761     }
1762     }
1763     }
1764    
1765     void CSSetScrollRegion()
1766     {
1767     if ((StatusLine>0) &&
1768     (CursorY==NumOfLines-1))
1769     {
1770     MoveCursor(0,CursorY);
1771     return;
1772     }
1773     if (Param[1]<1) Param[1] =1;
1774     if ((NParam < 2) | (Param[2]<1))
1775     Param[2] = NumOfLines-StatusLine;
1776     Param[1]--;
1777     Param[2]--;
1778     if (Param[1] > NumOfLines-1-StatusLine)
1779     Param[1] = NumOfLines-1-StatusLine;
1780     if (Param[2] > NumOfLines-1-StatusLine)
1781     Param[2] = NumOfLines-1-StatusLine;
1782     if (Param[1] >= Param[2]) return;
1783     CursorTop = Param[1];
1784     CursorBottom = Param[2];
1785     if (RelativeOrgMode) MoveCursor(0,CursorTop);
1786     else MoveCursor(0,0);
1787     }
1788    
1789     void CSSunSequence() /* Sun terminal private sequences */
1790     {
1791 doda 3471 int x, y, len;
1792 doda 3487 char Report[TitleBuffSize*2+10];
1793 maya 3227
1794     switch (Param[1]) {
1795 doda 3302 case 1: // De-iconify window
1796 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE)
1797     DispShowWindow(WINDOW_RESTORE);
1798 doda 3302 break;
1799     case 2: // Iconify window
1800 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE)
1801     DispShowWindow(WINDOW_MINIMIZE);
1802 doda 3302 break;
1803     case 3: // set window position
1804 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE) {
1805     if (NParam < 2) Param[2] = 0;
1806     if (NParam < 3) Param[3] = 0;
1807     DispMoveWindow(Param[2], Param[3]);
1808     }
1809 doda 3297 break;
1810 doda 3466 case 4: // set window size
1811 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE) {
1812     if (NParam < 2) Param[2] = 0;
1813     if (NParam < 3) Param[3] = 0;
1814     DispResizeWin(Param[3], Param[2]);
1815     }
1816 doda 3464 break;
1817 doda 3311 case 5: // Raise window
1818 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE)
1819     DispShowWindow(WINDOW_RAISE);
1820 doda 3309 break;
1821 doda 3311 case 6: // Lower window
1822 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE)
1823     DispShowWindow(WINDOW_LOWER);
1824 doda 3309 break;
1825 doda 3311 case 7: // Refresh window
1826 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE)
1827     DispShowWindow(WINDOW_REFRESH);
1828 doda 3310 break;
1829 maya 3227 case 8: /* set terminal size */
1830 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE) {
1831     if ((Param[2]<=1) || (NParam<2)) Param[2] = 24;
1832     if ((Param[3]<=1) || (NParam<3)) Param[3] = 80;
1833     ChangeTerminalSize(Param[3],Param[2]);
1834     }
1835 maya 3227 break;
1836 doda 3302 case 9: // Maximize/Restore window
1837 doda 3485 if (ts.WindowFlag & WF_WINDOWCHANGE) {
1838     if (NParam < 2 || Param[2] == 0) {
1839     DispShowWindow(WINDOW_RESTORE);
1840     }
1841 doda 3489 else if (Param[2] == 1) {
1842 doda 3485 DispShowWindow(WINDOW_MAXIMIZE);
1843     }
1844 doda 3302 }
1845     break;
1846 doda 3466 case 11: // Report window state
1847 doda 3485 if (ts.WindowFlag & WF_WINDOWREPORT) {
1848     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "%dt", CLocale, DispWindowIconified()?2:1);
1849     SendCSIstr(Report, len);
1850     }
1851 doda 3466 break;
1852 doda 3469 case 13: // Report window position
1853 doda 3485 if (ts.WindowFlag & WF_WINDOWREPORT) {
1854     DispGetWindowPos(&x, &y);
1855     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "3;%d;%dt", CLocale, x, y);
1856     SendCSIstr(Report, len);
1857     }
1858 doda 3469 break;
1859 maya 3227 case 14: /* get window size??? */
1860 doda 3485 if (ts.WindowFlag & WF_WINDOWREPORT) {
1861     /* this is not actual window size */
1862     SendCSIstr("4;640;480t", 10);
1863     }
1864 maya 3227 break;
1865     case 18: /* get terminal size */
1866 doda 3485 if (ts.WindowFlag & WF_WINDOWREPORT) {
1867     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "8;%u;%u;t", CLocale,
1868     NumOfLines-StatusLine, NumOfColumns);
1869     SendCSIstr(Report, len);
1870     }
1871 maya 3227 break;
1872 doda 3475 case 19: // Report display size (character)
1873 doda 3485 if (ts.WindowFlag & WF_WINDOWREPORT) {
1874     DispGetRootWinSize(&x, &y);
1875     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "9;%d;%dt", CLocale, y, x);
1876     SendCSIstr(Report, len);
1877     }
1878 doda 3475 break;
1879 doda 3487 case 20: // Report icon label
1880     if (ts.WindowFlag & WF_TITLEREPORT) {
1881     switch (ts.AcceptTitleChangeRequest) {
1882     case IdTitleChangeRequestOff:
1883     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
1884     break;
1885     case IdTitleChangeRequestAhead:
1886     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, cv.TitleRemote, ts.Title);
1887     break;
1888     case IdTitleChangeRequestLast:
1889     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s %s", CLocale, ts.Title, cv.TitleRemote);
1890     break;
1891     default:
1892     if (cv.TitleRemote[0] == 0) {
1893     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, ts.Title);
1894     }
1895     else {
1896     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "L%s", CLocale, cv.TitleRemote);
1897     }
1898     }
1899     SendOSCstr(Report, len);
1900     }
1901     break;
1902     case 21: // Report window title
1903     if (ts.WindowFlag & WF_TITLEREPORT) {
1904     switch (ts.AcceptTitleChangeRequest) {
1905     case IdTitleChangeRequestOff:
1906     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
1907     break;
1908     case IdTitleChangeRequestAhead:
1909     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, cv.TitleRemote, ts.Title);
1910     break;
1911     case IdTitleChangeRequestLast:
1912     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s %s", CLocale, ts.Title, cv.TitleRemote);
1913     break;
1914     default:
1915     if (cv.TitleRemote[0] == 0) {
1916     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, ts.Title);
1917     }
1918     else {
1919     len = _snprintf_s_l(Report, sizeof(Report), _TRUNCATE, "l%s", CLocale, cv.TitleRemote);
1920     }
1921     }
1922     SendOSCstr(Report, len);
1923     }
1924     break;
1925 maya 3227 }
1926     }
1927    
1928     void CSGT(BYTE b)
1929     {
1930     switch (b) {
1931 doda 3311 case 'c': /* second terminal report (Secondary DA) */
1932 doda 3472 if (Param[1] < 1) {
1933     SendCSIstr(">32;10;2c", 9); /* VT382 */
1934     }
1935 maya 3227 break;
1936     case 'J':
1937     if (Param[1]==3) // IO-8256 terminal
1938     {
1939     if (Param[2]<1) Param[2]=1;
1940     if (Param[3]<1) Param[3]=1;
1941     if (Param[4]<1) Param[4]=1;
1942     if (Param[5]<1) Param[5]=1;
1943     BuffEraseBox(Param[3]-1,Param[2]-1,
1944     Param[5]-1,Param[4]-1);
1945     }
1946     break;
1947     case 'K':
1948     if ((NParam>=2) && (Param[1]==5))
1949     { // IO-8256 terminal
1950     switch (Param[2]) {
1951     case 3:
1952     case 4:
1953     case 5:
1954     case 6:
1955     BuffDrawLine(CharAttr, Param[2], Param[3]);
1956     break;
1957     case 12:
1958     /* Text color */
1959     if ((Param[3]>=0) && (Param[3]<=7))
1960     {
1961     switch (Param[3]) {
1962     case 3: CharAttr.Fore = IdBlue; break;
1963     case 4: CharAttr.Fore = IdCyan; break;
1964     case 5: CharAttr.Fore = IdYellow; break;
1965     case 6: CharAttr.Fore = IdMagenta; break;
1966     default: CharAttr.Fore = Param[3]; break;
1967     }
1968     CharAttr.Attr2 |= Attr2Fore;
1969     BuffSetCurCharAttr(CharAttr);
1970     }
1971     break;
1972     }
1973     }
1974     else if (Param[1]==3)
1975     {// IO-8256 terminal
1976     if (Param[2]<1) Param[2] = 1;
1977     if (Param[3]<1) Param[2] = 1;
1978     BuffEraseCharsInLine(Param[2]-1,Param[3]-Param[2]+1);
1979     }
1980     break;
1981     }
1982     }
1983    
1984     void CSQExchangeColor()
1985     {
1986     COLORREF ColorRef;
1987    
1988     BuffUpdateScroll();
1989    
1990     if (ts.ColorFlag & CF_REVERSECOLOR) {
1991     ColorRef = ts.VTColor[0];
1992     ts.VTColor[0] = ts.VTReverseColor[0];
1993     ts.VTReverseColor[0] = ColorRef;
1994     ColorRef = ts.VTColor[1];
1995     ts.VTColor[1] = ts.VTReverseColor[1];
1996     ts.VTReverseColor[1] = ColorRef;
1997     }
1998     else {
1999     ColorRef = ts.VTColor[0];
2000     ts.VTColor[0] = ts.VTColor[1];
2001     ts.VTColor[1] = ColorRef;
2002     }
2003    
2004     ColorRef = ts.VTBoldColor[0];
2005     ts.VTBoldColor[0] = ts.VTBoldColor[1];
2006     ts.VTBoldColor[1] = ColorRef;
2007    
2008     ColorRef = ts.VTBlinkColor[0];
2009     ts.VTBlinkColor[0] = ts.VTBlinkColor[1];
2010     ts.VTBlinkColor[1] = ColorRef;
2011    
2012     ColorRef = ts.URLColor[0];
2013     ts.URLColor[0] = ts.URLColor[1];
2014     ts.URLColor[1] = ColorRef;
2015    
2016     ts.ColorFlag ^= CF_REVERSEVIDEO;
2017    
2018     #ifdef ALPHABLEND_TYPE2
2019     BGInitialize();
2020     #endif
2021     DispChangeBackground();
2022     UpdateWindow(HVTWin);
2023     }
2024    
2025     void CSQ_h_Mode()
2026     {
2027     int i;
2028    
2029     for (i = 1 ; i<=NParam ; i++)
2030     switch (Param[i]) {
2031     case 1: AppliCursorMode = TRUE; break;
2032     case 3:
2033     ChangeTerminalSize(132,NumOfLines-StatusLine);
2034     break;
2035     case 5: /* Reverse Video */
2036     if (!(ts.ColorFlag & CF_REVERSEVIDEO))
2037     CSQExchangeColor(); /* Exchange text/back color */
2038     break;
2039     case 6:
2040 doda 3485 if ((StatusLine>0) && (CursorY==NumOfLines-1))
2041 maya 3227 MoveCursor(0,CursorY);
2042     else {
2043     RelativeOrgMode = TRUE;
2044     MoveCursor(0,CursorTop);
2045     }
2046     break;
2047     case 7: AutoWrapMode = TRUE; break;
2048     case 8: AutoRepeatMode = TRUE; break;
2049     case 9:
2050     if (ts.MouseEventTracking)
2051     MouseReportMode = IdMouseTrackX10;
2052     break;
2053 doda 3485 case 12:
2054     if (ts.WindowFlag & WF_CURSORCHANGE) {
2055     ts.NonblinkingCursor = FALSE;
2056     ChangeCaret();
2057     }
2058     break;
2059 maya 3227 case 19: PrintEX = TRUE; break;
2060     case 25: DispEnableCaret(TRUE); break; // cursor on
2061     case 38:
2062     if (ts.AutoWinSwitch>0)
2063     ChangeEmu = IdTEK; /* Enter TEK Mode */
2064     break;
2065     case 59:
2066     if (ts.Language==IdJapanese)
2067     { /* kanji terminal */
2068     Gn[0] = IdASCII;
2069     Gn[1] = IdKatakana;
2070     Gn[2] = IdKatakana;
2071     Gn[3] = IdKanji;
2072     Glr[0] = 0;
2073     if ((ts.KanjiCode==IdJIS) &&
2074     (ts.JIS7Katakana==0))
2075     Glr[1] = 2; // 8-bit katakana
2076     else
2077     Glr[1] = 3;
2078     }
2079     break;
2080     case 66: AppliKeyMode = TRUE; break;
2081     case 67: ts.BSKey = IdBS; break;
2082     case 1000:
2083     if (ts.MouseEventTracking)
2084     MouseReportMode = IdMouseTrackVT200;
2085     break;
2086     case 1001:
2087     if (ts.MouseEventTracking)
2088     MouseReportMode = IdMouseTrackVT200Hl;
2089     break;
2090     case 1002:
2091     if (ts.MouseEventTracking)
2092     MouseReportMode = IdMouseTrackBtnEvent;
2093     break;
2094     case 1003:
2095     if (ts.MouseEventTracking)
2096     MouseReportMode = IdMouseTrackAllEvent;
2097     break;
2098     case 1004:
2099     if (ts.MouseEventTracking)
2100     FocusReportMode = TRUE;
2101     break;
2102     }
2103     }
2104    
2105     void CSQ_i_Mode()
2106     {
2107     if (Param[1]==-1) Param[1] = 0;
2108     switch (Param[1]) {
2109     case 1:
2110     OpenPrnFile();
2111     BuffDumpCurrentLine(LF);
2112     if (! AutoPrintMode)
2113     ClosePrnFile();
2114     break;
2115     /* auto print mode off */
2116     case 4:
2117     if (AutoPrintMode)
2118     {
2119     ClosePrnFile();
2120     AutoPrintMode = FALSE;
2121     }
2122     break;
2123     /* auto print mode on */
2124     case 5:
2125     if (! AutoPrintMode)
2126     {
2127     OpenPrnFile();
2128     AutoPrintMode = TRUE;
2129     }
2130     break;
2131     }
2132     }
2133    
2134     void CSQ_l_Mode()
2135     {
2136     int i;
2137    
2138     for (i = 1 ; i <= NParam ; i++)
2139     switch (Param[i]) {
2140     case 1: AppliCursorMode = FALSE; break;
2141     case 3:
2142     ChangeTerminalSize(80,NumOfLines-StatusLine);
2143     break;
2144     case 5: /* Normal Video */
2145     if (ts.ColorFlag & CF_REVERSEVIDEO)
2146     CSQExchangeColor(); /* Exchange text/back color */
2147     break;
2148     case 6:
2149 doda 3485 if ((StatusLine>0) && (CursorY==NumOfLines-1))
2150 maya 3227 MoveCursor(0,CursorY);
2151     else {
2152     RelativeOrgMode = FALSE;
2153     MoveCursor(0,0);
2154     }
2155     break;
2156     case 7: AutoWrapMode = FALSE; break;
2157     case 8: AutoRepeatMode = FALSE; break;
2158     case 9: MouseReportMode = IdMouseTrackNone; break;
2159 doda 3485 case 12:
2160     if (ts.WindowFlag & WF_CURSORCHANGE) {
2161     ts.NonblinkingCursor = TRUE;
2162     ChangeCaret();
2163     }
2164     break;
2165 maya 3227 case 19: PrintEX = FALSE; break;
2166     case 25: DispEnableCaret(FALSE); break; // cursor off
2167     case 59:
2168     if (ts.Language==IdJapanese)
2169     { /* katakana terminal */
2170     Gn[0] = IdASCII;
2171     Gn[1] = IdKatakana;
2172     Gn[2] = IdKatakana;
2173     Gn[3] = IdKanji;
2174     Glr[0] = 0;
2175     if ((ts.KanjiCode==IdJIS) &&
2176     (ts.JIS7Katakana==0))
2177     Glr[1] = 2; // 8-bit katakana
2178     else
2179     Glr[1] = 3;
2180     }
2181     break;
2182     case 66: AppliKeyMode = FALSE; break;
2183     case 67: ts.BSKey = IdDEL; break;
2184     case 1000:
2185     case 1001:
2186     case 1002:
2187     case 1003: MouseReportMode = IdMouseTrackNone; break;
2188     case 1004: FocusReportMode = FALSE; break;
2189     }
2190     }
2191    
2192     void CSQ_n_Mode()
2193     {
2194     }
2195    
2196     void CSQuest(BYTE b)
2197     {
2198     switch (b) {
2199     case 'K': CSLineErase(); break;
2200     case 'h': CSQ_h_Mode(); break;
2201     case 'i': CSQ_i_Mode(); break;
2202     case 'l': CSQ_l_Mode(); break;
2203     case 'n': CSQ_n_Mode(); break;
2204     }
2205     }
2206    
2207     void SoftReset()
2208     // called by software-reset escape sequence handler
2209     {
2210     UpdateStr();
2211     AutoRepeatMode = TRUE;
2212     DispEnableCaret(TRUE); // cursor on
2213     InsertMode = FALSE;
2214     RelativeOrgMode = FALSE;
2215     AppliKeyMode = FALSE;
2216     AppliCursorMode = FALSE;
2217     if ((StatusLine>0) &&
2218     (CursorY == NumOfLines-1))
2219     MoveToMainScreen();
2220     CursorTop = 0;
2221     CursorBottom = NumOfLines-1-StatusLine;
2222     ResetCharSet();
2223    
2224     Send8BitMode = ts.Send8BitCtrl;
2225    
2226     /* Attribute */
2227     CharAttr = DefCharAttr;
2228     Special = FALSE;
2229     BuffSetCurCharAttr(CharAttr);
2230    
2231     // status buffers
2232     ResetSBuffers();
2233     }
2234    
2235     void CSExc(BYTE b)
2236     {
2237     switch (b) {
2238     case 'p':
2239     /* Software reset */
2240     SoftReset();
2241     break;
2242     }
2243     }
2244    
2245     void CSDouble(BYTE b)
2246     {
2247     switch (b) {
2248     case 'p':
2249     /* Select terminal mode (software reset) */
2250     SoftReset();
2251     if (NParam > 0) {
2252     switch (Param[1]) {
2253     case 61: // VT100 Mode
2254     Send8BitMode = FALSE; break;
2255     case 62: // VT200 Mode
2256     case 63: // VT300 Mode
2257     case 64: // VT400 Mode
2258     if (NParam > 1 && Param[2] == 1)
2259     Send8BitMode = FALSE;
2260     else
2261     Send8BitMode = TRUE;
2262     break;
2263     }
2264     }
2265     break;
2266     }
2267     }
2268    
2269     void CSDol(BYTE b)
2270     {
2271     switch (b) {
2272     case '}':
2273     if ((ts.TermFlag & TF_ENABLESLINE)==0) return;
2274     if (StatusLine==0) return;
2275     if ((Param[1]<1) && (CursorY==NumOfLines-1))
2276     MoveToMainScreen();
2277     else if ((Param[1]==1) && (CursorY<NumOfLines-1))
2278     MoveToStatusLine();
2279     break;
2280     case '~':
2281     if ((ts.TermFlag & TF_ENABLESLINE)==0) return;
2282     if (Param[1]<=1)
2283     HideStatusLine();
2284     else if ((StatusLine==0) && (Param[1]==2))
2285     ShowStatusLine(1); // show
2286     break;
2287     }
2288     }
2289    
2290 doda 3263 void CSSpace(BYTE b) {
2291     switch (b) {
2292     case 'q':
2293 doda 3485 if (ts.WindowFlag & WF_CURSORCHANGE) {
2294     if (NParam > 0) {
2295     if (Param[1] < 0) Param[1] = 0;
2296     switch (Param[1]) {
2297     case 0:
2298     case 1:
2299     ts.CursorShape = IdBlkCur;
2300     ts.NonblinkingCursor = FALSE;
2301     break;
2302     case 2:
2303     ts.CursorShape = IdBlkCur;
2304     ts.NonblinkingCursor = TRUE;
2305     break;
2306     case 3:
2307     ts.CursorShape = IdHCur;
2308     ts.NonblinkingCursor = FALSE;
2309     break;
2310     case 4:
2311     ts.CursorShape = IdHCur;
2312     ts.NonblinkingCursor = TRUE;
2313     break;
2314     case 5:
2315     ts.CursorShape = IdVCur;
2316     ts.NonblinkingCursor = FALSE;
2317     break;
2318     case 6:
2319     ts.CursorShape = IdVCur;
2320     ts.NonblinkingCursor = TRUE;
2321     break;
2322     default:
2323     return;
2324     }
2325     ChangeCaret();
2326 doda 3263 }
2327     }
2328     break;
2329     }
2330     }
2331    
2332 maya 3227 void PrnParseCS(BYTE b) // printer mode
2333     {
2334     ParseMode = ModeFirst;
2335     switch (ICount) {
2336     /* no intermediate char */
2337     case 0:
2338     switch (Prv) {
2339     /* no private parameter */
2340     case 0:
2341     switch (b) {
2342     case 'i':
2343     if (Param[1]==4)
2344     {
2345     PrinterMode = FALSE;
2346     // clear prn buff
2347     WriteToPrnFile(0,FALSE);
2348     if (! AutoPrintMode)
2349     ClosePrnFile();
2350     return;
2351     }
2352     break;
2353     } /* of case Prv=0 */
2354     break;
2355     }
2356     break;
2357     /* one intermediate char */
2358     case 1: break;
2359     } /* of case Icount */
2360    
2361     WriteToPrnFile(b,TRUE);
2362     }
2363    
2364     void ParseCS(BYTE b) /* b is the final char */
2365     {
2366     if (PrinterMode) { // printer mode
2367     PrnParseCS(b);
2368     return;
2369     }
2370    
2371     switch (ICount) {
2372     /* no intermediate char */
2373     case 0:
2374     switch (Prv) {
2375     /* no private parameter */
2376     case 0:
2377     switch (b) {
2378 doda 3311 // ISO/IEC 6429 / ECMA-48 Sequence
2379     case '@': CSInsertCharacter(); break; // ICH
2380     case 'A': CSCursorUp(); break; // CUU
2381     case 'B': CSCursorDown(); break; // CUD
2382     case 'C': CSCursorRight(); break; // CUF
2383     case 'D': CSCursorLeft(); break; // CUB
2384     case 'E': CSCursorDown1(); break; // CNL
2385     case 'F': CSCursorUp1(); break; // CPL
2386     case 'G': CSMoveToColumnN(); break; // CHA
2387     case 'H': CSMoveToXY(); break; // CUP
2388     case 'I': CSForwardTab(); break; // CHT
2389     case 'J': CSScreenErase(); break; // ED
2390     case 'K': CSLineErase(); break; // EL
2391     case 'L': CSInsertLine(); break; // IL
2392     case 'M': CSDeleteNLines(); break; // DL
2393     // case 'N': break; // EF -- Not support
2394     // case 'O': break; // EA -- Not support
2395     case 'P': CSDeleteCharacter(); break; // DCH
2396     // case 'Q': break; // SEE -- Not support
2397     // case 'R': break; // CPR -- Not support
2398     case 'S': CSScrollUP(); break; // SU
2399     case 'T': CSScrollDown(); break; // SD
2400     // case 'U': break; // NP -- Not support
2401     // case 'V': break; // PP -- Not support
2402     // case 'W': break; // CTC -- Not support
2403     case 'X': CSEraseCharacter(); break; // ECH
2404     // case 'Y': break; // CVT -- Not support
2405     case 'Z': CSBackwardTab(); break; // CBT
2406     // caes '[': break; // SRS -- Not support
2407     // caes '\\': break; // PTX -- Not support
2408     // caes ']': break; // SDS -- Not support
2409     // caes '^': break; // SIMD -- Not support
2410     case '`': CSMoveToColumnN(); break; // HPA
2411     case 'a': CSCursorRight(); break; // HPR
2412     // caes 'b': break; // REP -- Not support
2413     case 'c': AnswerTerminalType(); break; // DA
2414     case 'd': CSMoveToLineN(); break; // VPA
2415     case 'e': CSCursorUp(); break; // VPR
2416     case 'f': CSMoveToXY(); break; // HVP
2417     case 'g': CSDeleteTabStop(); break; // TBC
2418     case 'h': CS_h_Mode(); break; // SM
2419     case 'i': CS_i_Mode(); break; // MC
2420     // caes 'b': break; // HPB -- Not support
2421     // caes 'b': break; // VPB -- Not support
2422     case 'l': CS_l_Mode(); break; // RM
2423     case 'm': CSSetAttr(); break; // SGR
2424     case 'n': CS_n_Mode(); break; // DSR
2425     // caes 'o': break; // DAQ -- Not support
2426    
2427     // Private Sequence
2428     case 'r': CSSetScrollRegion(); break; // DECSTBM
2429     case 's': SaveCursor(); break; // SCP (Save cursor (ANSI.SYS/SCO?))
2430     case 't': CSSunSequence(); break; // DECSLPP / Window manipulation(dtterm?)
2431     case 'u': RestoreCursor(); break; // RCP (Restore cursor (ANSI.SYS/SCO))
2432 maya 3227 } /* of case Prv=0 */
2433     break;
2434     /* private parameter = '>' */
2435     case '>': CSGT(b); break;
2436     /* private parameter = '?' */
2437     case '?': CSQuest(b); break;
2438 doda 3311 } /* end of siwtch (Prv) */
2439 maya 3227 break;
2440     /* one intermediate char */
2441     case 1:
2442     switch (IntChar[1]) {
2443 doda 3263 /* intermediate char = ' ' */
2444     case ' ': CSSpace(b); break;
2445 maya 3227 /* intermediate char = '!' */
2446     case '!': CSExc(b); break;
2447     /* intermediate char = '"' */
2448     case '"': CSDouble(b); break;
2449     /* intermediate char = '$' */
2450     case '$': CSDol(b); break;
2451     }
2452     break;
2453     } /* of case Icount */
2454    
2455     ParseMode = ModeFirst;
2456     }
2457    
2458     void ControlSequence(BYTE b)
2459     {
2460     if ((b<=US) || (b>=0x80) && (b<=0x9F))
2461     ParseControl(b); /* ctrl char */
2462     else if ((b>=0x40) && (b<=0x7E))
2463     ParseCS(b); /* terminate char */
2464     else {
2465     if (PrinterMode)
2466     WriteToPrnFile(b,FALSE);
2467    
2468     if ((b>=0x20) && (b<=0x2F))
2469     { /* intermediate char */
2470     if (ICount<IntCharMax) ICount++;
2471     IntChar[ICount] = b;
2472     }
2473     else if ((b>=0x30) && (b<=0x39))
2474     {
2475     if (Param[NParam] < 0)
2476     Param[NParam] = 0;
2477     if (Param[NParam]<1000)
2478     Param[NParam] = Param[NParam]*10 + b - 0x30;
2479     }
2480     else if (b==0x3B)
2481     {
2482     if (NParam < NParamMax)
2483     {
2484     NParam++;
2485     Param[NParam] = -1;
2486     }
2487     }
2488     else if ((b>=0x3C) && (b<=0x3F))
2489     { /* private char */
2490     if (FirstPrm) Prv = b;
2491     }
2492     }
2493     FirstPrm = FALSE;
2494     }
2495    
2496     void DeviceControl(BYTE b)
2497     {
2498     if (ESCFlag && (b=='\\') || (b==ST && ts.KanjiCode!=IdSJIS))
2499     {
2500     ESCFlag = FALSE;
2501     ParseMode = SavedMode;
2502     return;
2503     }
2504    
2505     if (b==ESC)
2506     {
2507     ESCFlag = TRUE;
2508     return;
2509     }
2510     else ESCFlag = FALSE;
2511    
2512     if (b<=US)
2513     ParseControl(b);
2514     else if ((b>=0x30) && (b<=0x39))
2515     {
2516     if (Param[NParam] < 0) Param[NParam] = 0;
2517     if (Param[NParam]<1000)
2518     Param[NParam] = Param[NParam]*10 + b - 0x30;
2519     }
2520     else if (b==0x3B)
2521     {
2522     if (NParam < NParamMax)
2523     {
2524     NParam++;
2525     Param[NParam] = -1;
2526     }
2527     }
2528     else if ((b>=0x40) && (b<=0x7E))
2529     {
2530     if (b=='|')
2531     {
2532     ParseMode = ModeDCUserKey;
2533     if (Param[1] < 1) ClearUserKey();
2534     WaitKeyId = TRUE;
2535     NewKeyId = 0;
2536     }
2537     else ParseMode = ModeSOS;
2538     }
2539     }
2540    
2541     void DCUserKey(BYTE b)
2542     {
2543     if (ESCFlag && (b=='\\') || (b==ST && ts.KanjiCode!=IdSJIS))
2544     {
2545     if (! WaitKeyId) DefineUserKey(NewKeyId,NewKeyStr,NewKeyLen);
2546     ESCFlag = FALSE;
2547     ParseMode = SavedMode;
2548     return;
2549     }
2550    
2551     if (b==ESC)
2552     {
2553     ESCFlag = TRUE;
2554     return;
2555     }
2556     else ESCFlag = FALSE;
2557    
2558     if (WaitKeyId)
2559     {
2560     if ((b>=0x30) && (b<=0x39))
2561     {
2562     if (NewKeyId<1000)
2563     NewKeyId = NewKeyId*10 + b - 0x30;
2564     }
2565     else if (b==0x2F)
2566     {
2567     WaitKeyId = FALSE;
2568     WaitHi = TRUE;
2569     NewKeyLen = 0;
2570     }
2571     }
2572     else {
2573     if (b==0x3B)
2574     {
2575     DefineUserKey(NewKeyId,NewKeyStr,NewKeyLen);
2576     WaitKeyId = TRUE;
2577     NewKeyId = 0;
2578     }
2579     else {
2580     if (NewKeyLen < FuncKeyStrMax)
2581     {
2582     if (WaitHi)
2583     {
2584     NewKeyStr[NewKeyLen] = ConvHexChar(b) << 4;
2585     WaitHi = FALSE;
2586     }
2587     else {
2588     NewKeyStr[NewKeyLen] = NewKeyStr[NewKeyLen] +
2589     ConvHexChar(b);
2590     WaitHi = TRUE;
2591     NewKeyLen++;
2592     }
2593     }
2594     }
2595