Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3904 - (hide annotations) (download) (as text)
Sat May 22 06:57:02 2010 UTC (13 years, 10 months ago) by doda
File MIME type: text/x-csrc
File size: 86299 byte(s)
ファイル送信も Bracketed Paste Mode の適用対象に。

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