Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3743 - (show annotations) (download) (as text)
Wed Jan 27 22:20:42 2010 UTC (14 years, 2 months ago) by doda
File MIME type: text/x-csrc
File size: 84094 byte(s)
Alternate Screen Bufferに対応。

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