ab3b073ef6 2015-04-30 kinaba: import win32.windows; ab3b073ef6 2015-04-30 kinaba: import std.string; ab3b073ef6 2015-04-30 kinaba: import std.file; c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: char lastChar( string s ) 4e2933c620 2015-04-21 kinaba: { return *CharPrevA(cast(char*)s.ptr, cast(char*)s.ptr+s.length); } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: // int do_opApply!(E, C)( collection, delegate ); c2b7a98c21 2011-02-23 kinaba: // int do_opApply!(E) ( array, delegate ); c2b7a98c21 2011-02-23 kinaba: // forwarding the opApply call to another collection c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: template do_opApply( Elem, Collection ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: int do_opApply( Collection c, int delegate(inout Elem) dg ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: int result = 0; c2b7a98c21 2011-02-23 kinaba: foreach( Elem x ; c ) c2b7a98c21 2011-02-23 kinaba: if( 0 != (result=dg(x)) ) c2b7a98c21 2011-02-23 kinaba: break; c2b7a98c21 2011-02-23 kinaba: return result; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: template do_opApply( E ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: int do_opApply( E[] c, int delegate(inout E) dg ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: return .do_opApply!(E,E[])( c, dg ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: // class set!(T) c2b7a98c21 2011-02-23 kinaba: // add : T -> void c2b7a98c21 2011-02-23 kinaba: // remove : T -> void c2b7a98c21 2011-02-23 kinaba: // has : T -> bool c2b7a98c21 2011-02-23 kinaba: // elems : () -> T[] c2b7a98c21 2011-02-23 kinaba: // length : () -> int c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: class set(T) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: void add ( T x ) { data[x]; } c2b7a98c21 2011-02-23 kinaba: void remove( T x ) { delete data[x]; } c2b7a98c21 2011-02-23 kinaba: bool has ( T x ) { return x in data; } c2b7a98c21 2011-02-23 kinaba: T[] elems () { return data.keys; } c2b7a98c21 2011-02-23 kinaba: int opApply( int delegate(inout T) dg ) c2b7a98c21 2011-02-23 kinaba: { return do_opApply!(T)( elems, dg ); } c2b7a98c21 2011-02-23 kinaba: int length() { return data.length; } c2b7a98c21 2011-02-23 kinaba: private void[T] data; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: unittest c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: set!(int) x = new set!(int); c2b7a98c21 2011-02-23 kinaba: x.add(1); c2b7a98c21 2011-02-23 kinaba: x.add(2); c2b7a98c21 2011-02-23 kinaba: x.add(3); c2b7a98c21 2011-02-23 kinaba: assert( x.elems[0] + x.elems[1] + x.elems[2] == 6 ); c2b7a98c21 2011-02-23 kinaba: assert( x.length == 3 ); c2b7a98c21 2011-02-23 kinaba: x.remove(4); c2b7a98c21 2011-02-23 kinaba: x.remove(3); c2b7a98c21 2011-02-23 kinaba: x.remove(1); c2b7a98c21 2011-02-23 kinaba: assert( x.length == 1 ); c2b7a98c21 2011-02-23 kinaba: foreach( int t ; x ) assert( t==2 ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: // コマンドライン解析 c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: string[] cmd_parse( string str, bool in_resp=false ) c2b7a98c21 2011-02-23 kinaba: { 4e2933c620 2015-04-21 kinaba: string[] ans; c2b7a98c21 2011-02-23 kinaba: char resp_char = '@'; c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: for(int i=0; i!=str.length; ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: // 空白スキップ c2b7a98c21 2011-02-23 kinaba: while( i!=str.length && 0<=str[i] && str[i]<=' ' ) c2b7a98c21 2011-02-23 kinaba: ++i; c2b7a98c21 2011-02-23 kinaba: if( i == str.length ) c2b7a98c21 2011-02-23 kinaba: break; c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: // ""を考慮して一個パラメタ切り出し 4e2933c620 2015-04-21 kinaba: string param; c2b7a98c21 2011-02-23 kinaba: if( str[i] == '"' ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: int j = ++i; c2b7a98c21 2011-02-23 kinaba: while( j!=str.length ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: if( str[j]=='"' && c2b7a98c21 2011-02-23 kinaba: (j+1==str.length || 0<=str[j+1] && str[j+1]<=' ') ) c2b7a98c21 2011-02-23 kinaba: break; c2b7a98c21 2011-02-23 kinaba: ++j; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: param = str[i .. j]; c2b7a98c21 2011-02-23 kinaba: i = (j==str.length ? j : j+1); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: else c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: int j=i; c2b7a98c21 2011-02-23 kinaba: while( j!=str.length && (str[j]<0 || ' '<str[j]) ) c2b7a98c21 2011-02-23 kinaba: ++j; c2b7a98c21 2011-02-23 kinaba: param = str[i .. j]; c2b7a98c21 2011-02-23 kinaba: i = j; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: // レスポンスファイル関連の処理 c2b7a98c21 2011-02-23 kinaba: if( !in_resp && param[0]==resp_char ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: try { 4e2933c620 2015-04-21 kinaba: string rsp = cast(string) std.file.read( param[1 .. param.length] ); c2b7a98c21 2011-02-23 kinaba: ans ~= cmd_parse(rsp,true); c2b7a98c21 2011-02-23 kinaba: } catch( FileException e ) {} c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: else if( param.length>=2 && param[0..2]=="--" ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: resp_char = (param.length==2 ? '\0' : param[2]); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: else c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: ans ~= param; // 普通にパラメタ追加 c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: return ans; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: // DOS形式でファイル音更新時刻を書き換え c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: void dosSetFTime( string fname, ushort date, ushort time ) c2b7a98c21 2011-02-23 kinaba: { c2b7a98c21 2011-02-23 kinaba: FILETIME ft,lc; c2b7a98c21 2011-02-23 kinaba: if( DosDateTimeToFileTime( date, time, &lc ) ) c2b7a98c21 2011-02-23 kinaba: if( LocalFileTimeToFileTime( &lc, &ft ) ) c2b7a98c21 2011-02-23 kinaba: { 4e2933c620 2015-04-21 kinaba: HANDLE han = CreateFileA( toStringz(fname), 4e2933c620 2015-04-21 kinaba: GENERIC_READ | GENERIC_WRITE, 4e2933c620 2015-04-21 kinaba: FILE_SHARE_READ,null, 4e2933c620 2015-04-21 kinaba: OPEN_EXISTING, 4e2933c620 2015-04-21 kinaba: FILE_ATTRIBUTE_NORMAL, 4e2933c620 2015-04-21 kinaba: null ); c2b7a98c21 2011-02-23 kinaba: if( han==INVALID_HANDLE_VALUE ) c2b7a98c21 2011-02-23 kinaba: return; c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: SetFileTime( han,&ft,null,&ft ); c2b7a98c21 2011-02-23 kinaba: CloseHandle( han ); c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: // 指定時刻(DOS形式)より新しいファイルか? c2b7a98c21 2011-02-23 kinaba: //---------------------------------------------------------------- c2b7a98c21 2011-02-23 kinaba: 4e2933c620 2015-04-21 kinaba: bool newer_than( ushort d1, ushort t1, string fname ) c2b7a98c21 2011-02-23 kinaba: { 4e2933c620 2015-04-21 kinaba: HANDLE han = CreateFileA( toStringz(fname), 4e2933c620 2015-04-21 kinaba: GENERIC_READ | GENERIC_WRITE, 4e2933c620 2015-04-21 kinaba: FILE_SHARE_READ,null, 4e2933c620 2015-04-21 kinaba: OPEN_EXISTING, 4e2933c620 2015-04-21 kinaba: FILE_ATTRIBUTE_NORMAL, 4e2933c620 2015-04-21 kinaba: null ); c2b7a98c21 2011-02-23 kinaba: if( han==INVALID_HANDLE_VALUE ) c2b7a98c21 2011-02-23 kinaba: return false; c2b7a98c21 2011-02-23 kinaba: FILETIME ft; c2b7a98c21 2011-02-23 kinaba: GetFileTime( han, null, null, &ft ); c2b7a98c21 2011-02-23 kinaba: CloseHandle( han ); c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: FILETIME lc; c2b7a98c21 2011-02-23 kinaba: FileTimeToLocalFileTime( &ft, &lc ); c2b7a98c21 2011-02-23 kinaba: ushort d2, t2; c2b7a98c21 2011-02-23 kinaba: FileTimeToDosDateTime( &lc, &d2, &t2 ); c2b7a98c21 2011-02-23 kinaba: c2b7a98c21 2011-02-23 kinaba: if( d1 < d2 ) c2b7a98c21 2011-02-23 kinaba: return true; c2b7a98c21 2011-02-23 kinaba: if( d1 == d2 ) c2b7a98c21 2011-02-23 kinaba: return (t1 < t2); c2b7a98c21 2011-02-23 kinaba: return false; c2b7a98c21 2011-02-23 kinaba: } c2b7a98c21 2011-02-23 kinaba: