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

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