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

📄 cfileload.cpp

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


/*!
	次の論理行を文字コード変換してロードする(Unicode版)
	順次アクセス専用
	GetNextLineのような動作をする
	@return	NULL以外	1行を保持しているデータの先頭アドレスを返す
			NULL		データがなかった
*/
/*
const wchar_t* CFileLoad::ReadLineW(
	int*			pnLineLen,	//!< [out] 改行コード長を含む1行のデータバイト数
	CEOL*			pcEol		//!< [i/o]
)
{
	const char	*pLine;
	int			nRetVal = 1;
	int			nBufLineLen;
	int			nEolLen;

	// 行データクリア。本当はバッファは開放したくない
	m_cmemLine.SetDataSz( "" );

	// 1行取り出し ReadBuf -> m_memLine
	//	Oct. 19, 2002 genta while条件を整理
	while( NULL != ( pLine = GetNextLineCharCode( m_pReadBuf, m_nReadDataLen,
		&nBufLineLen, &m_nReadBufOffSet, pcEol, &nEolLen ) ) ){
			// ReadBufから1行を取得するとき、改行コードが欠ける可能性があるため
			if( m_nReadDataLen <= m_nReadBufOffSet && 1 == m_nMode ){
				m_cmemLine.Append( pLine, nBufLineLen );
				m_nReadBufOffSet -= nEolLen;
				// バッファロード   File -> ReadBuf
				Buffering();
			}else{
				m_cmemLine.Append( pLine, nBufLineLen );
				break;
			}
		}
	}

	m_nReadLength += ( nBufLineLen = m_cmemLine.GetLength() );

	// 文字コード変換
	switch( m_CharCode ){
	case CODE_SJIS:
		m_cmemLine.SJISToUnicode();
//		nEolLen = nEolLen * sizeof(wchar_t);
		break;
	case CODE_EUC:
		m_cmemLine.EUCToSJIS();
		m_cmemLine.SJISToUnicode();
//		nEolLen = nEolLen * sizeof(wchar_t);
		break;
	case CODE_JIS:
		// E-Mail(JIS→SJIS)コード変換
		m_cmemLine.JIStoSJIS( ( m_nFlag & 1 ) == 1 );
		m_cmemLine.SJISToUnicode();
//		nEolLen = nEolLen * sizeof(wchar_t);
		break;
	case CODE_UNICODE:
		break;
	case CODE_UTF8:
//		m_cmemLine.UTF8ToUnicode();
		m_cmemLine.UTF8ToSJIS();
		m_cmemLine.SJISToUnicode();
//		nEolLen = nEolLen * sizeof(wchar_t);
		break;
	case CODE_UTF7:
//		m_cmemLine.UTF7ToUnicode();
		m_cmemLine.UTF7ToSJIS();
		m_cmemLine.SJISToUnicode();
//		nEolLen = nEolLen * sizeof(wchar_t);
		break;
	case CODE_UNICODEBE:
//		m_cmemLine.UnicodeBEToUnicode();
		m_cmemLine.SwapHLByte();
		break;
	}
	m_nLineIndex++;
	// 行数がintの範囲を超えた
	// ただしファイルサイズがintの範囲内ならまずありえない
//	if( m_nLineIndex < 0){
//		throw CError_FileRead();
//		return NULL;
//	}
	// データあり
	if( 0 != nBufLineLen + nEolLen ){
		// 改行コードを追加
		m_cmemLine.Append( pcEol->GetUnicodeValue(), pcEol->GetLen() * sizeof( wchar_t ) );
		return reinterpret_cast<wchar_t*>( m_cmemLine.GetPtr( pnLineLen ) );
	}
	// データがない => 終了
//	m_cmemLine.Empty(); // protected メンバ
	m_cmemLine.SetDataSz("");
	return NULL;
}
*/

/*!
	バッファにデータを読み込む
	@note エラー時は throw する
*/
void CFileLoad::Buffering( void )
{
	DWORD	ReadSize;

	// メモリー確保
	if( NULL == m_pReadBuf ){
		int nBufSize;
		nBufSize = ( m_nFileSize < gm_nBufSizeDef )?( m_nFileSize ):( gm_nBufSizeDef );
		//	Borland C++では0バイトのmallocを獲得失敗と見なすため
		//	最低1バイトは取得することで0バイトのファイルを開けるようにする
		if( 0 >= nBufSize ){
			nBufSize = 1; // Jun. 08, 2003  BCCのmalloc(0)がNULLを返す仕様に対処
		}

		m_pReadBuf = (char *)malloc( nBufSize );
		if( NULL == m_pReadBuf ){
			throw CError_FileRead(); // メモリー確保に失敗
		}
		m_nReadDataLen = 0;
		m_nReadBufSize = nBufSize;
		m_nReadBufOffSet = 0;
	}
	// ReadBuf内にデータが残っている
	else if( m_nReadBufOffSet < m_nReadDataLen ){
		m_nReadDataLen -= m_nReadBufOffSet;
		memmove( m_pReadBuf, &m_pReadBuf[m_nReadBufOffSet], m_nReadDataLen );
		m_nReadBufOffSet = 0;
	}
	else{
		m_nReadBufOffSet = 0;
		m_nReadDataLen = 0;
	}
	// ファイルの読み込み
	ReadSize = Read( &m_pReadBuf[m_nReadDataLen], m_nReadBufSize - m_nReadDataLen );
	if( 0 == ReadSize ){
		m_eMode = FLMODE_READBUFEND;	// ファイルなどの終わりに達したらしい
	}
	m_nReadDataLen += ReadSize;
}

/*!
	バッファクリア
*/
void CFileLoad::ReadBufEmpty( void )
{
	if ( NULL != m_pReadBuf ){
		free( m_pReadBuf );
		m_pReadBuf = NULL;
	}
	m_nReadDataLen    = 0;
	m_nReadBufSize    = 0;
	m_nReadBufOffSet  = 0;
}

/*!
	バッファサイズの変更
	@note ファイルサイズを考慮しない
		FileOpenより先に呼ぶと確実にバッファサイズを小さくできる
*/
/*
void CFileLoad::SetReadBufAlloc( int nNewSize ){
	char * pBuf;

	// データが残っている場合は移動させる
	if( m_nReadBufOffSet + 1 <= m_nReadDataLen ){
		m_nReadDataLen -= m_nReadBufOffSet;
		memmove( m_pReadBuf, &m_pReadBuf[m_nReadBufOffSet], m_nReadDataLen );
		m_nReadBufOffSet = 0;
	}

	// 現在ロードしてるデータを失わないように
	if( m_nReadDataLen > nNewSize ){
		nNewSize = m_nReadDataLen;
	}
	// wchar_t の大きさで整頓
	if( 0 != nNewSize % sizeof(wchar_t) ){
		nNewSize += sizeof(wchar_t) - ( nNewSize % sizeof(wchar_t) );
	}
	if( gm_nBufSizeMin > nNewSize ){
		nNewSize = gm_nBufSizeMin;
	}

	// バッファサイズを変更
	if( m_nReadBufSize != nNewSize ){
		if( NULL != ( pBuf = (char *)realloc( m_pReadBuf, nNewSize ) ) ){
			m_pReadBuf = pBuf;
			m_nReadBufSize = nNewSize;
		}
		// メモリー確保に失敗したときは変更はなかったことにする
	}
}
*/


/*!
	 現在の進行率を取得する
	 @return 0% - 100%  若干誤差が出る
*/
int CFileLoad::GetPercent( void ){
	int nRet;
	if( 0 == m_nFileDataLen || m_nReadLength > m_nFileDataLen ){
		nRet = 100;
	}else if(  0x10000 > m_nFileDataLen ){
		nRet = m_nReadLength * 100 / m_nFileDataLen ;
	}else{
		nRet = m_nReadLength / 128 * 100 / ( m_nFileDataLen / 128 );
	}
	return nRet;
}

/*!
	GetNextLineの汎用文字コード版
*/
const char* CFileLoad::GetNextLineCharCode(
	const char*	pData,		//!< [in]	検索文字列
	int			nDataLen,	//!< [in]	検索文字列のバイト数
	int*		pnLineLen,	//!< [out]	1行のバイト数を返すただしEOLは含まない
	int*		pnBgn,		//!< [i/o]	検索文字列のバイト単位のオフセット位置
	CEOL*		pcEol,		//!< [i/o]	EOL
	int*		pnEolLen	//!< [out]	EOLのバイト数 (Unicodeで困らないように)
){
	const char *pRetStr;
	switch( m_CharCode ){
	case CODE_UNICODE:
		*pnBgn /= sizeof( wchar_t );
		pRetStr = (const char*)CFileLoad::GetNextLineW(
			(const wchar_t*)pData,
			nDataLen / sizeof( wchar_t ),
			pnLineLen,
			pnBgn,
			pcEol );
		*pnLineLen *= sizeof( wchar_t );
		*pnBgn     *= sizeof( wchar_t );
		*pnEolLen   = pcEol->GetLen() * sizeof( wchar_t );
		break;

	case CODE_UNICODEBE:
		*pnBgn /= sizeof( wchar_t );
		pRetStr = (const char*)CFileLoad::GetNextLineWB(
			(const wchar_t*)pData,
			nDataLen / sizeof( wchar_t ),
			pnLineLen,
			pnBgn,
			pcEol );
		*pnLineLen *= sizeof( wchar_t );
		*pnBgn     *= sizeof( wchar_t );
		*pnEolLen   = pcEol->GetLen() * sizeof( wchar_t );
		break;

	default:
		pRetStr = GetNextLine( pData, nDataLen, pnLineLen, pnBgn, pcEol );
		*pnEolLen = pcEol->GetLen();
		break;
	}
	return pRetStr;
}


/*!
	GetNextLineのwchar_t版
	GetNextLineより作成
	static メンバ関数
*/
const wchar_t* CFileLoad::GetNextLineW(
	const wchar_t*	pData,	//!< [in]	検索文字列
	int			nDataLen,	//!< [in]	検索文字列の文字数
	int*		pnLineLen,	//!< [out]	1行の文字数を返すただしEOLは含まない
	int*		pnBgn,		//!< [i/o]	検索文字列のオフセット位置
	CEOL*		pcEol		//!< [i/o]	EOL
)
{
	int		i;
	int		nBgn;
	nBgn = *pnBgn;

	pcEol->SetType( EOL_NONE );
	if( *pnBgn >= nDataLen ){
		return NULL;
	}
	for( i = *pnBgn; i < nDataLen; ++i ){
		// 改行コードがあった
		if( pData[i] == (wchar_t)0x000a || pData[i] == (wchar_t)0x000d ){
			// 行終端子の種類を調べる
			pcEol->SetType( CEOL::GetEOLTypeUni( &pData[i], nDataLen - i ) );
			break;
		}
	}
	*pnBgn = i + pcEol->GetLen();
	*pnLineLen = i - nBgn;
	return &pData[nBgn];
}

/*!
	GetNextLineのwchar_t版(ビックエンディアン用)
	GetNextLineより作成
	static メンバ関数
*/
const wchar_t* CFileLoad::GetNextLineWB(
	const wchar_t*	pData,	//!< [in]	検索文字列
	int			nDataLen,	//!< [in]	検索文字列の文字数
	int*		pnLineLen,	//!< [out]	1行の文字数を返すただしEOLは含まない
	int*		pnBgn,		//!< [i/o]	検索文字列のオフセット位置
	CEOL*		pcEol		//!< [i/o]	EOL
)
{
	int		i;
	int		nBgn;
	nBgn = *pnBgn;

	pcEol->SetType( EOL_NONE );
	if( *pnBgn >= nDataLen ){
		return NULL;
	}
	for( i = *pnBgn; i < nDataLen; ++i ){
		// 改行コードがあった
		if( pData[i] == (wchar_t)0x0a00 || pData[i] == (wchar_t)0x0d00 ){
			// 行終端子の種類を調べる
			pcEol->SetType( CEOL::GetEOLTypeUniBE( &pData[i], nDataLen - i ) );
			break;
		}
	}
	*pnBgn = i + pcEol->GetLen();
	*pnLineLen = i - nBgn;
	return &pData[nBgn];
}

/*[EOF]*/

⌨️ 快捷键说明

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