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

📄 cdoclinemgr.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void CDocLineMgr::AddLineStrX( const char* pData, int nDataLen, CEOL cEol )
{
#ifdef _DEBUG
//	CRunningTimer cRunningTimer( (const char*)"CDocLineMgr::AddLineStrX(const char*, int, int)" );
#endif
	CDocLine* pDocLine;
	if( 0 == m_nLines ){
		m_pDocLineBot = m_pDocLineTop = new CDocLine;
		m_pDocLineTop->m_pPrev = NULL;
		m_pDocLineTop->m_pNext = NULL;
//		if( bCRLF ){

//		if( EOL_NONE != nEOLType ){
//			m_pDocLineTop->m_pLine->m_pData[nDataLen] = '\r';
//			m_pDocLineTop->m_pLine->m_pData[nDataLen + 1] = '\0';
//			++m_pDocLineTop->m_pLine->m_nDataLen;
//		}
		m_pDocLineTop->m_cEol = cEol;	/* 改行コードの種類 */
		m_pDocLineTop->m_pLine = new CMemory( pData, nDataLen/* - m_pDocLineTop->m_nEOLLen*/ );
	}else{
		pDocLine = new CDocLine;
		pDocLine->m_pPrev = m_pDocLineBot;
		pDocLine->m_pNext = NULL;
//		if( bCRLF ){

//		if( EOL_NONE != nEOLType ){
//			pDocLine->m_pLine->m_pData[nDataLen] = '\r';
//			pDocLine->m_pLine->m_pData[nDataLen + 1] = '\0';
//			++pDocLine->m_pLine->m_nDataLen;
//		}
		pDocLine->m_cEol = cEol;	/* 改行コードの種類 */
		pDocLine->m_pLine = new CMemory( pData, nDataLen/* - pDocLine->m_nEOLLen*/ );
		m_pDocLineBot->m_pNext = pDocLine;
		m_pDocLineBot = pDocLine;
	}
	++m_nLines;
	return;
}

/*!
	ファイルを読み込んで格納する(分割読み込みテスト版)
	@version	2.0
	@note	Windows用にコーディングしてある
	@param	nFlags [in]			bit 0: MIME Encodeされたヘッダをdecodeするかどうか
	@param	hWndParent [in]		親ウィンドウのハンドル
	@param	hwndProgress [in]	Progress barのウィンドウハンドル
	@retval	TRUE	正常読み込み
	@retval	FALSE	エラー(またはユーザによるキャンセル?)
	@date	2002/08/30 Moca 旧ReadFileを元に作成 ファイルアクセスに関する部分をCFileLoadで行う
	@date	2003/07/26 ryoji BOMの状態の取得を追加
*/
int CDocLineMgr::ReadFile( const char* pszPath, HWND hWndParent, HWND hwndProgress, int nCharCode, FILETIME* pFileTime, int nFlags, BOOL* pbBomExist)
{
#ifdef _DEBUG
	MYTRACE( "pszPath=[%s]\n", pszPath );
	MY_RUNNINGTIMER( cRunningTimer, "CDocLineMgr::ReadFile" );
#endif
	int			nRetVal = TRUE;
	int			nLineNum = 0;
	//	May 15, 2000 genta
	CEOL cEol;
	CFileLoad cfl; 	//	2002/08/30 Moca Add
	const char*	pLine;
	int			nLineLen;

	/* 既存データのクリア */
	Empty();
	Init();

	/* 処理中のユーザー操作を可能にする */
	if( !::BlockingHook( NULL ) ){
		return FALSE;
	}

	try{
	// ファイルを開く
	// ファイルを閉じるにはFileCloseメンバ又はデストラクタのどちらかで処理できます
	//	Jul. 28, 2003 ryoji BOMパラメータ追加
	cfl.FileOpen( pszPath, nCharCode, nFlags, pbBomExist );

	/* ファイル時刻の取得 */
	FILETIME	FileTime;
	if( FALSE != cfl.GetFileTime( NULL, NULL, &FileTime ) ){
		*pFileTime = FileTime;
//		SYSTEMTIME	systimeL;
//		::FileTimeToLocalFileTime( &FileTime, &FileTime );
//		::FileTimeToSystemTime( &FileTime, &systimeL );
//		MYTRACE( "Last Update: %d/%d/%d %02d:%02d:%02d\n",
//			systimeL.wYear,
//			systimeL.wMonth,
//			systimeL.wDay,
//			systimeL.wHour,
//			systimeL.wMinute,
//			systimeL.wSecond
//		);
	}else{
//		MYTRACE( "GetFileTime() error.\n" );
	}

	if( NULL != hwndProgress ){
		::PostMessage( hwndProgress, PBM_SETRANGE, 0, MAKELPARAM( 0, 100 ) );
		::PostMessage( hwndProgress, PBM_SETPOS, 0, 0 );
	}

	// ReadLineはファイルから 文字コード変換された1行を読み出します
	// エラー時はthrow CError_FileRead を投げます
	while( NULL != ( pLine = cfl.ReadLine( &nLineLen, &cEol ) ) ){
		++nLineNum;
		AddLineStrX( pLine, nLineLen, cEol );
		if( NULL != hwndProgress && 0 == ( nLineNum % 512 ) ){
			::PostMessage( hwndProgress, PBM_SETPOS, cfl.GetPercent(), 0 );
			/* 処理中のユーザー操作を可能にする */
			if( !::BlockingHook( NULL ) ){
				return FALSE;
			}
		}
	}

	// ファイルをクローズする
	cfl.FileClose();
	} // try
	catch( CError_FileOpen ){
		nRetVal = FALSE;
		if( -1 == _access( pszPath, 0 )){
			// ファイルがない
			::MYMESSAGEBOX(
				hWndParent, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
				_T("%s\nというファイルを開けません。\nファイルが存在しません。"),	//Mar. 24, 2001 jepro 若干修正
				pszPath
			 );
		}
		else if( -1 == _access( pszPath, 4 )){
			// 読み込みアクセス権がない
			::MYMESSAGEBOX(
				hWndParent, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
				_T("\'%s\'\nというファイルを開けません。\n読み込みアクセス権がありません。"),
				pszPath
			 );
		}
//		else if( ファイルサイズ > 2GB ){
//			nRetVal = FALSE;
//			::MYMESSAGEBOX(
//				hWndParent, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
//				_("\'%s\'\nというファイルを開けません。\n2GB以上のファイルサイズは開けません。"),
//				pszPath
//			 );
//		}
		else{
			::MYMESSAGEBOX(
				hWndParent, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
				_T("\'%s\'\nというファイルを開けません。\n他のアプリケーションで使用されている可能性があります。"),
				pszPath
			 );
		}
	}
	catch( CError_FileRead ){
		nRetVal = FALSE;
		::MYMESSAGEBOX(
			hWndParent, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
			_T("\'%s\'というファイルの読み込み中にエラーが発生しました。\nファイルの読み込みを中止します。"),
			pszPath
		 );
		/* 既存データのクリア */
		Empty();
		Init();
		nRetVal = FALSE;
	} // 例外処理終わり

	if( NULL != hwndProgress ){
		::PostMessage( hwndProgress, PBM_SETPOS, 0, 0 );
	}
	/* 処理中のユーザー操作を可能にする */
	if( !::BlockingHook( NULL ) ){
		return FALSE;
	}

	/* 行変更状態をすべてリセット */
	ResetAllModifyFlag();
	return nRetVal;
}




/*! バッファ内容をファイルに書き出す (テスト用)

	@param cEol [in]		使用する改行コード
	@param bBomExist [in]	ファイル先頭にBOMを付けるか

	@note Windows用にコーディングしてある
	@date 2003.07.26 ryoji BOM引数追加
*/
int CDocLineMgr::WriteFile( const char* pszPath, HWND hWndParent, HWND hwndProgress, int nCharCode, FILETIME* pFileTime, CEOL cEol, BOOL bBomExist)
{
	const char*		pLine;
//	char*			pLineUnicode;
	int				nLineLen;
	int				nRetVal;
	int				nLineNumber;
//	int				i;
	int				nWriteLen;
//	int				bCRLF;
//	int				nLineUnicodeLen;
//	char*			pszCRLF_UNICODE = "\x0d\x0\x0a\x0";
//	char*			pszCRLF_LF = "\x0a";
	CMemory			cmemBuf;
	CDocLine*		pCDocLine;

	/*
	|| バッファサイズの調整
	*/
	cmemBuf.AllocBuffer( 32000 );

//#ifdef _DEBUG
//		if( IDYES != MYMESSAGEBOX(
//			hWndParent,
//			MB_YESNO | MB_ICONQUESTION | MB_TOPMOST,
//			"_DEBUG テスト機能",
//			"改行コードを LFCR にして保存します。\nよろしいですか?"
//		) ){
//			return FALSE;
//		}
//#endif
//	int				nCharCode = CODE_SJIS;
//	int				nCharCode = CODE_EUC;
//	int				nCharCode = CODE_JIS;
//	int				nCharCode = CODE_UNICODE;


	if( NULL != hwndProgress ){
		::PostMessage( hwndProgress, PBM_SETRANGE, 0, MAKELPARAM( 0, 100 ) );
		::PostMessage( hwndProgress, PBM_SETPOS, 0, 0 );
	}

	nRetVal = TRUE;

// 2002/05/22 Frozen ここから削除(CFileWrite_Cのコンストラクタへ移動)----
// CFileWriteクラスで代用
//
//	//<< 2002/04/13 Azumaiya
//	//  WriteFile を直に使ってしまうと、書き込み速度が劇的に遅くなるので、やはり、
//	// WriteFile をラッピングしてある標準関数に戻す。
//	// ファイル属性を取得する。
//	DWORD dwFileAttribute;
//	dwFileAttribute = ::GetFileAttributes(pszPath);
//	if ( dwFileAttribute != (DWORD)-1 )
//	{
//		// 読取専用属性だけ残す(ノーマル属性が付いていたらそれも残す)。
//		BOOL bRes = ::SetFileAttributes(pszPath, dwFileAttribute & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_NORMAL));
//	}
//	else
//	{
//		dwFileAttribute = FILE_ATTRIBUTE_NORMAL;	//@@@ 2002.04.15 MIK
//	}
//	//>> 2002/04/13 Azumaiya
//
//
//
//	///* ファイルを書き込み用にオープンする */
//// Oct 6, 2000 ao
///* ファイル出力にstream を使うようにする */
//	// 改行コードを勝手に制御されない様、バイナリモードで開く
//	FILE *sFile= fopen(pszPath,"wb"); /*add*/
//
//	2002/05/22 Frozen ここまで削除-----------------------------

	try
	{
	{//この括弧に対応する閉じ括弧でfileのデストラクタが呼び出され、ファイルが閉じられます。 
		CFileWrite file(pszPath);// 2002/05/22 Frozen

	///* ファイルを書き込み用にオープンする */
//-	hFile = _lopen( pszPath, OF_WRITE );
//-	if( HFILE_ERROR == hFile ){
//-	}else{
//-		_lclose( hFile );
//-	}
//-	hFile = _lcreat(pszPath, 0);
//-	if( HFILE_ERROR == hFile ){



//	2002/05/22 Frozen ファイルのオープンに失敗した場合は例外が起きるようにしたためここから削除----
//	代わりにここにかかれている文の一部をcatch節へ移動
//
//	if( !sFile ){ /*add*/
////		MYTRACE( "file create error %s\n", pszPath );
//		::MYMESSAGEBOX(
//			hWndParent,
//			MB_OK | MB_ICONSTOP,
//			GSTR_APPNAME,
//			"\'%s\'\nファイルを保存できません。\nパスが存在しないか、他のアプリケーションで使用されている可能性があります。",
//			pszPath
//		 );
//		nRetVal = FALSE;
//		//<< 2002/04/13 Azumaiya
//		if ( dwFileAttribute != (DWORD)-1 )
//		{
//			// ファイル属性を元に戻す。
//			::SetFileAttributes(pszPath, dwFileAttribute);
//		}
//		//>> 2002/04/13 Azumaiya
//		goto _RETURN_;
//	}
//
// 2002/05/22 Frozen ここまで削除

	//	Jul. 26, 2003 ryoji bBomExitによってBOMを付けるかどうかを決める
	if (bBomExist) {
		switch( nCharCode ){
		case CODE_UNICODE:
			file.Write("\xff\xfe",sizeof(char)*2);
			break;
		case CODE_UNICODEBE:
			file.Write( "\xfe\xff", sizeof(char) * 2 );
			break;
		case CODE_UTF8: // 2003.05.04 Moca BOMの間違いを訂正
			file.Write( "\xef\xbb\xbf", sizeof(char) * 3 );
			break;
		default:
			//	genta ここに来るのはバグだ
			;
		}
	}

	nLineNumber = 0;
//	pLine = GetFirstLinrStr( &nLineLen );
	pCDocLine = m_pDocLineTop;

//	while( NULL != pLine ){
	while( NULL != pCDocLine ){
		++nLineNumber;
		pLine = pCDocLine->m_pLine->GetPtr( &nLineLen );


		if( NULL != hwndProgress && 0 < m_nLines && 0 == ( nLineNumber % 1024 ) ){
			::PostMessage( hwndProgress, PBM_SETPOS, nLineNumber * 100 / m_nLines , 0 );
			/* 処理中のユーザー操作を可能にする */
			if( !::BlockingHook( NULL ) ){
				return FALSE;
			}
		}

		nWriteLen = nLineLen - pCDocLine->m_cEol.GetLen();
		cmemBuf.SetDataSz( "" );
		if( 0 < nWriteLen ){
			cmemBuf.SetData( pLine, nWriteLen );

			/* 書き込み時のコード変換 */
			switch( nCharCode ){
			case CODE_UNICODE:
				/* SJIS→Unicodeコード変換 */
				cmemBuf.SJISToUnicode();
				break;
			case CODE_UTF8:	/* UTF-8 */
				/* SJIS→UTF-8コード変換 */
				cmemBuf.SJISToUTF8();
				break;
			case CODE_UTF7:	/* UTF-7 */
				/* SJIS→UTF-7コード変換 */
				cmemBuf.SJISToUTF7();
				break;
			case CODE_EUC:
				/* SJIS→EUCコード変換 */
				cmemBuf.SJISToEUC();
				break;
			case CODE_JIS:
				/* SJIS→JISコード変換 */
				cmemBuf.SJIStoJIS();
				break;
			case CODE_UNICODEBE:
				/* SJIS→UnicodeBEコード変換 */
				cmemBuf.SJISToUnicodeBE();
				break;
			case CODE_SJIS:
			default:
				break;
			}
		}
//		if( bCRLF ){
		if( EOL_NONE != pCDocLine->m_cEol ){

// 2002/05/09 Frozen ここから
			if( nCharCode == CODE_UNICODE ){
				if( cEol==EOL_NONE )
					cmemBuf.Append( pCDocLine->m_cEol.GetUnicodeValue(), pCDocLine->m_cEol.GetLen()*sizeof(wchar_t));
				else
					cmemBuf.Append( cEol.GetUnicodeValue(), cEol.GetLen()*sizeof(wchar_t));
			}else if( nCharCode == CODE_UNICODEBE ){
				/* UnicodeBE の改行コード設定 Moca, 2002/05/26 */
				if( cEol == EOL_NONE ) /*  */
					cmemBuf.Append( pCDocLine->m_cEol.GetUnicodeBEValue(), pCDocLine->m_cEol.GetLen()*sizeof(wchar_t) );
				else
					cmemBuf.Append( cEol.GetUnicodeBEValue(), cEol.GetLen()*sizeof(wchar_t) );
			}else{
				if( cEol == EOL_NONE )
					cmemBuf.Append(pCDocLine->m_cEol.GetValue(),pCDocLine->m_cEol.GetLen());
				else
					cmemBuf.Append(cEol.GetValue(),cEol.GetLen());
			}
// 2002/05/09 Frozen ここまで

// 2002/05/09 Frozen ここから削除

//			/* 書き込み時の改行コード変換 */
//			switch( nCharCode ){
//			case CODE_UNICODE:
//				/* ASCII+SJIS→Unicode変換 */
//				//	May 15, 2000 genta
//				{
//					CEOL ue( EOL_CRLF_UNICODE );
//					cmemBuf.Append( ue.GetValue(), ue.GetLen() );
//				}
//				break;
//// 1999.12.20
////			case CODE_EUC:
////				cmemBuf.Append( gm_pszEolDataArr[EOL_LF], LEN_EOL_LF );
////				break;

⌨️ 快捷键说明

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