Artifact f4a72491493dc9ab440223d8350f75cc3936c50d:
- File
src/util.d
-
2015-05-05 06:49:05
- part of checkin
[9b639cf2d6]
on branch trunk
- Working version for update to 2.067.
The problem was __gshared. Replacing it with TLS fixed the issue. Remaining problem is that "hack.d"'s CloseHandle hack is not working anymore.
(user: kinaba) [annotate]
-
2015-05-05 06:49:05
- part of checkin
[9b639cf2d6]
on branch trunk
- Working version for update to 2.067.
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;.}..