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: