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 3446 - (hide annotations) (download) (as text)
Sun Jun 7 08:39:00 2009 UTC (14 years, 10 months ago) by doda
File MIME type: text/x-csrc
File size: 79227 byte(s)
UTF-8で2バイトになる文字の表示が遅れるのを修正。

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