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 3489 - (hide annotations) (download) (as text)
Mon Jun 15 06:47:40 2009 UTC (14 years, 9 months ago) by doda
Original Path: trunk/teraterm/teraterm/vtterm.c
File MIME type: text/x-csrc
File size: 82626 byte(s)
ウィンドウ最大化制御シーケンスで、パラメータが0,1以外の時には処理を行わないように変更。
# 画面サイズ報告シーケンスの応答がエコーバックされた時に反応していたため

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