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

📄 cmemory.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}



/* コード変換 SJIS→Unicode */
void CMemory::SJISToUnicode( void )
{
	char*	pBufUnicode;
	int		nBufUnicodeLen;
	nBufUnicodeLen = CMemory::MemSJISToUnicode( &pBufUnicode, m_pData, m_nDataLen );
	SetData( pBufUnicode, nBufUnicodeLen );
	delete [] pBufUnicode;
	return;
}



/* コード変換 SJIS→UnicodeBE */
void CMemory::SJISToUnicodeBE( void )
{
	char*	pBufUnicode;
	int		nBufUnicodeLen;
	nBufUnicodeLen = CMemory::MemSJISToUnicode( &pBufUnicode, m_pData, m_nDataLen );
	SetData( pBufUnicode, nBufUnicodeLen );
	delete [] pBufUnicode;
	SwapHLByte();
	return;
}



/* コード変換 Unicode→SJIS */
void CMemory::UnicodeToSJIS( void )
{
	char*			pBufUnicode;
	int				nBufUnicodeLen;
	unsigned char*	pBuf;
	pBuf = (unsigned char*)m_pData;
//	BOMの削除はここではしないように変更
//	呼び出し側で対処してください 2002/08/30 Moca
		nBufUnicodeLen = CMemory::MemUnicodeToSJIS( &pBufUnicode, m_pData, m_nDataLen );
		SetData( pBufUnicode, nBufUnicodeLen );
		delete [] pBufUnicode;
	return;
}


/* コード変換 UnicodeBE→SJIS */
void CMemory::UnicodeBEToSJIS( void ){

	SwapHLByte();
	UnicodeToSJIS();

	return;
}


/* ASCII&SJIS文字列をUnicodeに変換 */
int CMemory::MemSJISToUnicode( char** ppBufUnicode, const char*pBuf, int nBufLen )
{
	int			i, j, k;
	wchar_t		wchar;
	char*		pBufUnicode;
	int			nCharChars;

	setlocale( LC_ALL, "Japanese" );
	i = 0;
	k = 0;
	nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
	while( nCharChars > 0 && i < nBufLen ){
		i += nCharChars;
		k += 2;
		nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
	}
	pBufUnicode = new char[k + 1];
	i = 0;
	k = 0;
	nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
	while( nCharChars > 0 && i < nBufLen ){
		j = mbtowc( &wchar, &pBuf[i], nCharChars );
		if( j == -1 || j == 0 ){
			pBufUnicode[k] = 0;
			pBufUnicode[k + 1] = pBuf[i];
			++i;
		}else{
#if _DEBUG
			if( j != 2 ){
				MYTRACE( "%dバイトのUnicode文字に変換された SJIS(?)=%x %x\n", j,pBuf[i],((nCharChars >= 2)?(pBuf[i + 1]):0) );
			}
#endif
			*((wchar_t*)&(pBufUnicode[k])) = wchar;
			i += j;
		}
		k += 2;
		nCharChars = CMemory::MemCharNext( pBuf, nBufLen, &pBuf[i] ) - &pBuf[i];
	}
	*ppBufUnicode = pBufUnicode;
	return k;
}





/* Unicode文字列をASCII&SJISに変換 */
int CMemory::MemUnicodeToSJIS( char** ppBufSJIS, const char*pBuf, int nBufLen )
{
	int			i, j, k;;
	char*		pBufSJIS;
	wchar_t*	pUniBuf;
	char		mbchar[4];

	setlocale( LC_ALL, "Japanese" );
	pUniBuf = (wchar_t*)pBuf;
	i = 0;
	k = 0;
	for( i = 0; i < nBufLen / (int)sizeof( wchar_t ); ++i ){
		j = wctomb( (char*)mbchar, pUniBuf[i] );
		if( -1 == j ){
			k += sizeof( wchar_t );
		}else{
			k += j;
		}
	}
	pBufSJIS = new char[k];

	k = 0;
	for( i = 0; i < nBufLen / (int)sizeof( wchar_t ); ++i ){
		j = wctomb( (char*)&(pBufSJIS[k]), pUniBuf[i] );
		if( -1 == j ){
			memcpy( &pBufSJIS[k], &pUniBuf[i], sizeof( wchar_t ) );
			k += sizeof( wchar_t );
		}else{
			k += j;
		}
	}
	*ppBufSJIS = pBufSJIS;
	return k;
}





/* 文字列置換 */
void CMemory::Replace( char* pszFrom, char* pszTo )
{
	CMemory		cmemWork;
	int			nFromLen = strlen( pszFrom );
	int			nToLen = strlen( pszTo );
	int			nBgnOld = 0;
	int			nBgn = 0;
	while( nBgn <= m_nDataLen - nFromLen ){
		if( 0 == memcmp( &m_pData[nBgn], pszFrom, nFromLen ) ){
			if( 0  < nBgn - nBgnOld ){
				cmemWork.Append( &m_pData[nBgnOld], nBgn - nBgnOld );
			}
			cmemWork.Append( pszTo, nToLen );
			nBgn = nBgn + nFromLen;
			nBgnOld = nBgn;
		}else{
			nBgn++;
		}
	}
	if( 0  < m_nDataLen - nBgnOld ){
		cmemWork.Append( &m_pData[nBgnOld], m_nDataLen - nBgnOld );
	}
	SetData( &cmemWork );
	return;
}



/* 文字列置換(日本語考慮版) */
void CMemory::Replace_j( char* pszFrom, char* pszTo )
{
	CMemory		cmemWork;
	int			nFromLen = strlen( pszFrom );
	int			nToLen = strlen( pszTo );
	int			nBgnOld = 0;
	int			nBgn = 0;
	while( nBgn <= m_nDataLen - nFromLen ){
		if( 0 == memcmp( &m_pData[nBgn], pszFrom, nFromLen ) ){
			if( 0  < nBgn - nBgnOld ){
				cmemWork.Append( &m_pData[nBgnOld], nBgn - nBgnOld );
			}
			cmemWork.Append( pszTo, nToLen );
			nBgn = nBgn + nFromLen;
			nBgnOld = nBgn;
		}else{
			if( _IS_SJIS_1( (unsigned char)m_pData[nBgn] ) ) nBgn++;
			nBgn++;
		}
	}
	if( 0  < m_nDataLen - nBgnOld ){
		cmemWork.Append( &m_pData[nBgnOld], m_nDataLen - nBgnOld );
	}
	SetData( &cmemWork );
	return;
}



/* 等しい内容か */
int CMemory::IsEqual( CMemory& cmem1, CMemory& cmem2 )
{
	char*	psz1;
	char*	psz2;
	int		nLen1;
	int		nLen2;

	psz1 = cmem1.GetPtr( &nLen1 );
	psz2 = cmem2.GetPtr( &nLen2 );
	if( nLen1 == nLen2 ){
		if( 0 == memcmp( psz1, psz2, nLen1 ) ){
			return TRUE;
		}
	}
	return FALSE;
}





/* 半角→全角 */
void CMemory::ToZenkaku(
		int bHiragana,		/* 1== ひらがな 0==カタカナ //2==英数専用 2001/07/30 Misaka 追加 */
		int bHanKataOnly	/* 1== 半角カタカナにのみ作用する*/
)
{
	unsigned char*			pBuf = (unsigned char*)m_pData;
	int						nBufLen = m_nDataLen;
	int						i;
	int						nCharChars;
//	unsigned char			uc;
	unsigned short			usSrc;
	unsigned short			usDes;
	unsigned char*			pBufDes;
	int						nBufDesLen;
	static unsigned char*	pszHanKataSet = (unsigned char*)"???????????????????????????????????????????????????????????????";
	static unsigned char*	pszDakuSet = (unsigned char*)"????????????????????";
	static unsigned char*	pszYouSet = (unsigned char*)"?????";
	BOOL					bHenkanOK;

	pBufDes = new unsigned char[nBufLen * 2 + 1];
	if( NULL ==	pBufDes ){
		return;
	}
	nBufDesLen = 0;
	for( i = 0; i < nBufLen; ++i ){
		nCharChars = CMemory::MemCharNext( (const char *)pBuf, nBufLen, (const char *)&(pBuf[i]) ) - (const char*)&(pBuf[i]);
		if( nCharChars == 1){
			bHenkanOK = FALSE;
			if( bHanKataOnly ){	/* 1== 半角カタカナにのみ作用する */
				if( NULL != strchr( (const char *)pszHanKataSet, pBuf[i] ) ){
					bHenkanOK = TRUE;
				}
			}else{
				//! 英数変換用に新たな条件を付加 2001/07/30 Misaka
				if( ( (unsigned char)0x20 <= pBuf[i] && pBuf[i] <= (unsigned char)0x7E ) ||
					( bHiragana != 2 && (unsigned char)0xA1 <= pBuf[i] && pBuf[i] <= (unsigned char)0xDF )
				){
					bHenkanOK = TRUE;
				}
			}
			if( bHenkanOK ){
				usSrc = pBuf[i];
				if( FALSE == bHiragana &&
					pBuf[i]		== (unsigned char)'?' &&
					pBuf[i + 1] == (unsigned char)'?' &&
					bHiragana != 2
				){
					usDes = (unsigned short)0x8394; /* ヴ */
					nCharChars = 2;
				}else {
					usDes = _mbbtombc( usSrc );
					/* 濁音 */
					if( bHiragana != 2 && pBuf[i + 1] == (unsigned char)'?' && NULL != strchr( (const char *)pszDakuSet, pBuf[i] ) ){
						usDes++;
						nCharChars = 2;
					}
					/* 拗音 */
					//! 英数変換用に新たな条件を付加 2001/07/30 Misaka
					//! bHiragana != 2 //英数変換フラグがオンではない場合
					if( bHiragana != 2 && pBuf[i + 1] == (unsigned char)'?' && NULL != strchr( (const char *)pszYouSet, pBuf[i] ) ){
						usDes += 2;
						nCharChars = 2;
					}
				}

				if( bHiragana == 1 ){
					/* ひらがなに変換可能なカタカナならば、ひらがなに変換する */
					if( (unsigned short)0x8340 <= usDes && usDes <= (unsigned short)0x837e ){	/* ァ~ミ */
						usDes-= (unsigned short)0x00a1;
					}else
					if( (unsigned short)0x8380 <= usDes && usDes <= (unsigned short)0x8393 ){	/* ム~ン */
						usDes-= (unsigned short)0x00a2;
					}
				}
				pBufDes[nBufDesLen]		= ( usDes & 0xff00 ) >>  8;
				pBufDes[nBufDesLen + 1] = ( usDes & 0x00ff );
				nBufDesLen += 2;
			}else{
				memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
				nBufDesLen += nCharChars;

			}
		}else
		if( nCharChars == 2 ){
			usDes = usSrc = pBuf[i + 1] | ( pBuf[i] << 8 );
			if( bHanKataOnly == 0 ){
				if( bHiragana == 1 ){//英数変換を付加したために数値で指定した 2001/07/30 Misaka
					/* 全角ひらがなに変換可能な全角カタカナならば、ひらがなに変換する */
					if( (unsigned short)0x8340 <= usSrc && usSrc <= (unsigned short)0x837e ){	/* ァ~ミ */
						usDes = usSrc - (unsigned short)0x00a1;
					}else
					if( (unsigned short)0x8380 <= usSrc && usSrc <= (unsigned short)0x8393 ){	/* ム~ン */
						usDes = usSrc - (unsigned short)0x00a2;
					}
				}else if( bHiragana == 0 ){//英数変換を付加したために数値で指定した 2001/07/30 Misaka
					/* 全角カタカナに変換可能な全角ひらがなならば、カタカナに変換する */
					if( (unsigned short)0x829f <= usSrc && usSrc <= (unsigned short)0x82dd ){	/* ぁ~み */
						usDes = usSrc + (unsigned short)0x00a1;
					}else
					if( (unsigned short)0x82de <= usSrc && usSrc <= (unsigned short)0x82f1 ){	/* む~ん */
						usDes = usSrc + (unsigned short)0x00a2;
					}
				}
			}
			pBufDes[nBufDesLen]		= ( usDes & 0xff00 ) >> 8;
			pBufDes[nBufDesLen + 1] = ( usDes & 0x00ff );
			nBufDesLen += 2;
		}else{
			memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
			nBufDesLen += nCharChars;

		}
		if( nCharChars > 0 ){
			i += nCharChars - 1;
		}
	}
	pBufDes[nBufDesLen] = '\0';
	SetData( (const char *)pBufDes, nBufDesLen );
	delete [] pBufDes;


	return;
}



/*!	全角→半角
	nMode
		0x01	カタカナに影響アリ
		0x02	ひらがなに影響アリ
		0x04	英数字に影響アリ
*/
#define TO_KATAKANA	0x01
#define TO_HIRAGANA	0x02
#define TO_EISU		0x04
void CMemory::ToHankaku(
		int nMode		/* 0==カタカナ 1== ひらがな 2==英数専用 */
)
{
	static unsigned char*	pszZenDAKU = (unsigned char*)"がぎぐげござじずぜぞだぢづでどばびぶべぼガギグゲゴザジズゼゾダヂヅデドバビブベボヴ";
	static unsigned char*	pszZenYOU  = (unsigned char*)"ぱぴぷぺぽパピプペポ";

	/* 入力 */
	unsigned char*			pBuf = (unsigned char*)m_pData;
	int						nBufLen = m_nDataLen;
	unsigned int			uiSrc;

	/* 出力 */
	unsigned char*			pBufDes = new unsigned char[nBufLen + 1];
	int						nBufDesLen = 0;
	unsigned int			uiDes;
	if( NULL ==	pBufDes ){
		return;
	}

	/* 作業用 */
	int						nCharChars;
	unsigned char			pszZen[3];	//	全角文字用バッファ
	int i;
	BOOL bHenkanOK;
	bool bInHiraKata = false;				// 前の文字がカタカナorひらがなだったなら、trueとし、長音、濁点、半濁点を半角へ変換可能とする
	for( i = 0; i < nBufLen; ++i ){
		nCharChars = CMemory::MemCharNext( (const char *)pBuf, nBufLen, (const char *)&(pBuf[i]) ) - (const char*)&(pBuf[i]);
		if( nCharChars == 2 ){
			uiSrc = pBuf[i + 1] | ( pBuf[i] << 8 );
			
			bHenkanOK = FALSE;
			if( nMode == 0x00 ){	//	どんな文字もokモード
				bHenkanOK = TRUE;
			}
			if( nMode & TO_KATAKANA ){	/* カタカナに作用する */
				if( 0x8340 <= uiSrc && uiSrc <= 0x8396 ){
					bHenkanOK = TRUE;
					bInHiraKata = true;
				} else {
					// 2003-04-30 かろと 長音がが変換できなかったのを修正
					// 但し、ひらがな?カタカナの区別がない文字なので直前の文字で決定する
					if( bInHiraKata == true ) {
						// 長音"ー"(0x815b)?濁点(0x814a)?半濁点(0x814b)
						if( uiSrc == 0x815b || uiSrc == 0x814a || uiSrc == 0x814b ) {
							bHenkanOK = TRUE;
						} else {
							bInHiraKata = false;
						}
					}
				}
			}
			if( nMode & TO_HIRAGANA ){	/* ひらがなに作用する */
				if( 0x829F <= uiSrc && uiSrc <= 0x82F1 ){
					bHenkanOK = TRUE;
					bInHiraKata = true;
				} else {
					// 2003-04-30 かろと 長音がが変換できなかったのを修正
					// 但し、ひらがな?カタカナの区別がない文字なので直前の文字で決定する
					if( bInHiraKata == true ) {
						// 長音"ー"(0x815b)?濁点(0x814a)?半濁点(0x814b)
						if( uiSrc == 0x815b || uiSrc == 0x814a || uiSrc == 0x814b ) {
							bHenkanOK = TRUE;
						} else {
							bInHiraKata = false;
						}
					}
				}
			}
			if ( nMode & TO_EISU ){		/* 英数に作用する */
				if( 0x824F <= uiSrc && uiSrc <= 0x8258){	//	数字
					bHenkanOK = TRUE;
				}
				else if( 0x8260 <= uiSrc && uiSrc <= 0x8279){	//	英大文字
					bHenkanOK = TRUE;
				}
				else if( 0x8281 <= uiSrc && uiSrc <= 0x829A){	//	英大文字
					bHenkanOK = TRUE;
				}
			}
			if (bHenkanOK == TRUE){
				uiDes = _mbctombb( uiSrc );
				if( uiDes == uiSrc ){	//	変換不可能
					memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
					nBufDesLen += nCharChars;
				}else{
					pBufDes[nBufDesLen] = (unsigned char)uiDes;
					nBufDesLen++;

					memcpy( pszZen, &pBuf[i], 2 );
					pszZen[2] = '\0';
					/* 濁音探し */
					if( NULL != strstr( (const char *)pszZenDAKU, (const char *)pszZen ) ){
						pBufDes[nBufDesLen] = (unsigned char)'?';
						nBufDesLen++;
					}else
					/* 拗音探し */
					if( NULL != strstr( (const char *)pszZenYOU,  (const char *)pszZen ) ){
						pBufDes[nBufDesLen] = (unsigned char)'?';
						nBufDesLen++;
					}
				}
			}
			else {
				memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
				nBufDesLen += nCharChars;
			}
		}else{
			memcpy( &pBufDes[nBufDesLen], &pBuf[i], nCharChars );
			nBufDesLen += nCharChars;
		}
		if( nCharChars > 0 ){
			i += nCharChars - 1;
		}
	}
	pBufDes[nBufDesLen] = '\0';
	SetData( (const c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -