📄 cmemory.cpp
字号:
pszWork = new char [nWorkLen + 1];
// memset( pszWork, 0, nWorkLen + 1 );
memcpy( pszWork, &pBuf[nBgn], nWorkLen );
pszWork[nWorkLen] = '\0';
// Base64デコード
nWorkLen = MemBASE64_Decode( (unsigned char *)pszWork, nWorkLen );
pszWork[nWorkLen] = '\0';
if( 0 == nWorkLen % 2 ){
/* Unicodeは2バイト単位 */
pcmemWork->SetData( pszWork, nWorkLen );
/* コード変換 UnicodeBE→SJIS */
pcmemWork->UnicodeBEToSJIS();
memcpy( &pDes[k], pcmemWork->m_pData, pcmemWork->m_nDataLen );
k += pcmemWork->m_nDataLen; // Oct. 10, 2000 genta
// Oct. 10, 2000 genta
// '-'はBase64部の終わりを示す記号
// それ以外はBase64の終わりを示すと同時に有意な文字列
if( i < nBufLen && '-' != pBuf[i] )
--i;
}else{
bSuccess = FALSE;
}
delete [] pszWork;
pszWork = NULL;
}else{
bSuccess = FALSE;
}
if( FALSE == bSuccess ){
if( i < nBufLen ){
nWorkLen = i - nBgn + 2;
}else{ // pBuf[nBufLen] は無効
nWorkLen = i - nBgn + 1;
}
memcpy( &pDes[k], &pBuf[nBgn - 1], nWorkLen );
k += nWorkLen;
}
bBASE64 = FALSE;
}
}
}
pDes[k] = '\0';
SetData( (const char *)pDes, k );
delete [] pDes;
delete pcmemWork;
return;
}
/*!
Unicodeの文字がUTF-7で直接エンコードできるか調べる
@author Moca
@date 2002.10.25 新規作成
TAB SP CR LF は 直接エンコード可能
基本セット
'(),-./012...789:?ABC...XYZabc...xyz
以下はオプションでメールでは支障をきたす場合がある
!"#$%&*;<=>@[\]^_`{|}
とりあえず無条件でオプションは直接変換できないと判断する
*/
int CMemory::IsUTF7Direct( wchar_t wc ){
if( L'z' < wc ){ // パフォーマンス
}else
if( L'a' <= wc && L'z' >= wc ||
L'A' <= wc && L'Z' >= wc ||
L',' <= wc && L':' >= wc ||
L'\'' <= wc && L')' >= wc ||
L'?' == wc ||
L'\x20' == wc || // SP
L'\x09' == wc || // TAB
L'\x0d' == wc || // CR
L'\x0a' == wc // LF
)
{
return 1;
}
return 0;
}
/*! コード変換 Unicode→UTF-7
@date 2002.10.25 Moca UTF-7で直接エンコードできる文字をRFCに合わせて制限した
*/
void CMemory::UnicodeToUTF7( void )
{
wchar_t* pUniBuf;
// int nBufLen = m_nDataLen;
int nUniBufLen = m_nDataLen / sizeof(wchar_t);
int i;
int j;
unsigned char* pDes;
int k;
BOOL bBASE64;
// char mbchar[4];
int nBgn;
char* pszBase64Buf;
int nBase64BufLen;
char* pszWork;
char cWork;
// setlocale( LC_ALL, "Japanese" ); // wctomb を使わなくなったためコメントアウト
k = 0;
bBASE64 = FALSE;
nBgn = 0;
pUniBuf = new wchar_t[nUniBufLen + 1];
// memset( pUniBuf, 0, (nUniBufLen + 1) * sizeof( wchar_t ) );
memcpy( pUniBuf, m_pData, nUniBufLen * sizeof( wchar_t ) );
pUniBuf[nUniBufLen] = L'\0';
for( i = 0; i < nUniBufLen; ++i ){
j = IsUTF7Direct( pUniBuf[i]);
if( !bBASE64 ){
if( 1 == j ){
k++;
}else
if( L'+' == pUniBuf[i] ){
k += 2;
}else{
bBASE64 = TRUE;
nBgn = i;
}
}else{
if( 1 == j ){
/* 2バイトのUnicodeがあるという前提でLO/HIバイトを交換 */
pszWork = (char*)(char*)&pUniBuf[nBgn];
for( j = 0; j < (int)((i - nBgn) * sizeof( wchar_t )); j += 2 ){
cWork = pszWork[j + 1];
pszWork[j + 1] = pszWork[j];
pszWork[j] = cWork;
}
/* Base64エンコード */
pszBase64Buf = NULL;
nBase64BufLen = 0;
nBase64BufLen = MemBASE64_Encode(
(char*)&pUniBuf[nBgn], // エンコード対象データ
(i - nBgn) * sizeof( wchar_t ), // エンコード対象データ長
&pszBase64Buf, // 結果データ格納メモリポインタのアドレス
-1, // エンコード後のデータを自動的にCRLFで折り返す場合の1行最大文字数 (-1が指定された場合は折り返さない)
FALSE // パディングするか
);
// MYTRACE( "pszBase64Buf=[%s]\n", pszBase64Buf );
//////////////
k++;
k += nBase64BufLen;
k++;
//////////////
delete [] pszBase64Buf;
pszBase64Buf = NULL;
nBase64BufLen = 0;
bBASE64 = FALSE;
i--;
}else{
}
}
}
if( bBASE64 && 0 < (i - nBgn) ){
/* 2バイトのUnicodeがあるという前提でLO/HIバイトを交換 */
pszWork = (char*)(char*)&pUniBuf[nBgn];
for( j = 0; j < (int)((i - nBgn) * sizeof( wchar_t )); j += 2 ){
cWork = pszWork[j + 1];
pszWork[j + 1] = pszWork[j];
pszWork[j] = cWork;
}
/* Base64エンコード */
pszBase64Buf = NULL;
nBase64BufLen = 0;
nBase64BufLen = MemBASE64_Encode(
(char*)&pUniBuf[nBgn], // エンコード対象データ
(i - nBgn) * sizeof( wchar_t ), // エンコード対象データ長
&pszBase64Buf, // 結果データ格納メモリポインタのアドレス
-1, // エンコード後のデータを自動的にCRLFで折り返す場合の1行最大文字数 (-1が指定された場合は折り返さない)
FALSE // パディングするか
);
// MYTRACE( "pszBase64Buf=[%s]\n", pszBase64Buf );
//////////////
k++;
k += nBase64BufLen;
k++;
//////////////
delete [] pszBase64Buf;
pszBase64Buf = NULL;
nBase64BufLen = 0;
bBASE64 = FALSE;
}
delete [] pUniBuf;
pDes = new unsigned char[k + 1];
memset( pDes, 0, k + 1 );
k = 0;
bBASE64 = FALSE;
nBgn = 0;
pUniBuf = (wchar_t*)m_pData;
for( i = 0; i < nUniBufLen; ++i ){
j = IsUTF7Direct( pUniBuf[i] );
if( !bBASE64 ){
if( 1 == j ){
pDes[k] = (unsigned char)(pUniBuf[i] & 0x007f);
k++;
}else
if( L'+' == pUniBuf[i] ){
pDes[k ] = '+';
pDes[k + 1] = '-';
k += 2;
}else{
bBASE64 = TRUE;
nBgn = i;
}
}else{
if( 1 == j ){
/* 2バイトのUnicodeがあるという前提でLO/HIバイトを交換 */
pszWork = (char*)(char*)&pUniBuf[nBgn];
for( j = 0; j < (int)((i - nBgn) * sizeof( wchar_t )); j += 2 ){
cWork = pszWork[j + 1];
pszWork[j + 1] = pszWork[j];
pszWork[j] = cWork;
}
char* pszBase64Buf;
int nBase64BufLen;
/* Base64エンコード */
nBase64BufLen = MemBASE64_Encode(
(char*)&pUniBuf[nBgn], // エンコード対象データ
(i - nBgn) * sizeof( wchar_t ), // エンコード対象データ長
&pszBase64Buf, // 結果データ格納メモリポインタのアドレス
-1, // エンコード後のデータを自動的にCRLFで折り返す場合の1行最大文字数 (-1が指定された場合は折り返さない)
FALSE // パディングするか
);
// MYTRACE( "pszBase64Buf=[%s]\n", pszBase64Buf );
//////////////
pDes[k] = '+';
k++;
memcpy( &pDes[k], pszBase64Buf, nBase64BufLen );
k += nBase64BufLen;
pDes[k] = '-';
k++;
//////////////
delete [] pszBase64Buf;
bBASE64 = FALSE;
i--;
}else{
}
}
}
if( bBASE64 && 0 < (i - nBgn) ){
/* 2バイトのUnicodeがあるという前提でLO/HIバイトを交換 */
pszWork = (char*)(char*)&pUniBuf[nBgn];
for( j = 0; j < (int)((i - nBgn) * sizeof( wchar_t )); j += 2 ){
cWork = pszWork[j + 1];
pszWork[j + 1] = pszWork[j];
pszWork[j] = cWork;
}
/* Base64エンコード */
pszBase64Buf = NULL;
nBase64BufLen = 0;
nBase64BufLen = MemBASE64_Encode(
(char*)&pUniBuf[nBgn], // エンコード対象データ
(i - nBgn) * sizeof( wchar_t ), // エンコード対象データ長
&pszBase64Buf, // 結果データ格納メモリポインタのアドレス
-1, // エンコード後のデータを自動的にCRLFで折り返す場合の1行最大文字数 (-1が指定された場合は折り返さない)
FALSE // パディングするか
);
// MYTRACE( "pszBase64Buf=[%s]\n", pszBase64Buf );
//////////////
pDes[k] = '+';
k++;
memcpy( &pDes[k], pszBase64Buf, nBase64BufLen );
k += nBase64BufLen;
pDes[k] = '-';
k++;
//////////////
delete [] pszBase64Buf;
pszBase64Buf = NULL;
nBase64BufLen = 0;
bBASE64 = FALSE;
}
SetData( (const char *)pDes, k );
delete [] pDes;
return;
}
/************************************************************************
*
* EUC全角コードの1バイト目ならTRUEをかえす
*
************************************************************************/
int CMemory::IsEUCKan1( unsigned char c )
{
/* EUC全角コードの1バイト目ならTRUEをかえす */
if( c >= 0xa1 && c <= 0xfe ){
return TRUE;
}
return FALSE;
}
/************************************************************************
*
* EUC全角コードの2バイト目ならTRUEをかえす
*
************************************************************************/
int CMemory::IsEUCKan2( unsigned char c )
{
/* EUC全角コードの2バイト目ならTRUEをかえす */
if( c >= 0xa1 && c <= 0xfe ){
return TRUE;
}
return FALSE;
}
/* 英大文字→英小文字 */
void CMemory::ToLower( void )
{
unsigned char* pBuf = (unsigned char*)m_pData;
int nBufLen = m_nDataLen;
int i;
int nCharChars;
unsigned char uc;
for( i = 0; i < nBufLen; ++i ){
nCharChars = CMemory::MemCharNext( (const char *)pBuf, nBufLen, (const char *)&(pBuf[i]) ) - (const char*)&(pBuf[i]);
if( nCharChars == 1 ){
uc = (unsigned char)tolower( pBuf[i] );
pBuf[i] = uc;
}else
if( nCharChars == 2 ){
/* 全角英大文字→全角英小文字 */
if( pBuf[i] == 0x82 && pBuf[i + 1] >= 0x60 && pBuf[i + 1] <= 0x79 ){
pBuf[i] = pBuf[i];
pBuf[i + 1] = pBuf[i + 1] + 0x21;
//@@@ 2001.02.03 Start by MIK: ギリシャ文字変換
//大文字:0x839f~0x83b6
//小文字:0x83bf~0x83d6
}else if( pBuf[i] == 0x83 && pBuf[i + 1] >= 0x9f && pBuf[i + 1] <= 0xb6 ){
pBuf[i] = pBuf[i];
pBuf[i + 1] = pBuf[i + 1] + 0x20;
//@@@ 2001.02.03 End
//@@@ 2001.02.03 Start by MIK: ロシア文字変換
//大文字:0x8440~0x8460
//小文字:0x8470~0x8491 0x847fがない!
}else if( pBuf[i] == 0x84 && pBuf[i + 1] >= 0x40 && pBuf[i + 1] <= 0x60 ){
pBuf[i] = pBuf[i];
if( pBuf[i + 1] >= 0x4f ){
pBuf[i + 1] = pBuf[i + 1] + 0x31;
}else{
pBuf[i + 1] = pBuf[i + 1] + 0x30;
}
//@@@ 2001.02.03 End
}
}
if( nCharChars > 0 ){
i += nCharChars - 1;
}
}
return;
}
/* 英小文字→英大文字 */
void CMemory::ToUpper( void )
{
unsigned char* pBuf = (unsigned char*)m_pData;
int nBufLen = m_nDataLen;
int i;
int nCharChars;
unsigned char uc;
for( i = 0; i < nBufLen; ++i ){
nCharChars = CMemory::MemCharNext( (const char *)pBuf, nBufLen, (const char *)&(pBuf[i]) ) - (const char*)&(pBuf[i]);
if( nCharChars == 1 ){
uc = (unsigned char)toupper( pBuf[i] );
pBuf[i] = uc;
}else
if( nCharChars == 2 ){
/* 全角英小文字→全角英大文字 */
if( pBuf[i] == 0x82 && pBuf[i + 1] >= 0x81 && pBuf[i + 1] <= 0x9a ){
pBuf[i] = pBuf[i];
pBuf[i + 1] = pBuf[i + 1] - 0x21;
//@@@ 2001.02.03 Start by MIK: ギリシャ文字変換
//大文字:0x839f~0x83b6
//小文字:0x83bf~0x83d6
}else if( pBuf[i] == 0x83 && pBuf[i + 1] >= 0xbf && pBuf[i + 1] <= 0xd6 ){
pBuf[i] = pBuf[i];
pBuf[i + 1] = pBuf[i + 1] - 0x20;
//@@@ 2001.02.03 End
//@@@ 2001.02.03 Start by MIK: ロシア文字変換
//大文字:0x8440~0x8460
//小文字:0x8470~0x8491 0x847fがない!
}else if( pBuf[i] == 0x84 && pBuf[i + 1] >= 0x70 && pBuf[i + 1] <= 0x91 && pBuf[i + 1] != 0x7f ){
pBuf[i] = pBuf[i];
if( pBuf[i + 1] >= 0x7f ){
pBuf[i + 1] = pBuf[i + 1] - 0x31;
}else{
pBuf[i + 1] = pBuf[i + 1] - 0x30;
}
//@@@ 2001.02.03 End
}
}
if( nCharChars > 0 ){
i += nCharChars - 1;
}
}
return;
}
/* ポインタで示した文字の次にある文字の位置を返します */
/* 次にある文字がバッファの最後の位置を越える場合は&pData[nDataLen]を返します */
const char* CMemory::MemCharNext( const char* pData, int nDataLen, const char* pDataCurrent )
{
//#ifdef _DEBUG
// CRunningTimer cRunningTimer( (const char*)"CMemory::MemCharNext" );
//#endif
const char* pNext;
if( pDataCurrent[0] == '\0' ){
pNext = pDataCurrent + 1;
}else
{
// pNext = ::CharNext( pDataCurrent );
if(
/* SJIS全角コードの1バイト目か */ //Sept. 1, 2000 jepro 'シフト'を'S'に変更
_IS_SJIS_1( (unsigned char)pDataCurrent[0] )
&&
/* SJIS全角コードの2バイト目か */ //Sept. 1, 2000 jepro 'シフト'を'S'に変更
_IS_SJIS_2( (unsigned char)pDataCurrent[1] )
){
pNext = pDataCurrent + 2;
}else{
pNext = pDataCurrent + 1;
}
}
if( pNext >= &pData[nDataLen] ){
pNext = &pData[nDataLen];
}
return pNext;
}
/* ポインタで示した文字の直前にある文字の位置を返します */
/* 直前にある文字がバッファの先頭の位置を越える場合はpDataを返します */
const char* CMemory::MemCharPrev( const char* pData, int nDataLen, const char* pDataCurrent )
{
//#ifdef _DEBUG
// CRunningTimer cRunningTimer( (const char*)"CMemory::MemCharPrev" );
//#endif
const char* pPrev;
pPrev = ::CharPrev( pData, pDataCurrent );
//===1999.08.12 このやり方だと、ダメだった。===============-
//
// if( (pDataCurrent - 1)[0] == '\0' ){
// pPrev = pDataCurrent - 1;
// }else{
// if( pDataCurrent - pData >= 2 &&
// /* SJIS全角コードの1バイト目か */ //Sept. 1, 2000 jepro 'シフト'を'S'に変更
// (
// ( (unsigned char)0x81 <= (unsigned char)pDataCurrent[-2] && (unsigned char)pDataCurrent[-2] <= (unsigned char)0x9F ) ||
// ( (unsigned char)0xE0 <= (unsigned char)pDataCurrent[-2] && (unsigned char)pDataCurrent[-2] <= (unsigned char)0xFC )
// ) &&
// /* SJIS全角コードの2バイト目か */ //Sept. 1, 2000 jepro 'シフト'を'S'に変更
// (
// ( (unsigned char)0x40 <= (unsigned char)pDataCurrent[-1] && (unsigned char)pDataCurrent[-1] <= (unsigned char)0x7E ) ||
// ( (unsigned char)0x80 <= (unsigned char)pDataCurrent[-1] && (unsigned char)pDataCurrent[-1] <= (unsigned char)0xFC )
// )
// ){
// pPrev = pDataCurrent - 2;
// }else{
// pPrev = pDataCurrent - 1;
// }
// }
// if( pPrev < pData ){
// pPrev = pData;
// }
return pPrev;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -