📄 cdoclinemgr.cpp
字号:
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 + -