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 3407 - (hide annotations) (download) (as text)
Mon May 18 05:45:05 2009 UTC (14 years, 10 months ago) by doda
Original Path: trunk/teraterm/teraterm/vtterm.c
File MIME type: text/x-csrc
File size: 78111 byte(s)
Language=UTF-8対応

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