File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "ArcB2e.h"
13b7203622 2011-02-23        kinaba: #include "resource.h"
13b7203622 2011-02-23        kinaba: #include "NoahApp.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------- ArcB2eクラス全体的な処理 ------------------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: char CArcB2e::st_base[MAX_PATH];
13b7203622 2011-02-23        kinaba: int  CArcB2e::st_life=0;
13b7203622 2011-02-23        kinaba: CArcB2e::CB2eCore* CArcB2e::rvm=NULL;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcB2e::init_b2e_path()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiPath dir( kiPath::Exe );
13b7203622 2011-02-23        kinaba: 	ki_strcpy( st_base, dir+="b2e\\" );
13b7203622 2011-02-23        kinaba: 	return st_base;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: CArcB2e::CArcB2e( const char* scriptname ) : CArchiver( scriptname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	st_life++;
13b7203622 2011-02-23        kinaba: 	exe = NULL;
13b7203622 2011-02-23        kinaba: 	m_LstScr = m_DcEScr = m_EncScr =
13b7203622 2011-02-23        kinaba: 	m_DecScr = m_SfxScr = m_LoadScr= m_ScriptBuf = NULL;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: CArcB2e::~CArcB2e()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( !(--st_life) )
13b7203622 2011-02-23        kinaba: 		delete rvm;
13b7203622 2011-02-23        kinaba: 	delete [] m_ScriptBuf;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------- スクリプト側にあまり関係しない部分 -------------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcB2e::v_ver( kiStr& str )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( !exe )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 	exe->ver( str );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiStr tmp;
13b7203622 2011-02-23        kinaba: 	for( int i=0,e=m_subFile.len(); i<e; ++i )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		str += "\r\n";
13b7203622 2011-02-23        kinaba: 		CArcModule(m_subFile[i]).ver( tmp );
13b7203622 2011-02-23        kinaba: 		str += tmp;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return true;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcB2e::v_check( const kiPath& aname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return exe ? exe->chk( aname ) : false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcB2e::v_contents( const kiPath& aname, kiPath& dname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return exe ? exe->cnt( aname, dname ) : aUnknown;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------- スクリプトを読み込み&eval( load: ) -------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcB2e::load_module( const char* name )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	exe = new CArcModule( name, m_usMode );
13b7203622 2011-02-23        kinaba: 	return exe->exist();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcB2e::v_load()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//-- 拡張スクリプトファイルを開く
13b7203622 2011-02-23        kinaba: 	kiStr fname( st_base ); fname += mlt_ext();
13b7203622 2011-02-23        kinaba: 	kiFile fp;
13b7203622 2011-02-23        kinaba: 	if( fp.open( fname ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		//-- ファイル全体を読み込み
13b7203622 2011-02-23        kinaba: 		unsigned int ln=fp.getSize();
13b7203622 2011-02-23        kinaba: 		m_ScriptBuf = new char[ ln+1 ];
13b7203622 2011-02-23        kinaba: 		ln = fp.read( (unsigned char*)m_ScriptBuf, ln );
13b7203622 2011-02-23        kinaba: 		m_ScriptBuf[ ln ] = '\0';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		//-- section毎に切り分ける
13b7203622 2011-02-23        kinaba: 		bool pack1,chk=false;
13b7203622 2011-02-23        kinaba: 		for( char* p=m_ScriptBuf; *p; p++ )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			switch( *p )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 			case 'c': case 'd': case 'e': case 'l': case 's':
13b7203622 2011-02-23        kinaba: 				if( ki_memcmp(p,"load:",5) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_LoadScr = (p+=4)+1;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"encode:",7) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_EncScr = (p+=6)+1, pack1=false;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"encode1:",8) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_EncScr = (p+=7)+1, pack1=true;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"decode:",7) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_DecScr = (p+=6)+1;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"sfx:",4) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_SfxScr = (p+=3)+1, m_SfxDirect=false;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"sfxd:",5) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_SfxScr = (p+=4)+1, m_SfxDirect=true;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"check:",6) )
13b7203622 2011-02-23        kinaba: 					*p='\0', (p+=5), chk=true;
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"decode1:",8) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_DcEScr = (p+=7);
13b7203622 2011-02-23        kinaba: 				else if( ki_memcmp(p,"list:",5) )
13b7203622 2011-02-23        kinaba: 					*p='\0', m_LstScr = (p+=4);
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			while( *p && *p!='\n' && *p!='\r' )
13b7203622 2011-02-23        kinaba: 				p++;
13b7203622 2011-02-23        kinaba: 			if( *p=='\0' )
13b7203622 2011-02-23        kinaba: 				break;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		//-- [load:]を実行!
13b7203622 2011-02-23        kinaba: 		if( m_LoadScr )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			//-- RythpVM 起動
13b7203622 2011-02-23        kinaba: 			if( !rvm )
13b7203622 2011-02-23        kinaba: 				rvm = new CB2eCore;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-- 初期化
13b7203622 2011-02-23        kinaba: 			m_Result=0;
13b7203622 2011-02-23        kinaba: 			rvm->setPtr( this,mLod );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-- 実行
13b7203622 2011-02-23        kinaba: 			rvm->eval( m_LoadScr );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-- 結果
13b7203622 2011-02-23        kinaba: 			if( m_Result==0 )
13b7203622 2011-02-23        kinaba: 				return (m_DecScr?aMelt|(m_DcEScr?aList|aMeltEach:0)|(chk?aCheck:0):0)
13b7203622 2011-02-23        kinaba: 					 | (m_EncScr?aCompress|(pack1?0:aArchive)|(m_SfxScr?aSfx:0):0);
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return 0;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcB2e::exec_script( const char* scr, scr_mode mode )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//-- 初期化
13b7203622 2011-02-23        kinaba: 	m_Result = 0;
13b7203622 2011-02-23        kinaba: 	rvm->setPtr( this, mode );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 実行
13b7203622 2011-02-23        kinaba: 	char* script = new char[ki_strlen(scr)+8];
13b7203622 2011-02-23        kinaba: 	ki_strcpy( script, "(exec " );
13b7203622 2011-02-23        kinaba: 	ki_strcat( script, scr );
13b7203622 2011-02-23        kinaba: 	ki_strcat( script, ")" );
13b7203622 2011-02-23        kinaba: 	rvm->eval( script );
13b7203622 2011-02-23        kinaba: 	delete [] script;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 結果
13b7203622 2011-02-23        kinaba: 	return m_Result;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------------------- リストアップ eval( list: ) -----------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcB2e::v_list( const arcname& aname, aflArray& files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//-- スクリプト無しで何とかできるならする。
13b7203622 2011-02-23        kinaba: 	if( !exe )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 	else if( exe->isdll() )
13b7203622 2011-02-23        kinaba: 		return exe->lst_dll( aname, files );
13b7203622 2011-02-23        kinaba: 	else if( !m_LstScr )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- リスティングスクリプトに必要なデータ
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 書庫名
13b7203622 2011-02-23        kinaba: 	m_psArc = &aname;
13b7203622 2011-02-23        kinaba: 	// ファイルリスト
13b7203622 2011-02-23        kinaba: 	m_psAInfo = &files;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- 実行! ---------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return 0==exec_script( m_LstScr, mLst );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------------------- 展開処理 eval( decode: ) -----------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcB2e::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: //-- 解凍スクリプトに必要なデータ
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// カレント
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory( ddir );
13b7203622 2011-02-23        kinaba: 	// 書庫名
13b7203622 2011-02-23        kinaba: 	m_psArc = &aname;
13b7203622 2011-02-23        kinaba: 	// 出力先ディレクトリ
13b7203622 2011-02-23        kinaba: 	m_psDir = &ddir;
13b7203622 2011-02-23        kinaba: 	// ファイルリスト
13b7203622 2011-02-23        kinaba: 	m_psAInfo = files;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- 実行! ---------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return exec_script( files ? m_DcEScr : m_DecScr,
13b7203622 2011-02-23        kinaba: 						files ? mDc1     : mDec );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------------------- 圧縮処理 eval( encode: sfx: ) -----------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcB2e::cmpr( const char* scr, const kiPath& base, const wfdArray& files, const kiPath& ddir, const int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: //-- 圧縮スクリプトに必要なデータ
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	arcname aname(
13b7203622 2011-02-23        kinaba: 		ddir,
13b7203622 2011-02-23        kinaba: 		files[0].cAlternateFileName,
13b7203622 2011-02-23        kinaba: 		files[0].cFileName );
13b7203622 2011-02-23        kinaba: 	int mhd=method+1;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// カレント
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory( base );
13b7203622 2011-02-23        kinaba: 	// 書庫名
13b7203622 2011-02-23        kinaba: 	m_psArc = &aname;
13b7203622 2011-02-23        kinaba: 	// ベースディレクトリ
13b7203622 2011-02-23        kinaba: 	m_psDir = &base;
13b7203622 2011-02-23        kinaba: 	// メソッド
13b7203622 2011-02-23        kinaba: 	m_psMhd = &mhd;
13b7203622 2011-02-23        kinaba: 	// リスト
13b7203622 2011-02-23        kinaba: 	m_psList = &files;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- 実行! --------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return exec_script( scr, mEnc );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcB2e::arc2sfx( const kiPath& temp, const kiPath& dest )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: //-- SFX変換スクリプトに必要なデータ
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiFindFile f;
13b7203622 2011-02-23        kinaba: 	WIN32_FIND_DATA fd;
13b7203622 2011-02-23        kinaba: 	kiPath wild( temp );
13b7203622 2011-02-23        kinaba: 	f.begin( wild += "*" );
13b7203622 2011-02-23        kinaba: 	if( !f.next( &fd ) )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 	kiPath from, to, oldname( fd.cFileName );
13b7203622 2011-02-23        kinaba: 	arcname aname( temp, fd.cAlternateFileName[0] ? fd.cAlternateFileName : fd.cFileName, fd.cFileName );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// カレント
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory( temp );
13b7203622 2011-02-23        kinaba: 	// 書庫名
13b7203622 2011-02-23        kinaba: 	m_psArc = &aname;
13b7203622 2011-02-23        kinaba: 	// ディレクトリ
13b7203622 2011-02-23        kinaba: 	m_psDir = &temp;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- 実行! ----------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( 0x8000<=exec_script( m_SfxScr, mSfx ) )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- コピー ----------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	bool skipped=false, ans=false;
13b7203622 2011-02-23        kinaba: 	f.begin( wild );
13b7203622 2011-02-23        kinaba: 	while( f.next( &fd ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( !skipped && oldname == fd.cFileName ) // テンポラリ書庫はコピーしない。
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			skipped=true;
13b7203622 2011-02-23        kinaba: 			continue;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		from = temp, from += fd.cFileName;
13b7203622 2011-02-23        kinaba: 		to   = dest, to   += fd.cFileName;
13b7203622 2011-02-23        kinaba: 		if( ::CopyFile( from, to, FALSE ) )
13b7203622 2011-02-23        kinaba: 			ans = true;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcB2e::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	const char* theScript = m_EncScr;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( sfx )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( m_SfxDirect )
13b7203622 2011-02-23        kinaba: 			theScript = m_SfxScr;
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			kiPath tmp;
13b7203622 2011-02-23        kinaba: 			myapp().get_tempdir( tmp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			// テンポラリへ圧縮
13b7203622 2011-02-23        kinaba: 			int ans = cmpr( m_EncScr, base, files, tmp, method );
13b7203622 2011-02-23        kinaba: 			if( ans < 0x8000 )
13b7203622 2011-02-23        kinaba: 				// テンポラリに落ちてるファイルをSFXに変換&コピー!
13b7203622 2011-02-23        kinaba: 				ans = (arc2sfx( tmp, ddir ) ? 0 : 0x8020);
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			// カレントを戻しておかないと削除できない…(;_;)
13b7203622 2011-02-23        kinaba: 			::SetCurrentDirectory( base );
13b7203622 2011-02-23        kinaba: 			tmp.remove();
13b7203622 2011-02-23        kinaba: 			return ans;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 出力先へ普通に圧縮
13b7203622 2011-02-23        kinaba: 	return cmpr( theScript, base, files, ddir, method );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-----------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: //-------------------- RythpVMの方の実務 --------------------------//
13b7203622 2011-02-23        kinaba: //-----------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcB2e::CB2eCore::exec_function( const kiVar& name, const CharArray& a, const BoolArray& b, int c, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	bool processed = false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( m_mode==mLod ){ //**ロード時専用functions****************************
13b7203622 2011-02-23        kinaba: 		if( name=="name" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (name module_filename)--//
13b7203622 2011-02-23        kinaba: 			//---------------------------//
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				x->m_usMode = false;
13b7203622 2011-02-23        kinaba: 				if( c>=3 )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					getarg( a[2],b[2],&t );
13b7203622 2011-02-23        kinaba: 					x->m_usMode = ( t=="us" );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&t );
13b7203622 2011-02-23        kinaba: 				if( x->load_module(t) )
13b7203622 2011-02-23        kinaba: 					*r = "exec";
13b7203622 2011-02-23        kinaba: 				else
13b7203622 2011-02-23        kinaba: 					*r = "", x->m_Result=0xffff;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( name=="type" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-----------------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (type ext method1 method2 ...)--//
13b7203622 2011-02-23        kinaba: 			//-----------------------------------//
13b7203622 2011-02-23        kinaba: 			for( int i=1; i<c; i++ )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				getarg( a[i],b[i],&t );
13b7203622 2011-02-23        kinaba: 				if( i==1 )
13b7203622 2011-02-23        kinaba: 					x->set_cmp_ext( t );
13b7203622 2011-02-23        kinaba: 				else
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					const char* ptr=t;
13b7203622 2011-02-23        kinaba: 					x->add_cmp_mhd( *ptr=='*' ? ptr+1 : ptr, *ptr=='*' );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}else if( name=="use" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-------------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (use module1 module2 ...) --//
13b7203622 2011-02-23        kinaba: 			//-------------------------------//
13b7203622 2011-02-23        kinaba: 			for( int i=1; i<c; i++ )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				getarg( a[i],b[i],&t );
13b7203622 2011-02-23        kinaba: 				x->m_subFile.add( t );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}else{//************ ロード時には使えないfunctions *********************
13b7203622 2011-02-23        kinaba: 		if( ki_memcmp( (const char*)name, "arc", 3 ) ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (arc[+-].xxx [slfrd]) --//
13b7203622 2011-02-23        kinaba: 			//---------------------------//
13b7203622 2011-02-23        kinaba: 			arc( ((const char*)name)+3, a, b, c, r );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( ki_memcmp( (const char*)name, "list", 4 ) ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//----------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (list[\*|\*.*] [slfn]) --//
13b7203622 2011-02-23        kinaba: 			//----------------------------//
13b7203622 2011-02-23        kinaba: 			list( ((const char*)name)+4, a, b, c, r );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( name=="method" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-------------------//
13b7203622 2011-02-23        kinaba: 			//-- (method [no]) --//
13b7203622 2011-02-23        kinaba: 			//-------------------//
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&t );
13b7203622 2011-02-23        kinaba: 				*r = t.getInt()==*x->m_psMhd ? "1" : "0";
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 				r->setInt( *x->m_psMhd );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( name=="dir" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-----------//
13b7203622 2011-02-23        kinaba: 			//-- (dir) --//
13b7203622 2011-02-23        kinaba: 			//-----------//
13b7203622 2011-02-23        kinaba: 			*r = (x->m_psDir ? *x->m_psDir : (const char*)"");
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( name=="del" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-------------------//
13b7203622 2011-02-23        kinaba: 			//-- (del filenam) --//
13b7203622 2011-02-23        kinaba: 			//-------------------//
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&t );
13b7203622 2011-02-23        kinaba: 				::DeleteFile( kiPath( t.unquote() ) );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( ki_memcmp( (const char*)name, "resp", 4 )
13b7203622 2011-02-23        kinaba: 			||	  ki_memcmp( (const char*)name, "resq", 4 ) ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//----------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (resp[@|-o] (list a)) ---//
13b7203622 2011-02-23        kinaba: 			//----------------------------//
13b7203622 2011-02-23        kinaba: 			resp( name[3]=='p', ((const char*)name)+4, a, b, c, r );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( name=="cd" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-------------------//
13b7203622 2011-02-23        kinaba: 			//-- (cd directory)--//
13b7203622 2011-02-23        kinaba: 			//-------------------//
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&t );
13b7203622 2011-02-23        kinaba: 				::SetCurrentDirectory( t.unquote() );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		}else if( name=="cmd" || name=="xcmd" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//----------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (cmd command line ...)---//
13b7203622 2011-02-23        kinaba: 			//-- (xcmd command line ...)--//
13b7203622 2011-02-23        kinaba: 			//----------------------------//
13b7203622 2011-02-23        kinaba: 			if( name[0]=='x' && c<2 )
13b7203622 2011-02-23        kinaba: 				x->m_Result = 0xffff;
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				CArcModule* xxx = x->exe;
13b7203622 2011-02-23        kinaba: 				kiVar       cmd;
13b7203622 2011-02-23        kinaba: 				int         i=1;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				if( name[0] == 'x' )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					kiVar mm;
13b7203622 2011-02-23        kinaba: 					getarg( a[i],b[i],&mm );
13b7203622 2011-02-23        kinaba: 					i++;
13b7203622 2011-02-23        kinaba: 					xxx = new CArcModule( mm, x->m_usMode );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 				for( ; i<c; i++ )
13b7203622 2011-02-23        kinaba: 					getarg( a[i],b[i],&t ), cmd+=t, cmd+=' ';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				bool m = (mycnf().miniboot() || m_mode==mDc1);
13b7203622 2011-02-23        kinaba: 				x->m_Result = xxx->cmd( cmd, m );
13b7203622 2011-02-23        kinaba: 				r->setInt( x->m_Result );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				if( name[0] == 'x' )
13b7203622 2011-02-23        kinaba: 					delete xxx;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}else if( name=="scan" || name=="xscan" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//----------------------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (scan BL BSL EL SL dx cmd...) -------//
13b7203622 2011-02-23        kinaba: 			//-- (xscan BL BSL EL SL dx CMD cmd...) --//
13b7203622 2011-02-23        kinaba: 			//----------------------------------------//
13b7203622 2011-02-23        kinaba: 			if( c<6 || (name[0]=='x'&&c<7) )
13b7203622 2011-02-23        kinaba: 				x->m_Result = 0xffff;
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				CArcModule* xxx = x->exe;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				kiVar BL, EL;
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&BL );
13b7203622 2011-02-23        kinaba: 				getarg( a[2],b[2],&t );
13b7203622 2011-02-23        kinaba: 				int BSL = t.getInt();
13b7203622 2011-02-23        kinaba: 				getarg( a[3],b[3],&EL );
13b7203622 2011-02-23        kinaba: 				getarg( a[4],b[4],&t );
13b7203622 2011-02-23        kinaba: 				int SL = t.getInt();
13b7203622 2011-02-23        kinaba: 				getarg( a[5],b[5],&t );
13b7203622 2011-02-23        kinaba: 				int dx = t.getInt();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				int i=6;
13b7203622 2011-02-23        kinaba: 				if( name[0] == 'x' )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					kiVar mm;
13b7203622 2011-02-23        kinaba: 					getarg( a[i],b[i],&mm );
13b7203622 2011-02-23        kinaba: 					i++;
13b7203622 2011-02-23        kinaba: 					xxx = new CArcModule( mm, x->m_usMode );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				kiVar cmd;
13b7203622 2011-02-23        kinaba: 				for( ; i<c; ++i )
13b7203622 2011-02-23        kinaba: 					getarg( a[i],b[i],&t ), cmd+=t, cmd+=' ';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				x->m_Result = xxx->lst_exe(
13b7203622 2011-02-23        kinaba: 					cmd, *const_cast<aflArray*>(x->m_psAInfo),
13b7203622 2011-02-23        kinaba: 					BL, BSL, EL, SL, dx ) ? 0 : -1;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				if( name[0] == 'x' )
13b7203622 2011-02-23        kinaba: 					delete xxx;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}else if( name=="input" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//-------------------------//
13b7203622 2011-02-23        kinaba: 			//-- (input MSG DEFUALT) --//
13b7203622 2011-02-23        kinaba: 			//-------------------------//
13b7203622 2011-02-23        kinaba: 			kiVar msg, defval;
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&msg );
13b7203622 2011-02-23        kinaba: 			if( c>=3 )
13b7203622 2011-02-23        kinaba: 				getarg( a[2],b[2],&defval );
13b7203622 2011-02-23        kinaba: 			input( msg, defval, r );
13b7203622 2011-02-23        kinaba: 		}else if( name=="size" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			//-- (size FILENAME) --//
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				kiVar fnm;
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&fnm );
13b7203622 2011-02-23        kinaba: 				r->setInt( kiFile::getSize( fnm.unquote() ) );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}else if( name=="is_file" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			//-- (is_file) --------//
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			if( c==1 )
13b7203622 2011-02-23        kinaba: 				*r = (x->m_psList->len()==1
13b7203622 2011-02-23        kinaba: 					  && !kiSUtil::isdir( (*x->m_psList)[0].cFileName )) ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}else if( name=="is_folder" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			//-- (is_folder) ------//
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			if( c==1 )
13b7203622 2011-02-23        kinaba: 				*r = (x->m_psList->len()==1
13b7203622 2011-02-23        kinaba: 					  && kiSUtil::isdir( (*x->m_psList)[0].cFileName )) ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}else if( name=="is_multiple" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			//-- (is_multiple) ----//
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			if( c==1 )
13b7203622 2011-02-23        kinaba: 				*r = x->m_psList->len()>1 ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}else if( name=="find" ){
13b7203622 2011-02-23        kinaba: 			processed=true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			//-- (find FILENAME) --//
13b7203622 2011-02-23        kinaba: 			//---------------------//
13b7203622 2011-02-23        kinaba: 			if( c>=2 )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				kiVar fnm;
13b7203622 2011-02-23        kinaba: 				getarg( a[1],b[1],&fnm );
13b7203622 2011-02-23        kinaba: 				char buf[MAX_PATH];
13b7203622 2011-02-23        kinaba: 				if( 0==::SearchPath( NULL,fnm.unquote(),NULL,MAX_PATH,buf,NULL ) )
13b7203622 2011-02-23        kinaba: 					*r = "";
13b7203622 2011-02-23        kinaba: 				else
13b7203622 2011-02-23        kinaba: 					*r = buf, r->quote();
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return processed ? true : kiRythpVM::exec_function(name,a,b,c,r);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcB2e::CB2eCore::arc( const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//---------------------------//
13b7203622 2011-02-23        kinaba: 	//-- (arc[+-].xxx [slfrd]) --//
13b7203622 2011-02-23        kinaba: 	//---------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// デフォルトオプション設定
13b7203622 2011-02-23        kinaba: 	const char* anm=x->m_psArc->lname;
13b7203622 2011-02-23        kinaba: 	enum{ full, nam, dir } part=full;
13b7203622 2011-02-23        kinaba: 	if( m_mode==mSfx )	part=nam; // sfx
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 指定があれば上書
13b7203622 2011-02-23        kinaba: 	if( c>=2 )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		getarg( a[1],b[1],&t );
13b7203622 2011-02-23        kinaba: 		for( const char* p=t; *p; p++ )
13b7203622 2011-02-23        kinaba: 			switch(*p)
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 			case 's': anm=x->m_psArc->sname; break;
13b7203622 2011-02-23        kinaba: 			case 'l': anm=x->m_psArc->lname; break;
13b7203622 2011-02-23        kinaba: 			case 'f': part=full; break;
13b7203622 2011-02-23        kinaba: 			case 'n': part=nam;  break;
13b7203622 2011-02-23        kinaba: 			case 'd': part=dir;  break;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ディレクトリ部分
13b7203622 2011-02-23        kinaba: 	*r = (part==nam ? (const char*)"" : x->m_psArc->basedir);
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 名前部分
13b7203622 2011-02-23        kinaba: 	if( part != dir )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( *opt=='\0' || *opt=='+' )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			// (arc)       : anmをそのまま返す
13b7203622 2011-02-23        kinaba: 			*r += anm;
13b7203622 2011-02-23        kinaba: 			// (arc+XXX)   : anmXXXを返す
13b7203622 2011-02-23        kinaba: 			if( *opt=='+' )
13b7203622 2011-02-23        kinaba: 				*r += (opt+1);
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			const char* ext = kiPath::ext(anm);
13b7203622 2011-02-23        kinaba: 			const char* add = "";
13b7203622 2011-02-23        kinaba: 			if( opt[0]=='-' && opt[1]=='.' )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// (arc-.XXX) : 末尾が.XXXだったら削除。
13b7203622 2011-02-23        kinaba: 				//            : そうでなければ後ろに.decompressed
13b7203622 2011-02-23        kinaba: 				if( 0!=ki_strcmpi( ext, opt+2 ) )
13b7203622 2011-02-23        kinaba: 					ext = anm + ki_strlen(anm), add = ".decompressed";
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else if( opt[1]!='\0' )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// (arc.XXX)  : 最後の拡張子を.XXXに取り替え
13b7203622 2011-02-23        kinaba: 				add = opt;
13b7203622 2011-02-23        kinaba: 				switch(mycnf().extnum())
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 				case 0: ext = anm + ::lstrlen(anm);break;
13b7203622 2011-02-23        kinaba: 				case 1: ext = kiPath::ext(anm);    break;
13b7203622 2011-02-23        kinaba: 				default:ext = kiPath::ext_all(anm);break;
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// (arc.)     : 拡張子を全て取り除く
13b7203622 2011-02-23        kinaba: 				switch(mycnf().extnum())
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 				case 0: ext = anm + ::lstrlen(anm);break;
13b7203622 2011-02-23        kinaba: 				case 1: ext = kiPath::ext(anm);    break;
13b7203622 2011-02-23        kinaba: 				default:ext = kiPath::ext_all(anm);break;
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			if( *ext )
13b7203622 2011-02-23        kinaba: 				ext--;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			char buf[MAX_PATH];
13b7203622 2011-02-23        kinaba: 			ki_memcpy( buf, anm, ext-anm );
13b7203622 2011-02-23        kinaba: 			buf[ ext-anm ] = '\0';
13b7203622 2011-02-23        kinaba: 			*r += buf;
13b7203622 2011-02-23        kinaba: 			*r += add;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// 必要ならくくる
13b7203622 2011-02-23        kinaba: 		if( part==full )
13b7203622 2011-02-23        kinaba: 			r->quote();
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: static void selfR(
13b7203622 2011-02-23        kinaba: 	const char* writedir, const char* fullpath, bool lfn, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiFindFile       f;
13b7203622 2011-02-23        kinaba: 	WIN32_FIND_DATA fd;
13b7203622 2011-02-23        kinaba: 	f.begin( kiStr(fullpath) += "\\*" );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiVar t, t2, t3;
13b7203622 2011-02-23        kinaba: 	while( f.next(&fd) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		t = writedir;
13b7203622 2011-02-23        kinaba: 		t+= '\\';
13b7203622 2011-02-23        kinaba: 		t+= (lfn ? fd.cFileName : fd.cAlternateFileName);
13b7203622 2011-02-23        kinaba: 		if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			t2 = t;
13b7203622 2011-02-23        kinaba: 			t  = "";
13b7203622 2011-02-23        kinaba: 			t3 = fullpath;
13b7203622 2011-02-23        kinaba: 			t3+= '\\';
13b7203622 2011-02-23        kinaba: 			t3+= (lfn ? fd.cFileName : fd.cAlternateFileName);
13b7203622 2011-02-23        kinaba: 			selfR( t2, t3, lfn, &t );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( lfn )
13b7203622 2011-02-23        kinaba: 				t.quote();
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		*r += t;
13b7203622 2011-02-23        kinaba: 		*r += ' ';
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcB2e::CB2eCore::list( const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//---------------------------//
13b7203622 2011-02-23        kinaba: 	//-- (list[r|\*.*] [slfn]) --//
13b7203622 2011-02-23        kinaba: 	//---------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( m_mode!=mEnc ) // 解凍の場合
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		*r = "";
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		for( unsigned int i=0; i!=x->m_psAInfo->len(); i++ )
13b7203622 2011-02-23        kinaba: 			if( (*x->m_psAInfo)[i].selected )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// - で始まるヤツ対策をするか?
13b7203622 2011-02-23        kinaba: 				t = (*x->m_psAInfo)[i].inf.szFileName;
13b7203622 2011-02-23        kinaba: 				t.quote();
13b7203622 2011-02-23        kinaba: 				*r += t;
13b7203622 2011-02-23        kinaba: 				*r += ' ';
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else // 圧縮の場合
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		// デフォルトオプション設定
13b7203622 2011-02-23        kinaba: 		bool lfn=true;
13b7203622 2011-02-23        kinaba: 		enum{ full, nam } part=nam;
13b7203622 2011-02-23        kinaba: 		// 指定があれば上書
13b7203622 2011-02-23        kinaba: 		if( c>=2 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg( a[1],b[1],&t );
13b7203622 2011-02-23        kinaba: 			for( const char* p=t; *p; p++ )
13b7203622 2011-02-23        kinaba: 				switch(*p)
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 				case 's': lfn=false; break;
13b7203622 2011-02-23        kinaba: 				case 'l': lfn=true;  break;
13b7203622 2011-02-23        kinaba: 				case 'f': part=full; break;
13b7203622 2011-02-23        kinaba: 				case 'n': part=nam;  break;
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		// 自前で再帰リストアップを行うか否か
13b7203622 2011-02-23        kinaba: 		bool selfrecurse = (*opt=='r');
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// ディレクトリ名の後ろに付け足すもの。
13b7203622 2011-02-23        kinaba: 		if( *opt=='\\' || *opt=='/' )
13b7203622 2011-02-23        kinaba: 			opt++;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// リストアップ
13b7203622 2011-02-23        kinaba: 		kiVar t2,t3;
13b7203622 2011-02-23        kinaba: 		*r = "";
13b7203622 2011-02-23        kinaba: 		for( unsigned int i=0; i!=x->m_psList->len(); i++ )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			// ファイル名部分
13b7203622 2011-02-23        kinaba: 			t = ( part==full ? *x->m_psDir : (const char*)"");
13b7203622 2011-02-23        kinaba: 			t += lfn ? (*x->m_psList)[i].cFileName : (*x->m_psList)[i].cAlternateFileName;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			if( selfrecurse && ((*x->m_psList)[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// セルフ再帰
13b7203622 2011-02-23        kinaba: 				t2 = t;
13b7203622 2011-02-23        kinaba: 				t  = "";
13b7203622 2011-02-23        kinaba: 				t3 = *x->m_psDir;
13b7203622 2011-02-23        kinaba: 				t3+= lfn ? (*x->m_psList)[i].cFileName : (*x->m_psList)[i].cAlternateFileName;
13b7203622 2011-02-23        kinaba: 				selfR( t2, t3, lfn, &t );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// ノーマル処理
13b7203622 2011-02-23        kinaba: 				if( *opt && ((*x->m_psList)[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
13b7203622 2011-02-23        kinaba: 					t += '\\', t += opt;
13b7203622 2011-02-23        kinaba: 				if( lfn )
13b7203622 2011-02-23        kinaba: 					t.quote();
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			*r += t;
13b7203622 2011-02-23        kinaba: 			*r += ' ';
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	r->removeTrailWS();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcB2e::CB2eCore::resp( bool needq, const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//-----------------------------//
13b7203622 2011-02-23        kinaba: 	//-- (resp[@|-o] (list) ...) --//
13b7203622 2011-02-23        kinaba: 	//-----------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// レスポンスファイル名作成
13b7203622 2011-02-23        kinaba: 	kiPath rspfile;
13b7203622 2011-02-23        kinaba: 	myapp().get_tempdir(rspfile);
13b7203622 2011-02-23        kinaba: 	rspfile += "filelist";
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// オプションと結合して返す
13b7203622 2011-02-23        kinaba: 	*r  = opt;
13b7203622 2011-02-23        kinaba: 	*r += rspfile;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ファイルへ書き込み
13b7203622 2011-02-23        kinaba: 	kiFile fp;
13b7203622 2011-02-23        kinaba: 	if( !fp.open( rspfile,false ) )
13b7203622 2011-02-23        kinaba: 		return;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiVar tmp;
13b7203622 2011-02-23        kinaba: 	for( int i=1; i<c; i++ )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		// fpへ各引数をsplitしながら書き込む
13b7203622 2011-02-23        kinaba: 		getarg( a[i],b[i],&tmp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		for( const char *s,*p=tmp; *p; p++ )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			// 余分な空白はスキップ
13b7203622 2011-02-23        kinaba: 			while( *p==' ' )
13b7203622 2011-02-23        kinaba: 				p++;
13b7203622 2011-02-23        kinaba: 			if( *p=='\0' )
13b7203622 2011-02-23        kinaba: 				break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			// 引数の終わりへ…
13b7203622 2011-02-23        kinaba: 			s=p;
13b7203622 2011-02-23        kinaba: 			for( int q=0; *p!='\0' && (*p!=' ' || (q&1)!=0); p++ )
13b7203622 2011-02-23        kinaba: 				if( *p=='"' )
13b7203622 2011-02-23        kinaba: 					q++;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			// "のつじつま合わせ一号
13b7203622 2011-02-23        kinaba: 			if( !needq && *s=='"' )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				s++;
13b7203622 2011-02-23        kinaba: 				if( p!=s && *(p-1)=='"' )
13b7203622 2011-02-23        kinaba: 					p--;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			fp.write( s, p-s );
13b7203622 2011-02-23        kinaba: 			fp.write( "\r\n", 2 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			// "のつじつま合わせ二号
13b7203622 2011-02-23        kinaba: 			if( *p=='"' )
13b7203622 2011-02-23        kinaba: 				p++;
13b7203622 2011-02-23        kinaba: 			if( *p=='\0' )
13b7203622 2011-02-23        kinaba: 				break;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcB2e::CB2eCore::input( const char* msg, const char* defval, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	struct CB2eInputDlg : public kiDialog
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		const char* msg;
13b7203622 2011-02-23        kinaba: 		const char* def;
13b7203622 2011-02-23        kinaba: 		kiVar*      res;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		CB2eInputDlg( const char* m, const char* d, kiVar* r )
13b7203622 2011-02-23        kinaba: 			: kiDialog( IDD_PASSWORD ), msg(m), def(d), res(r) {}
13b7203622 2011-02-23        kinaba: 		BOOL onInit()
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				sendMsgToItem( IDC_EDIT, WM_SETTEXT, 0, (LPARAM)def );
13b7203622 2011-02-23        kinaba: 				sendMsgToItem( IDC_MESSAGE, WM_SETTEXT, 0, (LPARAM)msg );
13b7203622 2011-02-23        kinaba: 				::ShowWindow( item(IDC_MASK), SW_HIDE );
13b7203622 2011-02-23        kinaba: 				::ShowWindow( item(IDCANCEL), SW_HIDE );
13b7203622 2011-02-23        kinaba: 				::EnableWindow( item(IDC_MASK), FALSE );
13b7203622 2011-02-23        kinaba: 				::EnableWindow( item(IDCANCEL), FALSE );
13b7203622 2011-02-23        kinaba: 				::SetFocus( item(IDC_EDIT) );
13b7203622 2011-02-23        kinaba: 				return TRUE;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		bool onOK()
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				char* buf = new char[32768];
13b7203622 2011-02-23        kinaba: 				sendMsgToItem( IDC_EDIT, WM_GETTEXT, 32768, (LPARAM)buf );
13b7203622 2011-02-23        kinaba: 				*res = buf;
13b7203622 2011-02-23        kinaba: 				delete [] buf;
13b7203622 2011-02-23        kinaba: 				return true;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 	};
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	CB2eInputDlg d( msg, defval, r );
13b7203622 2011-02-23        kinaba: 	d.doModal( app()->mainhwnd() );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: