Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/vtterm.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6841 - (hide annotations) (download) (as text)
Tue Jul 4 15:02:28 2017 UTC (6 years, 9 months ago) by doda
Original Path: trunk/teraterm/teraterm/vtterm.c
File MIME type: text/x-csrc
File size: 134612 byte(s)
TeraTerm Project としてのライセンス表記を追加

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