Hex Artifact Content

Not logged in

Artifact f4a72491493dc9ab440223d8350f75cc3936c50d:


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 e3 82 b3 e3 83 9e e3 83 b3 e3 83  -.// ...........
00f0: 89 e3 83 a9 e3 82 a4 e3 83 b3 e8 a7 a3 e6 9e 90  ................
0100: 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .//-------------
0110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 0a 0a 73 74 72 69 6e 67 5b 5d 20 63 6d  ---..string[] cm
0150: 64 5f 70 61 72 73 65 28 20 73 74 72 69 6e 67 20  d_parse( string 
0160: 73 74 72 2c 20 62 6f 6f 6c 20 69 6e 5f 72 65 73  str, bool in_res
0170: 70 3d 66 61 6c 73 65 20 29 0a 7b 0a 09 73 74 72  p=false ).{..str
0180: 69 6e 67 5b 5d 20 61 6e 73 3b 0a 09 63 68 61 72  ing[] ans;..char
0190: 20 72 65 73 70 5f 63 68 61 72 20 3d 20 27 40 27   resp_char = '@'
01a0: 3b 0a 0a 09 66 6f 72 28 69 6e 74 20 69 3d 30 3b  ;...for(int i=0;
01b0: 20 69 21 3d 73 74 72 2e 6c 65 6e 67 74 68 3b 20   i!=str.length; 
01c0: 29 0a 09 7b 0a 09 09 2f 2f 20 e7 a9 ba e7 99 bd  )..{...// ......
01d0: e3 82 b9 e3 82 ad e3 83 83 e3 83 97 0a 09 09 77  ...............w
01e0: 68 69 6c 65 28 20 69 21 3d 73 74 72 2e 6c 65 6e  hile( i!=str.len
01f0: 67 74 68 20 26 26 20 30 3c 3d 73 74 72 5b 69 5d  gth && 0<=str[i]
0200: 20 26 26 20 73 74 72 5b 69 5d 3c 3d 27 20 27 20   && str[i]<=' ' 
0210: 29 0a 09 09 09 2b 2b 69 3b 0a 09 09 69 66 28 20  )....++i;...if( 
0220: 69 20 3d 3d 20 73 74 72 2e 6c 65 6e 67 74 68 20  i == str.length 
0230: 29 0a 09 09 09 62 72 65 61 6b 3b 0a 0a 09 09 2f  )....break;..../
0240: 2f 20 22 22 e3 82 92 e8 80 83 e6 85 ae e3 81 97  / ""............
0250: e3 81 a6 e4 b8 80 e5 80 8b e3 83 91 e3 83 a9 e3  ................
0260: 83 a1 e3 82 bf e5 88 87 e3 82 8a e5 87 ba e3 81  ................
0270: 97 0a 09 09 73 74 72 69 6e 67 20 70 61 72 61 6d  ....string param
0280: 3b 0a 09 09 69 66 28 20 73 74 72 5b 69 5d 20 3d  ;...if( str[i] =
0290: 3d 20 27 22 27 20 29 0a 09 09 7b 0a 09 09 09 69  = '"' )...{....i
02a0: 6e 74 20 6a 20 3d 20 2b 2b 69 3b 0a 09 09 09 77  nt j = ++i;....w
02b0: 68 69 6c 65 28 20 6a 21 3d 73 74 72 2e 6c 65 6e  hile( j!=str.len
02c0: 67 74 68 20 29 0a 09 09 09 7b 0a 09 09 09 09 69  gth )....{.....i
02d0: 66 28 20 73 74 72 5b 6a 5d 3d 3d 27 22 27 20 26  f( str[j]=='"' &
02e0: 26 0a 09 09 09 09 20 20 20 20 20 28 6a 2b 31 3d  &.....     (j+1=
02f0: 3d 73 74 72 2e 6c 65 6e 67 74 68 20 7c 7c 20 30  =str.length || 0
0300: 3c 3d 73 74 72 5b 6a 2b 31 5d 20 26 26 20 73 74  <=str[j+1] && st
0310: 72 5b 6a 2b 31 5d 3c 3d 27 20 27 29 20 29 0a 09  r[j+1]<=' ') )..
0320: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 2b  ....break;.....+
0330: 2b 6a 3b 0a 09 09 09 7d 0a 09 09 09 70 61 72 61  +j;....}....para
0340: 6d 20 3d 20 73 74 72 5b 69 20 2e 2e 20 6a 5d 3b  m = str[i .. j];
0350: 0a 09 09 09 69 20 3d 20 28 6a 3d 3d 73 74 72 2e  ....i = (j==str.
0360: 6c 65 6e 67 74 68 20 3f 20 6a 20 3a 20 6a 2b 31  length ? j : j+1
0370: 29 3b 0a 09 09 7d 0a 09 09 65 6c 73 65 0a 09 09  );...}...else...
0380: 7b 0a 09 09 09 69 6e 74 20 6a 3d 69 3b 0a 09 09  {....int j=i;...
0390: 09 77 68 69 6c 65 28 20 6a 21 3d 73 74 72 2e 6c  .while( j!=str.l
03a0: 65 6e 67 74 68 20 26 26 20 28 73 74 72 5b 6a 5d  ength && (str[j]
03b0: 3c 30 20 7c 7c 20 27 20 27 3c 73 74 72 5b 6a 5d  <0 || ' '<str[j]
03c0: 29 20 29 0a 09 09 09 09 2b 2b 6a 3b 0a 09 09 09  ) ).....++j;....
03d0: 70 61 72 61 6d 20 3d 20 73 74 72 5b 69 20 2e 2e  param = str[i ..
03e0: 20 6a 5d 3b 0a 09 09 09 69 20 3d 20 6a 3b 0a 09   j];....i = j;..
03f0: 09 7d 0a 0a 09 09 2f 2f 20 e3 83 ac e3 82 b9 e3  .}....// .......
0400: 83 9d e3 83 b3 e3 82 b9 e3 83 95 e3 82 a1 e3 82  ................
0410: a4 e3 83 ab e9 96 a2 e9 80 a3 e3 81 ae e5 87 a6  ................
0420: e7 90 86 0a 09 09 69 66 28 20 21 69 6e 5f 72 65  ......if( !in_re
0430: 73 70 20 26 26 20 70 61 72 61 6d 5b 30 5d 3d 3d  sp && param[0]==
0440: 72 65 73 70 5f 63 68 61 72 20 29 0a 09 09 7b 0a  resp_char )...{.
0450: 09 09 09 74 72 79 20 7b 0a 09 09 09 09 73 74 72  ...try {.....str
0460: 69 6e 67 20 72 73 70 20 3d 20 63 61 73 74 28 73  ing rsp = cast(s
0470: 74 72 69 6e 67 29 20 73 74 64 2e 66 69 6c 65 2e  tring) std.file.
0480: 72 65 61 64 28 20 70 61 72 61 6d 5b 31 2e 2e 24  read( param[1..$
0490: 5d 20 29 3b 0a 09 09 09 09 61 6e 73 20 7e 3d 20  ] );.....ans ~= 
04a0: 63 6d 64 5f 70 61 72 73 65 28 72 73 70 2c 74 72  cmd_parse(rsp,tr
04b0: 75 65 29 3b 0a 09 09 09 7d 20 63 61 74 63 68 28  ue);....} catch(
04c0: 20 46 69 6c 65 45 78 63 65 70 74 69 6f 6e 20 65   FileException e
04d0: 20 29 20 7b 7d 0a 09 09 7d 0a 09 09 65 6c 73 65   ) {}...}...else
04e0: 20 69 66 28 20 70 61 72 61 6d 2e 6c 65 6e 67 74   if( param.lengt
04f0: 68 3e 3d 32 20 26 26 20 70 61 72 61 6d 5b 30 2e  h>=2 && param[0.
0500: 2e 32 5d 3d 3d 22 2d 2d 22 20 29 0a 09 09 7b 0a  .2]=="--" )...{.
0510: 09 09 09 72 65 73 70 5f 63 68 61 72 20 3d 20 28  ...resp_char = (
0520: 70 61 72 61 6d 2e 6c 65 6e 67 74 68 3d 3d 32 20  param.length==2 
0530: 3f 20 27 5c 30 27 20 3a 20 70 61 72 61 6d 5b 32  ? '\0' : param[2
0540: 5d 29 3b 0a 09 09 7d 0a 09 09 65 6c 73 65 0a 09  ]);...}...else..
0550: 09 7b 0a 09 09 09 61 6e 73 20 7e 3d 20 70 61 72  .{....ans ~= par
0560: 61 6d 3b 20 2f 2f 20 e6 99 ae e9 80 9a e3 81 ab  am; // .........
0570: e3 83 91 e3 83 a9 e3 83 a1 e3 82 bf e8 bf bd e5  ................
0580: 8a a0 0a 09 09 7d 0a 09 7d 0a 09 72 65 74 75 72  .....}..}..retur
0590: 6e 20 61 6e 73 3b 0a 7d 0a 0a 2f 2f 2d 2d 2d 2d  n ans;.}..//----
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2f 2f 20  ------------.// 
05e0: 44 4f 53 e5 bd a2 e5 bc 8f e3 81 a7 e3 83 95 e3  DOS.............
05f0: 82 a1 e3 82 a4 e3 83 ab e9 9f b3 e6 9b b4 e6 96  ................
0600: b0 e6 99 82 e5 88 bb e3 82 92 e6 9b b8 e3 81 8d  ................
0610: e6 8f 9b e3 81 88 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d  .......//-------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 76 6f 69 64 20  ---------..void 
0660: 64 6f 73 53 65 74 46 54 69 6d 65 28 20 73 74 72  dosSetFTime( str
0670: 69 6e 67 20 66 6e 61 6d 65 2c 20 75 73 68 6f 72  ing fname, ushor
0680: 74 20 64 61 74 65 2c 20 75 73 68 6f 72 74 20 74  t date, ushort t
0690: 69 6d 65 20 29 0a 7b 0a 09 46 49 4c 45 54 49 4d  ime ).{..FILETIM
06a0: 45 20 66 74 2c 6c 63 3b 0a 09 69 66 28 20 44 6f  E ft,lc;..if( Do
06b0: 73 44 61 74 65 54 69 6d 65 54 6f 46 69 6c 65 54  sDateTimeToFileT
06c0: 69 6d 65 28 20 64 61 74 65 2c 20 74 69 6d 65 2c  ime( date, time,
06d0: 20 26 6c 63 20 29 20 29 0a 09 09 69 66 28 20 4c   &lc ) )...if( L
06e0: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 54 6f 46 69  ocalFileTimeToFi
06f0: 6c 65 54 69 6d 65 28 20 26 6c 63 2c 20 26 66 74  leTime( &lc, &ft
0700: 20 29 20 29 0a 09 09 7b 0a 09 09 09 48 41 4e 44   ) )...{....HAND
0710: 4c 45 20 68 61 6e 20 3d 20 43 72 65 61 74 65 46  LE han = CreateF
0720: 69 6c 65 41 28 20 74 6f 53 74 72 69 6e 67 7a 28  ileA( toStringz(
0730: 66 6e 61 6d 65 29 2c 0a 09 09 09 09 09 09 09 09  fname),.........
0740: 09 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20  .  GENERIC_READ 
0750: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  | GENERIC_WRITE,
0760: 0a 09 09 09 09 09 09 09 09 09 20 20 46 49 4c 45  ..........  FILE
0770: 5f 53 48 41 52 45 5f 52 45 41 44 2c 6e 75 6c 6c  _SHARE_READ,null
0780: 2c 0a 09 09 09 09 09 09 09 09 09 20 20 4f 50 45  ,..........  OPE
0790: 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 09 09 09  N_EXISTING,.....
07a0: 09 09 09 09 09 20 20 46 49 4c 45 5f 41 54 54 52  .....  FILE_ATTR
07b0: 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 0a 09 09  IBUTE_NORMAL,...
07c0: 09 09 09 09 09 09 09 20 20 6e 75 6c 6c 20 29 3b  .......  null );
07d0: 0a 09 09 09 69 66 28 20 68 61 6e 3d 3d 49 4e 56  ....if( han==INV
07e0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
07f0: 45 20 29 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a  E ).....return;.
0800: 0a 09 09 09 53 65 74 46 69 6c 65 54 69 6d 65 28  ....SetFileTime(
0810: 20 68 61 6e 2c 26 66 74 2c 6e 75 6c 6c 2c 26 66   han,&ft,null,&f
0820: 74 20 29 3b 0a 09 09 09 43 6c 6f 73 65 48 61 6e  t );....CloseHan
0830: 64 6c 65 28 20 68 61 6e 20 29 3b 0a 09 09 7d 0a  dle( han );...}.
0840: 7d 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..//-----------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0880: 2d 2d 2d 2d 2d 0a 2f 2f 20 e6 8c 87 e5 ae 9a e6  -----.// .......
0890: 99 82 e5 88 bb 28 44 4f 53 e5 bd a2 e5 bc 8f 29  .....(DOS......)
08a0: e3 82 88 e3 82 8a e6 96 b0 e3 81 97 e3 81 84 e3  ................
08b0: 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 8b ef bc  ................
08c0: 9f 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..//------------
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 0a 0a 62 6f 6f 6c 20 6e 65 77 65 72  ----..bool newer
0910: 5f 74 68 61 6e 28 20 75 73 68 6f 72 74 20 64 31  _than( ushort d1
0920: 2c 20 75 73 68 6f 72 74 20 74 31 2c 20 73 74 72  , ushort t1, str
0930: 69 6e 67 20 66 6e 61 6d 65 20 29 0a 7b 0a 09 48  ing fname ).{..H
0940: 41 4e 44 4c 45 20 68 61 6e 20 3d 20 43 72 65 61  ANDLE han = Crea
0950: 74 65 46 69 6c 65 41 28 20 74 6f 53 74 72 69 6e  teFileA( toStrin
0960: 67 7a 28 66 6e 61 6d 65 29 2c 0a 09 09 09 09 09  gz(fname),......
0970: 09 09 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44  ..  GENERIC_READ
0980: 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
0990: 2c 0a 09 09 09 09 09 09 09 20 20 46 49 4c 45 5f  ,........  FILE_
09a0: 53 48 41 52 45 5f 52 45 41 44 2c 6e 75 6c 6c 2c  SHARE_READ,null,
09b0: 0a 09 09 09 09 09 09 09 20 20 4f 50 45 4e 5f 45  ........  OPEN_E
09c0: 58 49 53 54 49 4e 47 2c 0a 09 09 09 09 09 09 09  XISTING,........
09d0: 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
09e0: 5f 4e 4f 52 4d 41 4c 2c 0a 09 09 09 09 09 09 09  _NORMAL,........
09f0: 20 20 6e 75 6c 6c 20 29 3b 0a 09 69 66 28 20 68    null );..if( h
0a00: 61 6e 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  an==INVALID_HAND
0a10: 4c 45 5f 56 41 4c 55 45 20 29 0a 09 09 72 65 74  LE_VALUE )...ret
0a20: 75 72 6e 20 66 61 6c 73 65 3b 0a 09 46 49 4c 45  urn false;..FILE
0a30: 54 49 4d 45 20 66 74 3b 0a 09 47 65 74 46 69 6c  TIME ft;..GetFil
0a40: 65 54 69 6d 65 28 20 68 61 6e 2c 20 6e 75 6c 6c  eTime( han, null
0a50: 2c 20 6e 75 6c 6c 2c 20 26 66 74 20 29 3b 0a 09  , null, &ft );..
0a60: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 20 68 61 6e  CloseHandle( han
0a70: 20 29 3b 0a 0a 09 46 49 4c 45 54 49 4d 45 20 6c   );...FILETIME l
0a80: 63 3b 0a 09 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  c;..FileTimeToLo
0a90: 63 61 6c 46 69 6c 65 54 69 6d 65 28 20 26 66 74  calFileTime( &ft
0aa0: 2c 20 26 6c 63 20 29 3b 0a 09 75 73 68 6f 72 74  , &lc );..ushort
0ab0: 20 64 32 2c 20 74 32 3b 0a 09 46 69 6c 65 54 69   d2, t2;..FileTi
0ac0: 6d 65 54 6f 44 6f 73 44 61 74 65 54 69 6d 65 28  meToDosDateTime(
0ad0: 20 26 6c 63 2c 20 26 64 32 2c 20 26 74 32 20 29   &lc, &d2, &t2 )
0ae0: 3b 0a 0a 09 69 66 28 20 64 31 20 3c 20 64 32 20  ;...if( d1 < d2 
0af0: 29 0a 09 09 72 65 74 75 72 6e 20 74 72 75 65 3b  )...return true;
0b00: 0a 09 69 66 28 20 64 31 20 3d 3d 20 64 32 20 29  ..if( d1 == d2 )
0b10: 0a 09 09 72 65 74 75 72 6e 20 28 74 31 20 3c 20  ...return (t1 < 
0b20: 74 32 29 3b 0a 09 72 65 74 75 72 6e 20 66 61 6c  t2);..return fal
0b30: 73 65 3b 0a 7d 0a 0a                             se;.}..