File Annotation

Not logged in
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: