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;.}..