Hex Artifact Content

Not logged in

Artifact affffc4f40848d74814e75796cac231394b13992:


0000: ef bb bf 69 6d 70 6f 72 74 20 77 69 6e 33 32 2e  ...import win32.
0010: 77 69 6e 64 6f 77 73 3b 0a 69 6d 70 6f 72 74 20  windows;.import 
0020: 73 74 64 2e 73 74 72 69 6e 67 3b 0a 69 6d 70 6f  std.string;.impo
0030: 72 74 20 73 74 64 2e 66 69 6c 65 3b 0a 0a 63 68  rt std.file;..ch
0040: 61 72 20 6c 61 73 74 43 68 61 72 28 20 73 74 72  ar lastChar( str
0050: 69 6e 67 20 73 20 29 0a 20 20 7b 20 72 65 74 75  ing s ).  { retu
0060: 72 6e 20 2a 43 68 61 72 50 72 65 76 41 28 63 61  rn *CharPrevA(ca
0070: 73 74 28 63 68 61 72 2a 29 73 2e 70 74 72 2c 20  st(char*)s.ptr, 
0080: 63 61 73 74 28 63 68 61 72 2a 29 73 2e 70 74 72  cast(char*)s.ptr
0090: 2b 73 2e 6c 65 6e 67 74 68 29 3b 20 7d 0a 0a 2f  +s.length); }../
00a0: 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /---------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00e0: 2d 0a 2f 2f 20 69 6e 74 20 64 6f 5f 6f 70 41 70  -.// int do_opAp
00f0: 70 6c 79 21 28 45 2c 20 43 29 28 20 63 6f 6c 6c  ply!(E, C)( coll
0100: 65 63 74 69 6f 6e 2c 20 64 65 6c 65 67 61 74 65  ection, delegate
0110: 20 29 3b 0a 2f 2f 20 69 6e 74 20 64 6f 5f 6f 70   );.// int do_op
0120: 41 70 70 6c 79 21 28 45 29 20 20 20 28 20 20 20  Apply!(E)   (   
0130: 20 20 20 61 72 72 61 79 2c 20 64 65 6c 65 67 61     array, delega
0140: 74 65 20 29 3b 0a 2f 2f 20 20 20 66 6f 72 77 61  te );.//   forwa
0150: 72 64 69 6e 67 20 74 68 65 20 6f 70 41 70 70 6c  rding the opAppl
0160: 79 20 63 61 6c 6c 20 74 6f 20 61 6e 6f 74 68 65  y call to anothe
0170: 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 0a 2f 2f 2d  r collection.//-
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
01c0: 0a 74 65 6d 70 6c 61 74 65 20 64 6f 5f 6f 70 41  .template do_opA
01d0: 70 70 6c 79 28 20 45 6c 65 6d 2c 20 43 6f 6c 6c  pply( Elem, Coll
01e0: 65 63 74 69 6f 6e 20 29 0a 7b 0a 09 69 6e 74 20  ection ).{..int 
01f0: 64 6f 5f 6f 70 41 70 70 6c 79 28 20 43 6f 6c 6c  do_opApply( Coll
0200: 65 63 74 69 6f 6e 20 63 2c 20 69 6e 74 20 64 65  ection c, int de
0210: 6c 65 67 61 74 65 28 69 6e 6f 75 74 20 45 6c 65  legate(inout Ele
0220: 6d 29 20 64 67 20 29 0a 09 7b 0a 09 09 69 6e 74  m) dg )..{...int
0230: 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 09 09 66   result = 0;...f
0240: 6f 72 65 61 63 68 28 20 45 6c 65 6d 20 78 20 3b  oreach( Elem x ;
0250: 20 63 20 29 0a 09 09 09 69 66 28 20 30 20 21 3d   c )....if( 0 !=
0260: 20 28 72 65 73 75 6c 74 3d 64 67 28 78 29 29 20   (result=dg(x)) 
0270: 29 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 72  ).....break;...r
0280: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 09 7d  eturn result;..}
0290: 0a 7d 0a 0a 74 65 6d 70 6c 61 74 65 20 64 6f 5f  .}..template do_
02a0: 6f 70 41 70 70 6c 79 28 20 45 20 29 0a 7b 0a 09  opApply( E ).{..
02b0: 69 6e 74 20 64 6f 5f 6f 70 41 70 70 6c 79 28 20  int do_opApply( 
02c0: 45 5b 5d 20 63 2c 20 69 6e 74 20 64 65 6c 65 67  E[] c, int deleg
02d0: 61 74 65 28 69 6e 6f 75 74 20 45 29 20 64 67 20  ate(inout E) dg 
02e0: 29 0a 09 7b 0a 09 09 72 65 74 75 72 6e 20 2e 64  )..{...return .d
02f0: 6f 5f 6f 70 41 70 70 6c 79 21 28 45 2c 45 5b 5d  o_opApply!(E,E[]
0300: 29 28 20 63 2c 20 64 67 20 29 3b 0a 09 7d 0a 7d  )( c, dg );..}.}
0310: 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..//------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 0a 2f 2f 20 63 6c 61 73 73 20 73 65  ----.// class se
0360: 74 21 28 54 29 0a 2f 2f 20 20 20 61 64 64 20 20  t!(T).//   add  
0370: 20 20 3a 20 20 54 20 2d 3e 20 76 6f 69 64 0a 2f    :  T -> void./
0380: 2f 20 20 20 72 65 6d 6f 76 65 20 3a 20 20 54 20  /   remove :  T 
0390: 2d 3e 20 76 6f 69 64 0a 2f 2f 20 20 20 68 61 73  -> void.//   has
03a0: 20 20 20 20 3a 20 20 54 20 2d 3e 20 62 6f 6f 6c      :  T -> bool
03b0: 0a 2f 2f 20 20 20 65 6c 65 6d 73 20 20 3a 20 28  .//   elems  : (
03c0: 29 20 2d 3e 20 54 5b 5d 0a 2f 2f 20 20 20 6c 65  ) -> T[].//   le
03d0: 6e 67 74 68 20 3a 20 28 29 20 2d 3e 20 69 6e 74  ngth : () -> int
03e0: 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .//-------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 0a 0a 63 6c 61 73 73 20 73 65 74 28 54  ---..class set(T
0430: 29 0a 7b 0a 09 76 6f 69 64 20 61 64 64 20 20 20  ).{..void add   
0440: 28 20 54 20 78 20 29 20 7b 20 64 61 74 61 5b 78  ( T x ) { data[x
0450: 5d 3b 20 7d 0a 09 76 6f 69 64 20 72 65 6d 6f 76  ]; }..void remov
0460: 65 28 20 54 20 78 20 29 20 7b 20 64 65 6c 65 74  e( T x ) { delet
0470: 65 20 64 61 74 61 5b 78 5d 3b 20 7d 0a 09 62 6f  e data[x]; }..bo
0480: 6f 6c 20 68 61 73 20 20 20 28 20 54 20 78 20 29  ol has   ( T x )
0490: 20 7b 20 72 65 74 75 72 6e 20 78 20 69 6e 20 64   { return x in d
04a0: 61 74 61 3b 20 7d 0a 09 54 5b 5d 20 20 65 6c 65  ata; }..T[]  ele
04b0: 6d 73 20 28 29 20 20 20 20 20 20 7b 20 72 65 74  ms ()      { ret
04c0: 75 72 6e 20 64 61 74 61 2e 6b 65 79 73 3b 20 7d  urn data.keys; }
04d0: 0a 09 69 6e 74 20 20 6f 70 41 70 70 6c 79 28 20  ..int  opApply( 
04e0: 69 6e 74 20 64 65 6c 65 67 61 74 65 28 69 6e 6f  int delegate(ino
04f0: 75 74 20 54 29 20 64 67 20 29 0a 09 20 20 20 20  ut T) dg )..    
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0510: 20 72 65 74 75 72 6e 20 64 6f 5f 6f 70 41 70 70   return do_opApp
0520: 6c 79 21 28 54 29 28 20 65 6c 65 6d 73 2c 20 64  ly!(T)( elems, d
0530: 67 20 29 3b 20 7d 0a 09 69 6e 74 20 20 6c 65 6e  g ); }..int  len
0540: 67 74 68 28 29 20 20 20 20 20 20 7b 20 72 65 74  gth()      { ret
0550: 75 72 6e 20 64 61 74 61 2e 6c 65 6e 67 74 68 3b  urn data.length;
0560: 20 7d 0a 09 70 72 69 76 61 74 65 20 76 6f 69 64   }..private void
0570: 5b 54 5d 20 64 61 74 61 3b 0a 7d 0a 0a 75 6e 69  [T] data;.}..uni
0580: 74 74 65 73 74 0a 7b 0a 09 73 65 74 21 28 69 6e  ttest.{..set!(in
0590: 74 29 20 78 20 3d 20 6e 65 77 20 73 65 74 21 28  t) x = new set!(
05a0: 69 6e 74 29 3b 0a 09 78 2e 61 64 64 28 31 29 3b  int);..x.add(1);
05b0: 0a 09 78 2e 61 64 64 28 32 29 3b 0a 09 78 2e 61  ..x.add(2);..x.a
05c0: 64 64 28 33 29 3b 0a 09 61 73 73 65 72 74 28 20  dd(3);..assert( 
05d0: 78 2e 65 6c 65 6d 73 5b 30 5d 20 2b 20 78 2e 65  x.elems[0] + x.e
05e0: 6c 65 6d 73 5b 31 5d 20 2b 20 78 2e 65 6c 65 6d  lems[1] + x.elem
05f0: 73 5b 32 5d 20 3d 3d 20 36 20 29 3b 0a 09 61 73  s[2] == 6 );..as
0600: 73 65 72 74 28 20 78 2e 6c 65 6e 67 74 68 20 3d  sert( x.length =
0610: 3d 20 33 20 29 3b 0a 09 78 2e 72 65 6d 6f 76 65  = 3 );..x.remove
0620: 28 34 29 3b 0a 09 78 2e 72 65 6d 6f 76 65 28 33  (4);..x.remove(3
0630: 29 3b 0a 09 78 2e 72 65 6d 6f 76 65 28 31 29 3b  );..x.remove(1);
0640: 0a 09 61 73 73 65 72 74 28 20 78 2e 6c 65 6e 67  ..assert( x.leng
0650: 74 68 20 3d 3d 20 31 20 29 3b 0a 09 66 6f 72 65  th == 1 );..fore
0660: 61 63 68 28 20 69 6e 74 20 74 20 3b 20 78 20 29  ach( int t ; x )
0670: 20 61 73 73 65 72 74 28 20 74 3d 3d 32 20 29 3b   assert( t==2 );
0680: 0a 7d 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..//----------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 0a 2f 2f 20 e3 82 b3 e3 83 9e  ------.// ......
06d0: e3 83 b3 e3 83 89 e3 83 a9 e3 82 a4 e3 83 b3 e8  ................
06e0: a7 a3 e6 9e 90 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d  ......//--------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 73 74 72 69 6e 67  --------..string
0730: 5b 5d 20 63 6d 64 5f 70 61 72 73 65 28 20 73 74  [] cmd_parse( st
0740: 72 69 6e 67 20 73 74 72 2c 20 62 6f 6f 6c 20 69  ring str, bool i
0750: 6e 5f 72 65 73 70 3d 66 61 6c 73 65 20 29 0a 7b  n_resp=false ).{
0760: 0a 09 73 74 72 69 6e 67 5b 5d 20 61 6e 73 3b 0a  ..string[] ans;.
0770: 09 63 68 61 72 20 72 65 73 70 5f 63 68 61 72 20  .char resp_char 
0780: 3d 20 27 40 27 3b 0a 0a 09 66 6f 72 28 69 6e 74  = '@';...for(int
0790: 20 69 3d 30 3b 20 69 21 3d 73 74 72 2e 6c 65 6e   i=0; i!=str.len
07a0: 67 74 68 3b 20 29 0a 09 7b 0a 09 09 2f 2f 20 e7  gth; )..{...// .
07b0: a9 ba e7 99 bd e3 82 b9 e3 82 ad e3 83 83 e3 83  ................
07c0: 97 0a 09 09 77 68 69 6c 65 28 20 69 21 3d 73 74  ....while( i!=st
07d0: 72 2e 6c 65 6e 67 74 68 20 26 26 20 30 3c 3d 73  r.length && 0<=s
07e0: 74 72 5b 69 5d 20 26 26 20 73 74 72 5b 69 5d 3c  tr[i] && str[i]<
07f0: 3d 27 20 27 20 29 0a 09 09 09 2b 2b 69 3b 0a 09  =' ' )....++i;..
0800: 09 69 66 28 20 69 20 3d 3d 20 73 74 72 2e 6c 65  .if( i == str.le
0810: 6e 67 74 68 20 29 0a 09 09 09 62 72 65 61 6b 3b  ngth )....break;
0820: 0a 0a 09 09 2f 2f 20 22 22 e3 82 92 e8 80 83 e6  ....// "".......
0830: 85 ae e3 81 97 e3 81 a6 e4 b8 80 e5 80 8b e3 83  ................
0840: 91 e3 83 a9 e3 83 a1 e3 82 bf e5 88 87 e3 82 8a  ................
0850: e5 87 ba e3 81 97 0a 09 09 73 74 72 69 6e 67 20  .........string 
0860: 70 61 72 61 6d 3b 0a 09 09 69 66 28 20 73 74 72  param;...if( str
0870: 5b 69 5d 20 3d 3d 20 27 22 27 20 29 0a 09 09 7b  [i] == '"' )...{
0880: 0a 09 09 09 69 6e 74 20 6a 20 3d 20 2b 2b 69 3b  ....int j = ++i;
0890: 0a 09 09 09 77 68 69 6c 65 28 20 6a 21 3d 73 74  ....while( j!=st
08a0: 72 2e 6c 65 6e 67 74 68 20 29 0a 09 09 09 7b 0a  r.length )....{.
08b0: 09 09 09 09 69 66 28 20 73 74 72 5b 6a 5d 3d 3d  ....if( str[j]==
08c0: 27 22 27 20 26 26 0a 09 09 09 09 20 20 20 20 20  '"' &&.....     
08d0: 28 6a 2b 31 3d 3d 73 74 72 2e 6c 65 6e 67 74 68  (j+1==str.length
08e0: 20 7c 7c 20 30 3c 3d 73 74 72 5b 6a 2b 31 5d 20   || 0<=str[j+1] 
08f0: 26 26 20 73 74 72 5b 6a 2b 31 5d 3c 3d 27 20 27  && str[j+1]<=' '
0900: 29 20 29 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) )......break;.
0910: 09 09 09 09 2b 2b 6a 3b 0a 09 09 09 7d 0a 09 09  ....++j;....}...
0920: 09 70 61 72 61 6d 20 3d 20 73 74 72 5b 69 20 2e  .param = str[i .
0930: 2e 20 6a 5d 3b 0a 09 09 09 69 20 3d 20 28 6a 3d  . j];....i = (j=
0940: 3d 73 74 72 2e 6c 65 6e 67 74 68 20 3f 20 6a 20  =str.length ? j 
0950: 3a 20 6a 2b 31 29 3b 0a 09 09 7d 0a 09 09 65 6c  : j+1);...}...el
0960: 73 65 0a 09 09 7b 0a 09 09 09 69 6e 74 20 6a 3d  se...{....int j=
0970: 69 3b 0a 09 09 09 77 68 69 6c 65 28 20 6a 21 3d  i;....while( j!=
0980: 73 74 72 2e 6c 65 6e 67 74 68 20 26 26 20 28 73  str.length && (s
0990: 74 72 5b 6a 5d 3c 30 20 7c 7c 20 27 20 27 3c 73  tr[j]<0 || ' '<s
09a0: 74 72 5b 6a 5d 29 20 29 0a 09 09 09 09 2b 2b 6a  tr[j]) ).....++j
09b0: 3b 0a 09 09 09 70 61 72 61 6d 20 3d 20 73 74 72  ;....param = str
09c0: 5b 69 20 2e 2e 20 6a 5d 3b 0a 09 09 09 69 20 3d  [i .. j];....i =
09d0: 20 6a 3b 0a 09 09 7d 0a 0a 09 09 2f 2f 20 e3 83   j;...}....// ..
09e0: ac e3 82 b9 e3 83 9d e3 83 b3 e3 82 b9 e3 83 95  ................
09f0: e3 82 a1 e3 82 a4 e3 83 ab e9 96 a2 e9 80 a3 e3  ................
0a00: 81 ae e5 87 a6 e7 90 86 0a 09 09 69 66 28 20 21  ...........if( !
0a10: 69 6e 5f 72 65 73 70 20 26 26 20 70 61 72 61 6d  in_resp && param
0a20: 5b 30 5d 3d 3d 72 65 73 70 5f 63 68 61 72 20 29  [0]==resp_char )
0a30: 0a 09 09 7b 0a 09 09 09 74 72 79 20 7b 0a 09 09  ...{....try {...
0a40: 09 09 73 74 72 69 6e 67 20 72 73 70 20 3d 20 63  ..string rsp = c
0a50: 61 73 74 28 73 74 72 69 6e 67 29 20 73 74 64 2e  ast(string) std.
0a60: 66 69 6c 65 2e 72 65 61 64 28 20 70 61 72 61 6d  file.read( param
0a70: 5b 31 20 2e 2e 20 70 61 72 61 6d 2e 6c 65 6e 67  [1 .. param.leng
0a80: 74 68 5d 20 29 3b 0a 09 09 09 09 61 6e 73 20 7e  th] );.....ans ~
0a90: 3d 20 63 6d 64 5f 70 61 72 73 65 28 72 73 70 2c  = cmd_parse(rsp,
0aa0: 74 72 75 65 29 3b 0a 09 09 09 7d 20 63 61 74 63  true);....} catc
0ab0: 68 28 20 46 69 6c 65 45 78 63 65 70 74 69 6f 6e  h( FileException
0ac0: 20 65 20 29 20 7b 7d 0a 09 09 7d 0a 09 09 65 6c   e ) {}...}...el
0ad0: 73 65 20 69 66 28 20 70 61 72 61 6d 2e 6c 65 6e  se if( param.len
0ae0: 67 74 68 3e 3d 32 20 26 26 20 70 61 72 61 6d 5b  gth>=2 && param[
0af0: 30 2e 2e 32 5d 3d 3d 22 2d 2d 22 20 29 0a 09 09  0..2]=="--" )...
0b00: 7b 0a 09 09 09 72 65 73 70 5f 63 68 61 72 20 3d  {....resp_char =
0b10: 20 28 70 61 72 61 6d 2e 6c 65 6e 67 74 68 3d 3d   (param.length==
0b20: 32 20 3f 20 27 5c 30 27 20 3a 20 70 61 72 61 6d  2 ? '\0' : param
0b30: 5b 32 5d 29 3b 0a 09 09 7d 0a 09 09 65 6c 73 65  [2]);...}...else
0b40: 0a 09 09 7b 0a 09 09 09 61 6e 73 20 7e 3d 20 70  ...{....ans ~= p
0b50: 61 72 61 6d 3b 20 2f 2f 20 e6 99 ae e9 80 9a e3  aram; // .......
0b60: 81 ab e3 83 91 e3 83 a9 e3 83 a1 e3 82 bf e8 bf  ................
0b70: bd e5 8a a0 0a 09 09 7d 0a 09 7d 0a 09 72 65 74  .......}..}..ret
0b80: 75 72 6e 20 61 6e 73 3b 0a 7d 0a 0a 2f 2f 2d 2d  urn ans;.}..//--
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2f  --------------./
0bd0: 2f 20 44 4f 53 e5 bd a2 e5 bc 8f e3 81 a7 e3 83  / DOS...........
0be0: 95 e3 82 a1 e3 82 a4 e3 83 ab e9 9f b3 e6 9b b4  ................
0bf0: e6 96 b0 e6 99 82 e5 88 bb e3 82 92 e6 9b b8 e3  ................
0c00: 81 8d e6 8f 9b e3 81 88 0a 2f 2f 2d 2d 2d 2d 2d  .........//-----
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 76 6f 69  -----------..voi
0c50: 64 20 64 6f 73 53 65 74 46 54 69 6d 65 28 20 73  d dosSetFTime( s
0c60: 74 72 69 6e 67 20 66 6e 61 6d 65 2c 20 75 73 68  tring fname, ush
0c70: 6f 72 74 20 64 61 74 65 2c 20 75 73 68 6f 72 74  ort date, ushort
0c80: 20 74 69 6d 65 20 29 0a 7b 0a 09 46 49 4c 45 54   time ).{..FILET
0c90: 49 4d 45 20 66 74 2c 6c 63 3b 0a 09 69 66 28 20  IME ft,lc;..if( 
0ca0: 44 6f 73 44 61 74 65 54 69 6d 65 54 6f 46 69 6c  DosDateTimeToFil
0cb0: 65 54 69 6d 65 28 20 64 61 74 65 2c 20 74 69 6d  eTime( date, tim
0cc0: 65 2c 20 26 6c 63 20 29 20 29 0a 09 09 69 66 28  e, &lc ) )...if(
0cd0: 20 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 54 6f   LocalFileTimeTo
0ce0: 46 69 6c 65 54 69 6d 65 28 20 26 6c 63 2c 20 26  FileTime( &lc, &
0cf0: 66 74 20 29 20 29 0a 09 09 7b 0a 09 09 09 48 41  ft ) )...{....HA
0d00: 4e 44 4c 45 20 68 61 6e 20 3d 20 43 72 65 61 74  NDLE han = Creat
0d10: 65 46 69 6c 65 41 28 20 74 6f 53 74 72 69 6e 67  eFileA( toString
0d20: 7a 28 66 6e 61 6d 65 29 2c 0a 09 09 09 09 09 09  z(fname),.......
0d30: 09 09 09 20 20 47 45 4e 45 52 49 43 5f 52 45 41  ...  GENERIC_REA
0d40: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
0d50: 45 2c 0a 09 09 09 09 09 09 09 09 09 20 20 46 49  E,..........  FI
0d60: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c 6e 75  LE_SHARE_READ,nu
0d70: 6c 6c 2c 0a 09 09 09 09 09 09 09 09 09 20 20 4f  ll,..........  O
0d80: 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 09  PEN_EXISTING,...
0d90: 09 09 09 09 09 09 09 20 20 46 49 4c 45 5f 41 54  .......  FILE_AT
0da0: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 0a  TRIBUTE_NORMAL,.
0db0: 09 09 09 09 09 09 09 09 09 20 20 6e 75 6c 6c 20  .........  null 
0dc0: 29 3b 0a 09 09 09 69 66 28 20 68 61 6e 3d 3d 49  );....if( han==I
0dd0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
0de0: 4c 55 45 20 29 0a 09 09 09 09 72 65 74 75 72 6e  LUE ).....return
0df0: 3b 0a 0a 09 09 09 53 65 74 46 69 6c 65 54 69 6d  ;.....SetFileTim
0e00: 65 28 20 68 61 6e 2c 26 66 74 2c 6e 75 6c 6c 2c  e( han,&ft,null,
0e10: 26 66 74 20 29 3b 0a 09 09 09 43 6c 6f 73 65 48  &ft );....CloseH
0e20: 61 6e 64 6c 65 28 20 68 61 6e 20 29 3b 0a 09 09  andle( han );...
0e30: 7d 0a 7d 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..//---------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 0a 2f 2f 20 e6 8c 87 e5 ae  -------.// .....
0e80: 9a e6 99 82 e5 88 bb 28 44 4f 53 e5 bd a2 e5 bc  .......(DOS.....
0e90: 8f 29 e3 82 88 e3 82 8a e6 96 b0 e3 81 97 e3 81  .)..............
0ea0: 84 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 8b  ................
0eb0: ef bc 9f 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ....//----------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 0a 0a 62 6f 6f 6c 20 6e 65 77  ------..bool new
0f00: 65 72 5f 74 68 61 6e 28 20 75 73 68 6f 72 74 20  er_than( ushort 
0f10: 64 31 2c 20 75 73 68 6f 72 74 20 74 31 2c 20 73  d1, ushort t1, s
0f20: 74 72 69 6e 67 20 66 6e 61 6d 65 20 29 0a 7b 0a  tring fname ).{.
0f30: 09 48 41 4e 44 4c 45 20 68 61 6e 20 3d 20 43 72  .HANDLE han = Cr
0f40: 65 61 74 65 46 69 6c 65 41 28 20 74 6f 53 74 72  eateFileA( toStr
0f50: 69 6e 67 7a 28 66 6e 61 6d 65 29 2c 0a 09 09 09  ingz(fname),....
0f60: 09 09 09 09 20 20 47 45 4e 45 52 49 43 5f 52 45  ....  GENERIC_RE
0f70: 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
0f80: 54 45 2c 0a 09 09 09 09 09 09 09 20 20 46 49 4c  TE,........  FIL
0f90: 45 5f 53 48 41 52 45 5f 52 45 41 44 2c 6e 75 6c  E_SHARE_READ,nul
0fa0: 6c 2c 0a 09 09 09 09 09 09 09 20 20 4f 50 45 4e  l,........  OPEN
0fb0: 5f 45 58 49 53 54 49 4e 47 2c 0a 09 09 09 09 09  _EXISTING,......
0fc0: 09 09 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ..  FILE_ATTRIBU
0fd0: 54 45 5f 4e 4f 52 4d 41 4c 2c 0a 09 09 09 09 09  TE_NORMAL,......
0fe0: 09 09 20 20 6e 75 6c 6c 20 29 3b 0a 09 69 66 28  ..  null );..if(
0ff0: 20 68 61 6e 3d 3d 49 4e 56 41 4c 49 44 5f 48 41   han==INVALID_HA
1000: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 0a 09 09 72  NDLE_VALUE )...r
1010: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 46 49  eturn false;..FI
1020: 4c 45 54 49 4d 45 20 66 74 3b 0a 09 47 65 74 46  LETIME ft;..GetF
1030: 69 6c 65 54 69 6d 65 28 20 68 61 6e 2c 20 6e 75  ileTime( han, nu
1040: 6c 6c 2c 20 6e 75 6c 6c 2c 20 26 66 74 20 29 3b  ll, null, &ft );
1050: 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 20 68  ..CloseHandle( h
1060: 61 6e 20 29 3b 0a 0a 09 46 49 4c 45 54 49 4d 45  an );...FILETIME
1070: 20 6c 63 3b 0a 09 46 69 6c 65 54 69 6d 65 54 6f   lc;..FileTimeTo
1080: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 20 26  LocalFileTime( &
1090: 66 74 2c 20 26 6c 63 20 29 3b 0a 09 75 73 68 6f  ft, &lc );..usho
10a0: 72 74 20 64 32 2c 20 74 32 3b 0a 09 46 69 6c 65  rt d2, t2;..File
10b0: 54 69 6d 65 54 6f 44 6f 73 44 61 74 65 54 69 6d  TimeToDosDateTim
10c0: 65 28 20 26 6c 63 2c 20 26 64 32 2c 20 26 74 32  e( &lc, &d2, &t2
10d0: 20 29 3b 0a 0a 09 69 66 28 20 64 31 20 3c 20 64   );...if( d1 < d
10e0: 32 20 29 0a 09 09 72 65 74 75 72 6e 20 74 72 75  2 )...return tru
10f0: 65 3b 0a 09 69 66 28 20 64 31 20 3d 3d 20 64 32  e;..if( d1 == d2
1100: 20 29 0a 09 09 72 65 74 75 72 6e 20 28 74 31 20   )...return (t1 
1110: 3c 20 74 32 29 3b 0a 09 72 65 74 75 72 6e 20 66  < t2);..return f
1120: 61 6c 73 65 3b 0a 7d 0a 0a                       alse;.}..