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

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