Пример #1
0
/*!
	ファイルを確保
	@param[in]	ptFileName	指定されたファイル名で開く
	@return		LPARAM	0失敗 1〜成功
*/
LPARAM DocFileInflate( LPTSTR ptFileName )
{
	CONST WCHAR rtHead = 0xFEFF;	//	ユニコードテキストヘッダ
	WCHAR	rtUniBuf;

	HANDLE	hFile;
	DWORD	readed;

	LPVOID	pBuffer;	//	文字列バッファ用ポインター
	INT		iByteSize;

	LPTSTR	ptString;
	LPSTR	pcText;
	UINT_PTR	cchSize;

	LPARAM	dNumber;

#ifdef BIG_TEXT_SEPARATE	//	頁区切りのないTXTかどうかを確認する
	UINT	dSepRslt;
	LPTSTR	ptSepBuff;
#endif

#ifdef _DEBUG
	DWORD	dTcStart, dTcEnd;
#endif

	//TCHAR	atBuff[10];
	//ZeroMemory( atBuff, sizeof(atBuff) );

#ifdef _DEBUG
	dTcStart = GetTickCount(  );
#endif
	assert( ptFileName );	//	ファイル開けないのはバグ

	//	ファイル名が空っぽだったら自動的にアウツ!
	if( NULL == ptFileName[0] ){	return 0;	}

	//	レッツオーポン
	hFile = CreateFile( ptFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	if( INVALID_HANDLE_VALUE == hFile ){	return 0;	}

	//InitLastOpen( INIT_SAVE, ptFileName );	//	複数ファイルでは意味が無い

	//	処理順番入替

	iByteSize = GetFileSize( hFile, NULL );
	pBuffer = malloc( iByteSize + 4 );	//	バッファは少し大きめに取る
	ZeroMemory( pBuffer, iByteSize + 4 );

	SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
	ReadFile( hFile, pBuffer, iByteSize, &readed, NULL );
	CloseHandle( hFile );	//	内容全部取り込んだから開放

	//	ユニコードチェック
	CopyMemory( &rtUniBuf, pBuffer, 2 );
	if( rtHead == rtUniBuf )	//	ユニコードヘッダがあれば
	{
		ptString = (LPTSTR)pBuffer;
		ptString++;	//	ユニコードヘッダ分進めておく
	}
	else
	{
		pcText = (LPSTR)pBuffer;
		//	シフトJISを開く場合、�の部分をどうにかせんといかん
		ptString = SjisDecodeAlloc( pcText );	//	ファイルを開くとき

		FREE( pBuffer );	//	こっちで開放
		pBuffer = ptString;	//	ポイントするところを変更

	}

	StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

#ifdef BIG_TEXT_SEPARATE	//	頁区切りのないTXTかどうかを確認する
	dSepRslt = DocFileHugeCheck( ptString, cchSize );
	if(  1 == dSepRslt )	//	分割処理する
	{
		ptSepBuff = DocFileHugeSeparate( ptString, cchSize );
		if( !(ptSepBuff)  ){	return 0;	}	//	なんかミスってるなら中止

		FREE( pBuffer );	//	大本を一旦開放
		pBuffer = ptSepBuff;	//	最後に開放する領域としてポイントするところを変更
		ptString = ptSepBuff;	//	読込処理を続ける位置としてセット

		StringCchLength( ptString, STRSAFE_MAX_CCH , &cchSize );	//	サイズ読込直し
	}
	else if( 2 == dSepRslt )	//	読込中止
	{
		FREE( pBuffer );	//	大本を開放
		return 0;
	}
	//	0なら何もしない
#endif

	//	新しいファイル置き場の準備	2014/05/28↑にあったのを移動した
	dNumber = DocMultiFileCreate( NULL );	//	実際のファイルを開くとき
	if( 0 >= dNumber )	return 0;

	StringCchCopy( (*gitFileIt).atFileName, MAX_PATH, ptFileName );


	//	もしASTなら、先頭は[AA]になってるはず・分割は中でやる
	if( StrCmpN( AST_SEPARATERW, ptString, 4 ) )
	{
		DocStringSplitMLT( ptString , cchSize, DocPageLoad );
	}
	else
	{
		DocStringSplitAST( ptString , cchSize, DocPageLoad );
	}

	//	ファイル開いたらキャレットとかスクロールをリセットする
	ViewEditReset(  );

	FREE( pBuffer );	//	=ptString

	DocPageChange( 0  );	//	全部読み込んだので最初のページを表示する
	PageListViewChange( -1, -1 );	//	直前頁リセット

	AppTitleChange( ptFileName );

#ifdef _DEBUG
	dTcEnd = GetTickCount(  );
	TRACE( TEXT("LOAD START[%u]  END[%u]    ELAPSE[%u]"), dTcStart, dTcEnd, (dTcEnd - dTcStart) );
#endif

	return dNumber;
}
Пример #2
0
/*!
	ユーザ定義のアレを読み込む
	@param[in]	hWnd	メインウインドウハンドル
	@param[in]	bFirst	今回が最初であるか
	@return	非0中身取った処理した 0ファイルなかった
*/
INT UserDefInitialise( HWND hWnd, UINT bFirst )
{
	CONST WCHAR rtHead = 0xFEFF;	//	ユニコードテキストヘッダ
	WCHAR	rtUniBuf;

	HANDLE	hFile;
	DWORD	readed;

	LPVOID	pBuffer;	//	文字列バッファ用ポインター
	INT		iByteSize;

	LPTSTR	ptString;
	LPSTR	pcText;
	UINT	cchSize;

	if( bFirst )	//	最初ならパス作っておく
	{
		ZeroMemory( gatUsDfPath, sizeof(gatUsDfPath) );
		StringCchCopy( gatUsDfPath, MAX_PATH, ExePathGet() );
		PathAppend( gatUsDfPath, TEMPLATE_DIR );
		PathAppend( gatUsDfPath, USER_ITEM_FILE );
	}

	hFile = CreateFile( gatUsDfPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
	if( INVALID_HANDLE_VALUE == hFile ){	return 0;	}

	//	今の内容破棄
	UserDefObliterate( hWnd );

	iByteSize = GetFileSize( hFile, NULL );
	pBuffer = malloc( iByteSize + 2 );
	ZeroMemory( pBuffer, iByteSize + 2 );
	//	中身をいただく
	SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
	ReadFile( hFile, pBuffer, iByteSize, &readed, NULL );
	CloseHandle( hFile );	//	内容全部取り込んだから開放

	//	ユニコードチャック
	CopyMemory( &rtUniBuf, pBuffer, 2 );
	if( rtHead == rtUniBuf )	//	ユニコードヘッダがあれば
	{
		ptString = (LPTSTR)pBuffer;
		ptString++;	//	ユニコードヘッダ分進めておく
	}
	else
	{
		pcText = (LPSTR)pBuffer;
		//	シフトJISを開く場合、�の部分をどうにかせんといかん
		ptString = SjisDecodeAlloc( pcText );	//	SJISの内容をユニコードにする

		FREE( pBuffer );	//	こっちで開放
		pBuffer = ptString;	//	ポイントするところを変更
	}

	StringCchLength( ptString, STRSAFE_MAX_CCH, &cchSize );

	//	ASTじゃなきゃダメ
	if( !( StrCmpN( AST_SEPARATERW, ptString, 4 ) ) )
	{
		DocStringSplitAST( ptString , cchSize, UserDefItemLoad );
	}

	FREE( pBuffer );

	UserDefAppendMenu( hWnd );

	return 1;
}