⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmemory.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					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 + -