| 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 その他 |
| 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 |