Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/teraterm/ttpcmn/ttcmn.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9306 by zmatsuo, Sat Jun 12 15:29:32 2021 UTC revision 9311 by zmatsuo, Fri Jun 18 16:05:10 2021 UTC
# Line 918  int WINAPI CommBinaryBuffOut(PComVar cv, Line 918  int WINAPI CommBinaryBuffOut(PComVar cv,
918          return i;          return i;
919  }  }
920    
 // 内部コード(CodePage)をUTF-8へ出力する  
 static int OutputTextUTF8(WORD K, char *TempStr, PComVar cv)  
 {  
         int CodePage = *cv->CodePage;  
         unsigned int code;  
         int outlen;  
   
         code = MBCP_UTF32(K, CodePage);  
         if (code == 0) {  
                 // 変換失敗  
                 code = 0xfffd; // U+FFFD: Replacement Character  
         }  
         outlen = UTF32ToUTF8(code, TempStr, 4);  
         return outlen;  
 }  
   
 static int __isleadbyte_l(int d, PComVar cv)  
 {  
         int CodePage = *cv->CodePage;  
         return IsDBCSLeadByteEx(CodePage, d);  
 }  
   
 //  
 // MBCSから各種漢字コードへ変換して出力する。  
 //  
 static int TextOutMBCS(PComVar cv, PCHAR B, int C)  
 {  
         int i, TempLen;  
         WORD K;  
         char TempStr[12];  
         BYTE d;  
         BOOL Full;  
         int SendCodeNew;        // 送信コード  
         BOOL KanjiFlagNew;      // TRUE=次の文字と合わせて漢字とする  
   
         Full = FALSE;  
         i = 0;  
         while (! Full && (i < C)) {  
                 TempLen = 0;  
                 d = (BYTE)B[i];  
                 SendCodeNew = cv->SendCode;  
                 KanjiFlagNew = FALSE;  
   
                 if (cv->SendKanjiFlag) {  
                         SendCodeNew = IdKanji;  
   
                         K = (cv->SendKanjiFirst << 8) + d;  
   
                         // UTF-8への変換を行う。1〜3バイトまでの対応なので注意。  
                         if (cv->KanjiCodeSend == IdUTF8 || cv->Language == IdUtf8) {  
                                 TempLen += OutputTextUTF8(K, TempStr, cv);  
                         }  
                         else {  
                                 switch (cv->Language) {  
                                   case IdJapanese:  
                                         switch (cv->KanjiCodeSend) {  
                                           case IdEUC:  
                                                 K = SJIS2EUC(K);  
                                                 break;  
                                           case IdJIS:  
                                                 K = SJIS2JIS(K);  
                                                 if ((cv->SendCode==IdKatakana) &&  
                                                     (cv->JIS7KatakanaSend==1)) {  
                                                         TempStr[TempLen++] = SI;  
                                                 }  
                                                 break;  
                                           case IdSJIS:  
                                                 /* nothing to do */  
                                                 break;  
                                         }  
                                         break;  
                                   case IdKorean:  
                                         break;  
                                 }  
                                 TempStr[TempLen++] = HIBYTE(K);  
                                 TempStr[TempLen++] = LOBYTE(K);  
                         }  
                 }  
                 else if (__isleadbyte_l(d, cv)) {  
                         KanjiFlagNew = TRUE;  
                         cv->SendKanjiFirst = d;  
                         SendCodeNew = IdKanji;  
   
                         if (cv->Language == IdJapanese) {  
                                 if ((cv->SendCode!=IdKanji) && (cv->KanjiCodeSend==IdJIS)) {  
                                         TempStr[0] = 0x1B;  
                                         TempStr[1] = '$';  
                                         if (cv->KanjiIn == IdKanjiInB) {  
                                                 TempStr[2] = 'B';  
                                         }  
                                         else {  
                                                 TempStr[2] = '@';  
                                         }  
                                         TempLen = 3;  
                                 }  
                         }  
                 }  
                 else {  
                         if (cv->Language == IdJapanese) {  
                                 if ((cv->SendCode==IdKanji) && (cv->KanjiCodeSend==IdJIS)) {  
                                         TempStr[0] = 0x1B;  
                                         TempStr[1] = '(';  
                                         switch (cv->KanjiOut) {  
                                           case IdKanjiOutJ:  
                                                 TempStr[2] = 'J';  
                                                 break;  
                                           case IdKanjiOutH:  
                                                 TempStr[2] = 'H';  
                                                 break;  
                                           default:  
                                                 TempStr[2] = 'B';  
                                         }  
                                         TempLen = 3;  
                                 }  
   
                                 if ((0xa0<d) && (d<0xe0)) {  
                                         SendCodeNew = IdKatakana;  
                                         if ((cv->SendCode!=IdKatakana) &&  
                                             (cv->KanjiCodeSend==IdJIS) &&  
                                             (cv->JIS7KatakanaSend==1)) {  
                                                 TempStr[TempLen++] = SO;  
                                         }  
                                 }  
                                 else {  
                                         SendCodeNew = IdASCII;  
                                         if ((cv->SendCode==IdKatakana) &&  
                                             (cv->KanjiCodeSend==IdJIS) &&  
                                             (cv->JIS7KatakanaSend==1)) {  
                                                 TempStr[TempLen++] = SI;  
                                         }  
                                 }  
                         }  
   
                         if (d==CR) {  
                                 TempStr[TempLen++] = 0x0d;  
                                 if (cv->CRSend==IdCRLF) {  
                                         TempStr[TempLen++] = 0x0a;  
                                 }  
                                 else if ((cv->CRSend==IdCR) &&  
                                           cv->TelFlag && ! cv->TelBinSend) {  
                                         TempStr[TempLen++] = 0;  
                                 }  
                                 else if (cv->CRSend == IdLF) {  
                                         TempStr[TempLen-1] = 0x0a;  
                                 }  
                                 if (cv->TelLineMode) {  
                                         cv->Flush = TRUE;  
                                 }  
                         }  
                         else if (d==BS) {  
                                 if (cv->TelLineMode) {  
                                         if (cv->FlushLen < cv->LineModeBuffCount) {  
                                                 cv->LineModeBuffCount--;  
                                         }  
                                 }  
                                 else {  
                                         TempStr[TempLen++] = d;  
                                 }  
                         }  
                         else if (d==0x15) { // Ctrl-U  
                                 if (cv->TelLineMode) {  
                                         cv->LineModeBuffCount = cv->FlushLen;  
                                 }  
                                 else {  
                                         TempStr[TempLen++] = d;  
                                 }  
                         }  
                         else if ((d>=0x80) && (cv->KanjiCodeSend==IdUTF8 || cv->Language==IdUtf8)) {  
                                 TempLen += OutputTextUTF8((WORD)d, TempStr, cv);  
                         }  
                         else if ((d>=0xa1) && (d<=0xe0) && (cv->Language == IdJapanese)) {  
                                 /* Katakana */  
                                 if (cv->KanjiCodeSend==IdEUC) {  
                                         TempStr[TempLen++] = (char)SS2;  
                                 }  
                                 if ((cv->KanjiCodeSend==IdJIS) &&  
                                         (cv->JIS7KatakanaSend==1)) {  
                                         TempStr[TempLen++] = d & 0x7f;  
                                 }  
                                 else {  
                                         TempStr[TempLen++] = d;  
                                 }  
                         }  
                         else {  
                                 TempStr[TempLen++] = d;  
                                 if (cv->TelFlag && (d==0xff)) {  
                                         TempStr[TempLen++] = (char)0xff;  
                                 }  
                         }  
                 } // if (cv->SendKanjiFlag) else if ... else ... end  
   
                 if (WriteOutBuff(cv, TempStr, TempLen)) {  
                         i++;    // 1文字処理した  
                         // 漢字の状態を保存する  
                         cv->SendCode = SendCodeNew;  
                         cv->SendKanjiFlag = KanjiFlagNew;  
                 } else {  
                         Full = TRUE;  
                 }  
   
         } // end of "while {}"  
   
         return i;  
 }  
   
 int WINAPI CommTextOut(PComVar cv, PCHAR B, int C)  
 {  
         int i, TempLen;  
         char TempStr[12];  
         BYTE d;  
         BOOL Full;  
   
         if (! cv->Ready ) {  
                 return C;  
         }  
   
         switch (cv->Language) {  
           case IdUtf8:  
           case IdJapanese:  
           case IdKorean:  
                 return TextOutMBCS(cv, B, C);  
                 break;  
         }  
   
         Full = FALSE;  
         i = 0;  
         while (! Full && (i < C)) {  
                 TempLen = 0;  
                 d = (BYTE)B[i];  
   
                 switch (d) {  
                   case CR:  
                         TempStr[TempLen] = 0x0d;  
                         TempLen++;  
                         if (cv->CRSend==IdCRLF) {  
                                 TempStr[TempLen++] = 0x0a;  
                         }  
                         else if (cv->CRSend==IdCR && cv->TelFlag && ! cv->TelBinSend) {  
                                 TempStr[TempLen++] = 0;  
                         }  
                         else if (cv->CRSend == IdLF) {  
                                 TempStr[TempLen-1] = 0x0a;  
                         }  
                         if (cv->TelLineMode) {  
                                 cv->Flush = TRUE;  
                         }  
                         break;  
   
                   case BS:  
                         if (cv->TelLineMode) {  
                                 if (cv->FlushLen < cv->LineModeBuffCount) {  
                                         cv->LineModeBuffCount--;  
                                 }  
                         }  
                         else {  
                                 TempStr[TempLen++] = d;  
                         }  
                         break;  
   
                   case 0x15: // Ctrl-U  
                         if (cv->TelLineMode) {  
                                 cv->LineModeBuffCount = cv->FlushLen;  
                         }  
                         else {  
                                 TempStr[TempLen++] = d;  
                         }  
                         break;  
   
                   default:  
                         if ((cv->Language==IdRussian) && (d>=128)) {  
                                 d = RussConv(cv->RussClient, cv->RussHost, d);  
                         }  
                         TempStr[TempLen++] = d;  
                         if (cv->TelFlag && (d==0xff)) {  
                                 TempStr[TempLen++] = (char)0xff;  
                         }  
                 }  
   
                 if (WriteOutBuff(cv, TempStr, TempLen)) {  
                         i++;    // 1文字処理した  
                 } else {  
                         Full = TRUE;  
                 }  
   
         } // end of while {}  
   
         return i;  
 }  
   
921  /**  /**
922   *      @retval true    日本語の半角カタカナ   *      @retval true    日本語の半角カタカナ
923   *      @retval false   その他   *      @retval false   その他
# Line 1631  int WINAPI CommBinaryEcho(PComVar cv, PC Line 1342  int WINAPI CommBinaryEcho(PComVar cv, PC
1342          return i;          return i;
1343  }  }
1344    
 static int WINAPI TextEchoMBCS(PComVar cv, PCHAR B, int C)  
 {  
         int i, TempLen;  
         WORD K;  
         char TempStr[12];  
         int EchoCodeNew;  
         BYTE d;  
         BOOL Full, KanjiFlagNew;  
   
         Full = FALSE;  
         i = 0;  
         while (! Full && (i < C)) {  
                 TempLen = 0;  
                 d = (BYTE)B[i];  
                 EchoCodeNew = cv->EchoCode;  
                 KanjiFlagNew = FALSE;  
   
                 if (cv->EchoKanjiFlag) {  
                         EchoCodeNew = IdKanji;  
   
                         K = (cv->EchoKanjiFirst << 8) + d;  
   
                         // UTF-8への変換を行う。1〜3バイトまでの対応なので注意。  
                         if (cv->KanjiCodeEcho == IdUTF8 || cv->Language==IdUtf8) {  
                                 TempLen += OutputTextUTF8(K, TempStr, cv);  
                         }  
                         else {  
                                 switch (cv->Language) {  
                                   case IdJapanese:  
                                         switch (cv->KanjiCodeEcho) {  
                                           case IdEUC:  
                                                 K = SJIS2EUC(K);  
                                                 break;  
                                           case IdJIS:  
                                                 K = SJIS2JIS(K);  
                                                 if ((cv->EchoCode==IdKatakana) &&  
                                                     (cv->JIS7KatakanaEcho==1)) {  
                                                         TempStr[TempLen++] = SI;  
                                                 }  
                                                 break;  
                                           case IdSJIS:  
                                                 /* nothing to do */  
                                                 break;  
                                         }  
                                         break;  
                                   case IdKorean:  
                                         break;  
                                 }  
                                 TempStr[TempLen++] = HIBYTE(K);  
                                 TempStr[TempLen++] = LOBYTE(K);  
                         }  
                 }  
                 else if (__isleadbyte_l(d, cv)) {  
                         KanjiFlagNew = TRUE;  
                         cv->EchoKanjiFirst = d;  
                         EchoCodeNew = IdKanji;  
   
                         if (cv->Language == IdJapanese) {  
                                 if ((cv->EchoCode!=IdKanji) && (cv->KanjiCodeEcho==IdJIS)) {  
                                         TempStr[0] = 0x1B;  
                                         TempStr[1] = '$';  
                                         if (cv->KanjiIn == IdKanjiInB) {  
                                                 TempStr[2] = 'B';  
                                         }  
                                         else {  
                                                 TempStr[2] = '@';  
                                         }  
                                         TempLen = 3;  
                                 }  
                         }  
                 }  
                 else {  
                         if (cv->Language == IdJapanese) {  
                                 if ((cv->EchoCode==IdKanji) && (cv->KanjiCodeEcho==IdJIS)) {  
                                         TempStr[0] = 0x1B;  
                                         TempStr[1] = '(';  
                                         switch (cv->KanjiOut) {  
                                           case IdKanjiOutJ:  
                                                 TempStr[2] = 'J';  
                                                 break;  
                                           case IdKanjiOutH:  
                                                 TempStr[2] = 'H';  
                                                 break;  
                                           default:  
                                                 TempStr[2] = 'B';  
                                         }  
                                         TempLen = 3;  
                                 }  
   
                                 if ((0xa0<d) && (d<0xe0)) {  
                                         EchoCodeNew = IdKatakana;  
                                         if ((cv->EchoCode!=IdKatakana) &&  
                                             (cv->KanjiCodeEcho==IdJIS) &&  
                                             (cv->JIS7KatakanaEcho==1)) {  
                                                 TempStr[TempLen++] = SO;  
                                         }  
                                 }  
                                 else {  
                                         EchoCodeNew = IdASCII;  
                                         if ((cv->EchoCode==IdKatakana) &&  
                                             (cv->KanjiCodeEcho==IdJIS) &&  
                                             (cv->JIS7KatakanaEcho==1)) {  
                                                 TempStr[TempLen++] = SI;  
                                         }  
                                 }  
                         }  
   
                         if (d==CR) {  
                                 TempStr[TempLen++] = 0x0d;  
                                 if (cv->CRSend==IdCRLF) {  
                                         TempStr[TempLen++] = 0x0a;  
                                 }  
                                 else if ((cv->CRSend==IdCR) &&  
                                           cv->TelFlag && ! cv->TelBinSend) {  
                                         TempStr[TempLen++] = 0;  
                                 }  
                                 else if (cv->CRSend == IdLF) {  
                                         TempStr[TempLen-1] = 0x0a;  
                                 }  
                         }  
                         else if (d==0x15) { // Ctrl-U  
                                 if (cv->TelLineMode) {  
                                         // Move to top of line (CHA "\033[G") and erase line (EL "\033[K")  
                                         strncpy_s(TempStr, sizeof(TempStr), "\033[G\033[K", _TRUNCATE);  
                                         TempLen += 6;  
                                 }  
                                 else {  
                                         TempStr[TempLen++] = d;  
                                 }  
                         }  
                         else if ((d>=0x80) && (cv->KanjiCodeEcho==IdUTF8 || cv->Language==IdUtf8)) {  
                                 TempLen += OutputTextUTF8((WORD)d, TempStr, cv);  
                         }  
                         else if ((d>=0xa1) && (d<=0xe0) && (cv->Language == IdJapanese)) {  
                                 /* Katakana */  
                                 if (cv->KanjiCodeEcho==IdEUC) {  
                                         TempStr[TempLen++] = (char)SS2;  
                                 }  
                                 if ((cv->KanjiCodeEcho==IdJIS) &&  
                                         (cv->JIS7KatakanaEcho==1)) {  
                                         TempStr[TempLen++] = d & 0x7f;  
                                 }  
                                 else {  
                                         TempStr[TempLen++] = d;  
                                 }  
                         }  
                         else {  
                                 TempStr[TempLen++] = d;  
                                 if (cv->TelFlag && (d==0xff)) {  
                                         TempStr[TempLen++] = (char)0xff;  
                                 }  
                         }  
                 } // if (cv->EchoKanjiFlag) else if ... else ... end  
   
                 if (WriteInBuff(cv, TempStr, TempLen)) {  
                         i++;  
                         cv->EchoCode = EchoCodeNew;  
                         cv->EchoKanjiFlag = KanjiFlagNew;  
                 } else {  
                         Full = FALSE;  
                 }  
   
         } // end of "while {}"  
   
         return i;  
 }  
   
 int WINAPI CommTextEcho(PComVar cv, PCHAR B, int C)  
 {  
         int i, TempLen;  
         char TempStr[11];  
         BYTE d;  
         BOOL Full;  
   
         if ( ! cv->Ready ) {  
                 return C;  
         }  
   
         PackInBuff(cv);  
   
         switch (cv->Language) {  
           case IdUtf8:  
           case IdJapanese:  
           case IdKorean:  
                 return TextEchoMBCS(cv,B,C);  
                 break;  
         }  
   
         Full = FALSE;  
         i = 0;  
         while (! Full && (i < C)) {  
                 TempLen = 0;  
                 d = (BYTE)B[i];  
   
                 switch (d) {  
                   case CR:  
                         TempStr[TempLen] = 0x0d;  
                         TempLen++;  
                         if (cv->CRSend==IdCRLF) {  
                                 TempStr[TempLen++] = 0x0a;  
                         }  
                         else if (cv->CRSend==IdCR && cv->TelFlag && ! cv->TelBinSend) {  
                                 TempStr[TempLen++] = 0;  
                         }  
                         else if (cv->CRSend == IdLF) {  
                                 TempStr[TempLen-1] = 0x0a;  
                         }  
                         break;  
   
                   case 0x15: // Ctrl-U  
                         if (cv->TelLineMode) {  
                                 // Move to top of line (CHA "\033[G") and erase line (EL "\033[K")  
                                 strncpy_s(TempStr, sizeof(TempStr), "\033[G\033[K", _TRUNCATE);  
                                 TempLen += 6;  
                         }  
                         else {  
                                 TempStr[TempLen++] = d;  
                         }  
                         break;  
   
                   default:  
                         if ((cv->Language==IdRussian) && (d>=128)) {  
                                 d = RussConv(cv->RussClient,cv->RussHost,d);  
                         }  
                         TempStr[TempLen++] = d;  
                         if (cv->TelFlag && (d==0xff)) {  
                                 TempStr[TempLen++] = (char)0xff;  
                         }  
                 }  
   
                 if(WriteInBuff(cv, TempStr,TempLen)) {  
                         i++;  
                 } else {  
                         Full = TRUE;  
                 }  
         } // end of while {}  
   
         return i;  
 }  
   
1345  /*  /*
1346   *      @return         エラーが有る場合 FALSE   *      @return         エラーが有る場合 FALSE
1347   *      @param[in]      BOOL first_instance   *      @param[in]      BOOL first_instance

Legend:
Removed from v.9306  
changed lines
  Added in v.9311

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26