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 63 2e 73 74 64 69 6f 3b 0a 69 6d 70 std.c.stdio;.imp
0030: 6f 72 74 20 73 74 64 2e 66 69 6c 65 3b 0a 69 6d ort std.file;.im
0040: 70 6f 72 74 20 73 74 64 2e 73 74 72 69 6e 67 3b port std.string;
0050: 0a 69 6d 70 6f 72 74 20 65 74 63 2e 63 2e 7a 6c .import etc.c.zl
0060: 69 62 3b 0a 69 6d 70 6f 72 74 20 6c 69 62 62 7a ib;.import libbz
0070: 32 2e 62 7a 6c 69 62 3b 0a 69 6d 70 6f 72 74 20 2.bzlib;.import
0080: 75 74 69 6c 3b 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d util;..//-------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00a0: 2d 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 0a 2f 2f 20 42 67 61 ---------.// Bga
00d0: e6 9b b8 e5 ba ab e3 81 ae e3 83 95 e3 82 a1 e3 ................
00e0: 82 a4 e3 83 ab e3 83 98 e3 83 83 e3 83 80 e5 bd ................
00f0: a2 e5 bc 8f 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d .....//---------
0100: 2d 2d 2d 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 0a 0a 61 6c 69 67 6e 28 31 -------..align(1
0140: 29 20 73 74 72 75 63 74 20 42 67 61 48 65 61 64 ) struct BgaHead
0150: 65 72 0a 7b 0a 09 20 69 6e 74 20 20 20 63 68 65 er.{.. int che
0160: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 2f 2f cksum; //
0170: 20 74 79 70 65 ef bd 9e 66 6e 61 6d 65 20 e3 81 type...fname ..
0180: ae 73 69 67 6e 65 64 20 63 68 61 72 e3 81 a7 e3 .signed char....
0190: 81 ae e5 92 8c 0a 09 63 68 61 72 20 20 20 6d 65 .......char me
01a0: 74 68 6f 64 5b 34 5d 3b 20 20 20 20 20 20 20 2f thod[4]; /
01b0: 2f 20 22 47 5a 49 50 22 20 e3 81 be e3 81 9f e3 / "GZIP" .......
01c0: 81 af 20 22 42 5a 32 5c 30 22 0a 09 75 69 6e 74 .. "BZ2\0"..uint
01d0: 20 20 20 63 6f 6d 70 72 65 73 73 65 64 5f 73 69 compressed_si
01e0: 7a 65 3b 20 2f 2f 20 e5 9c a7 e7 b8 ae e5 be 8c ze; // .........
01f0: e3 81 ae e3 83 87 e3 83 bc e3 82 bf e3 82 b5 e3 ................
0200: 82 a4 e3 82 ba 28 20 e3 83 98 e3 83 83 e3 83 80 .....( .........
0210: e3 81 af e5 90 ab e3 81 be e3 81 aa e3 81 84 20 ...............
0220: 29 0a 09 75 69 6e 74 20 20 20 6f 72 69 67 69 6e )..uint origin
0230: 61 6c 5f 73 69 7a 65 3b 20 20 20 2f 2f 20 e5 85 al_size; // ..
0240: 83 e3 81 ae e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab ................
0250: e3 82 b5 e3 82 a4 e3 82 ba 0a 09 75 73 68 6f 72 ...........ushor
0260: 74 20 64 61 74 65 3b 20 20 20 20 20 20 20 20 20 t date;
0270: 20 20 20 2f 2f 20 e3 83 95 e3 82 a1 e3 82 a4 e3 // ..........
0280: 83 ab e3 81 ae e6 9b b4 e6 96 b0 e6 97 a5 e4 bb ................
0290: 98 28 20 44 4f 53 e5 bd a2 e5 bc 8f 20 29 0a 09 .( DOS...... )..
02a0: 75 73 68 6f 72 74 20 74 69 6d 65 3b 20 20 20 20 ushort time;
02b0: 20 20 20 20 20 20 20 20 2f 2f 20 e3 83 95 e3 82 // .....
02c0: a1 e3 82 a4 e3 83 ab e3 81 ae e6 9b b4 e6 96 b0 ................
02d0: e6 99 82 e5 88 bb 28 20 44 4f 53 e5 bd a2 e5 bc ......( DOS.....
02e0: 8f 20 29 0a 09 75 62 79 74 65 20 20 61 74 74 72 . )..ubyte attr
02f0: 69 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2f 20 ib; //
0300: e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 ae e5 ................
0310: b1 9e e6 80 a7 0a 09 20 20 20 20 20 20 20 20 20 .......
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
0330: 2f 20 28 20 31 3a 52 4f 20 32 3a 48 69 64 20 34 / ( 1:RO 2:Hid 4
0340: 3a 53 79 73 20 38 3a 56 6f 6c 20 31 36 3a 44 69 :Sys 8:Vol 16:Di
0350: 72 20 33 32 3a 41 72 63 20 29 0a 09 75 62 79 74 r 32:Arc )..ubyt
0360: 65 20 20 68 65 61 64 65 72 5f 74 79 70 65 3b 20 e header_type;
0370: 20 20 20 20 2f 2f 20 e3 83 98 e3 83 83 e3 83 80 // .........
0380: e3 81 ae e7 a8 ae e9 a1 9e 28 20 e7 8f be e5 9c .........( .....
0390: a8 e3 81 af e5 b8 b8 e3 81 ab 20 30 20 29 0a 09 .......... 0 )..
03a0: 75 73 68 6f 72 74 20 61 72 63 5f 74 79 70 65 3b ushort arc_type;
03b0: 20 20 20 20 20 20 20 20 2f 2f 20 e3 82 a2 e3 83 // .....
03c0: bc e3 82 ab e3 82 a4 e3 83 96 e3 82 bf e3 82 a4 ................
03d0: e3 83 97 0a 09 20 20 20 20 20 20 20 20 20 20 20 .....
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 //
03f0: 30 3a 28 65 78 74 3d 3d e2 86 93 3f e9 9d 9e e5 0:(ext==...?....
0400: 9c a7 e7 b8 ae 3a e5 9c a7 e7 b8 ae 29 20 31 3a .....:......) 1:
0410: e5 9c a7 e7 b8 ae 20 32 3a e9 9d 9e e5 9c a7 e7 ...... 2:.......
0420: b8 ae 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 ....
0430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 09 2e //..
0440: 41 52 43 2c 20 2e 41 52 4a 2c 20 2e 42 5a 32 2c ARC, .ARJ, .BZ2,
0450: 20 2e 42 5a 41 2c 20 2e 43 41 42 2c 20 2e 47 5a .BZA, .CAB, .GZ
0460: 2c 20 2e 47 5a 41 2c 20 2e 4c 5a 48 2c 0a 09 20 , .GZA, .LZH,..
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0480: 20 20 20 20 20 20 20 2f 2f 09 2e 4c 5a 53 2c 20 //..LZS,
0490: 2e 50 41 4b 2c 20 2e 52 41 52 2c 20 2e 54 41 5a .PAK, .RAR, .TAZ
04a0: 2c 20 2e 54 42 5a 2c 20 2e 54 47 5a 2c 20 2e 5a , .TBZ, .TGZ, .Z
04b0: 2c 20 2e 5a 49 50 2c 20 2e 5a 4f 4f 0a 09 75 73 , .ZIP, .ZOO..us
04c0: 68 6f 72 74 20 64 69 72 5f 6e 61 6d 65 5f 6c 65 hort dir_name_le
04d0: 6e 3b 20 20 20 20 2f 2f 20 e3 83 87 e3 82 a3 e3 n; // .......
04e0: 83 ac e3 82 af e3 83 88 e3 83 aa e5 90 8d e3 81 ................
04f0: ae e9 95 b7 e3 81 95 0a 09 75 73 68 6f 72 74 20 .........ushort
0500: 66 69 6c 65 5f 6e 61 6d 65 5f 6c 65 6e 3b 20 20 file_name_len;
0510: 20 2f 2f 20 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab // ............
0520: e5 90 8d e3 81 ae e9 95 b7 e3 81 95 0a 09 73 74 ..............st
0530: 72 69 6e 67 20 66 6e 61 6d 65 3b 20 20 20 20 20 ring fname;
0540: 20 20 20 20 20 20 2f 2f 20 64 69 72 5f 6e 61 6d // dir_nam
0550: 65 5f 6c 65 6e 20 2b 20 66 69 6c 65 5f 6e 61 6d e_len + file_nam
0560: 65 5f 6c 65 6e 20 28 20 6e 6f 20 27 5c 30 27 20 e_len ( no '\0'
0570: 29 0a 7d 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d ).}..//---------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 2f 2f 20 e3 82 a8 e3 83 -------.// .....
05c0: a9 e3 83 bc e7 99 ba e7 94 9f e6 99 82 e3 81 ab ................
05d0: e6 8a 95 e3 81 92 e3 82 8b e4 be 8b e5 a4 96 0a ................
05e0: 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d //--------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0620: 2d 2d 0a 0a 63 6c 61 73 73 20 42 67 61 4d 65 6c --..class BgaMel
0630: 74 65 72 45 72 72 6f 72 20 3a 20 45 72 72 6f 72 terError : Error
0640: 0a 7b 0a 09 69 6e 74 20 65 72 72 63 6f 64 65 3b .{..int errcode;
0650: 0a 09 74 68 69 73 28 20 69 6e 74 20 65 20 29 20 ..this( int e )
0660: 7b 20 73 75 70 65 72 28 22 42 67 61 4d 65 6c 74 { super("BgaMelt
0670: 65 72 45 72 72 6f 72 22 29 3b 20 65 72 72 63 6f erError"); errco
0680: 64 65 3d 65 3b 20 7d 0a 7d 0a 0a 65 6e 75 6d 0a de=e; }.}..enum.
0690: 7b 0a 09 45 52 52 4f 52 5f 46 49 4c 45 5f 4f 50 {..ERROR_FILE_OP
06a0: 45 4e 3d 30 78 38 30 30 44 2c 2f 2f 20 20 20 20 EN=0x800D,//
06b0: 20 20 20 20 20 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ...........
06c0: ab e3 82 92 e9 96 8b e3 81 91 e3 81 be e3 81 9b ................
06d0: e3 82 93 e3 81 a7 e3 81 97 e3 81 9f e3 80 82 0a ................
06e0: 09 45 52 52 4f 52 5f 4d 41 4b 45 44 49 52 45 43 .ERROR_MAKEDIREC
06f0: 54 4f 52 59 3d 30 78 38 30 31 32 2c 2f 2f 20 20 TORY=0x8012,//
0700: 20 20 20 e3 83 87 e3 82 a3 e3 83 ac e3 82 af e3 .............
0710: 83 88 e3 83 aa e3 81 8c e4 bd 9c e6 88 90 e3 81 ................
0720: a7 e3 81 8d e3 81 be e3 81 9b e3 82 93 e3 80 82 ................
0730: 0a 09 45 52 52 4f 52 5f 43 41 4e 4e 4f 54 5f 57 ..ERROR_CANNOT_W
0740: 52 49 54 45 3d 30 78 38 30 31 33 2c 2f 2f 20 20 RITE=0x8013,//
0750: 20 20 20 20 e6 9b b8 e3 81 8d e8 be bc e3 81 bf ............
0760: e3 82 a8 e3 83 a9 e3 83 bc e3 81 8c e7 94 9f e3 ................
0770: 81 98 e3 81 be e3 81 97 e3 81 9f e3 80 82 0a 09 ................
0780: 45 52 52 4f 52 5f 48 45 41 44 45 52 5f 43 52 43 ERROR_HEADER_CRC
0790: 3d 30 78 38 30 31 36 2c 2f 2f 20 20 20 20 20 20 =0x8016,//
07a0: 20 20 e6 9b b8 e5 ba ab e3 81 ae e3 83 98 e3 83 ..............
07b0: 83 e3 83 80 e3 81 ae e3 83 81 e3 82 a7 e3 83 83 ................
07c0: e3 82 af e3 82 b5 e3 83 a0 e3 81 8c e5 90 88 e3 ................
07d0: 81 a3 e3 81 a6 e3 81 84 e3 81 be e3 81 9b e3 82 ................
07e0: 93 e3 80 82 0a 09 45 52 52 4f 52 5f 41 52 43 5f ......ERROR_ARC_
07f0: 46 49 4c 45 5f 4f 50 45 4e 3d 30 78 38 30 31 38 FILE_OPEN=0x8018
0800: 2c 2f 2f 20 20 20 20 20 e6 9b b8 e5 ba ab e3 82 ,// ........
0810: 92 e9 96 8b e3 81 8f e4 ba 8b e3 81 8c e5 87 ba ................
0820: e6 9d a5 e3 81 be e3 81 9b e3 82 93 e3 80 82 0a ................
0830: 09 45 52 52 4f 52 5f 4e 4f 54 5f 41 52 43 5f 46 .ERROR_NOT_ARC_F
0840: 49 4c 45 3d 30 78 38 30 31 39 2c 2f 2f 20 20 20 ILE=0x8019,//
0850: 20 20 20 e6 9b b8 e5 ba ab e3 81 ae e3 83 95 e3 .............
0860: 82 a1 e3 82 a4 e3 83 ab e5 90 8d e3 81 8c e6 8c ................
0870: 87 e5 ae 9a e3 81 95 e3 82 8c e3 81 a6 e3 81 84 ................
0880: e3 81 be e3 81 9b e3 82 93 e3 80 82 0a 09 45 52 ..............ER
0890: 52 4f 52 5f 43 41 4e 4e 4f 54 5f 52 45 41 44 3d ROR_CANNOT_READ=
08a0: 30 78 38 30 31 41 2c 2f 2f 20 20 20 20 20 20 20 0x801A,//
08b0: e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 ae e8 ................
08c0: aa ad e3 81 bf e8 be bc e3 81 bf e6 99 82 e3 81 ................
08d0: ab e3 82 a8 e3 83 a9 e3 83 bc e3 81 8c e7 94 9f ................
08e0: e3 81 98 e3 81 be e3 81 97 e3 81 9f e3 80 82 0a ................
08f0: 09 45 52 52 4f 52 5f 46 49 4c 45 5f 53 54 59 4c .ERROR_FILE_STYL
0900: 45 3d 30 78 38 30 31 42 2c 2f 2f 20 20 20 20 20 E=0x801B,//
0910: 20 20 20 e6 8c 87 e5 ae 9a e3 81 95 e3 82 8c e3 .............
0920: 81 9f e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 ................
0930: af e6 9c 89 e5 8a b9 e3 81 aa e6 9b b8 e5 ba ab ................
0940: e3 81 a7 e3 81 af e3 81 82 e3 82 8a e3 81 be e3 ................
0950: 81 9b e3 82 93 e3 80 82 0a 09 45 52 52 4f 52 5f ..........ERROR_
0960: 43 4f 4d 4d 41 4e 44 5f 4e 41 4d 45 3d 30 78 38 COMMAND_NAME=0x8
0970: 30 31 43 2c 2f 2f 20 20 20 20 20 20 e3 82 b3 e3 01C,// ....
0980: 83 9e e3 83 b3 e3 83 89 e6 8c 87 e5 ae 9a e3 81 ................
0990: 8c e9 96 93 e9 81 95 e3 81 a3 e3 81 a6 e3 81 84 ................
09a0: e3 81 be e3 81 99 e3 80 82 0a 09 45 52 52 4f 52 ...........ERROR
09b0: 5f 4d 4f 52 45 5f 48 45 41 50 5f 4d 45 4d 4f 52 _MORE_HEAP_MEMOR
09c0: 59 3d 30 78 38 30 31 44 2c 2f 2f 20 20 e4 bd 9c Y=0x801D,// ...
09d0: e6 a5 ad e7 94 a8 e3 81 ae e3 81 9f e3 82 81 e3 ................
09e0: 81 ae e3 83 92 e3 83 bc e3 83 97 e3 83 a1 e3 83 ................
09f0: a2 e3 83 aa e3 81 8c e4 b8 8d e8 b6 b3 e3 81 97 ................
0a00: e3 81 a6 e3 81 84 e3 81 be e3 81 99 e3 80 82 0a ................
0a10: 09 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 52 .ERROR_ALREADY_R
0a20: 55 4e 4e 49 4e 47 3d 30 78 38 30 31 46 2c 2f 2f UNNING=0x801F,//
0a30: 20 20 20 e6 97 a2 e3 81 ab 20 42 47 41 33 32 2e ...... BGA32.
0a40: 44 4c 4c 20 e3 81 8c e5 8b 95 e4 bd 9c e4 b8 ad DLL ............
0a50: e3 81 a7 e3 81 99 e3 80 82 0a 09 45 52 52 4f 52 ...........ERROR
0a60: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 3d 30 78 38 _USER_CANCEL=0x8
0a70: 30 32 30 2c 2f 2f 20 20 20 20 20 20 20 e3 83 a6 020,// ...
0a80: e3 83 bc e3 82 b6 e3 83 bc e3 81 ab e3 82 88 e3 ................
0a90: 81 a3 e3 81 a6 e5 87 a6 e7 90 86 e3 82 92 e4 b8 ................
0aa0: ad e6 96 ad e3 81 95 e3 82 8c e3 81 be e3 81 97 ................
0ab0: e3 81 9f e3 80 82 0a 09 45 52 52 4f 52 5f 54 4d ........ERROR_TM
0ac0: 50 5f 4f 50 45 4e 3d 30 78 38 30 32 35 2c 2f 2f P_OPEN=0x8025,//
0ad0: 20 20 20 20 20 20 20 20 20 20 e4 bd 9c e6 a5 ad ......
0ae0: e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 8c e4 ................
0af0: bd 9c e6 88 90 e3 81 a7 e3 81 8d e3 81 be e3 81 ................
0b00: 9b e3 82 93 e3 80 82 0a 09 45 52 52 4f 52 5f 41 .........ERROR_A
0b10: 52 43 5f 52 45 41 44 5f 4f 4e 4c 59 3d 30 78 38 RC_READ_ONLY=0x8
0b20: 30 32 37 2c 2f 2f 20 20 20 20 20 e6 9b b8 e3 81 027,// .....
0b30: 8d e8 be bc e3 81 bf e5 b0 82 e7 94 a8 e5 b1 9e ................
0b40: e6 80 a7 e3 81 ae e6 9b b8 e5 ba ab e3 81 ab e5 ................
0b50: af be e3 81 99 e3 82 8b e6 93 8d e4 bd 9c e3 81 ................
0b60: af e3 81 a7 e3 81 8d e3 81 be e3 81 9b e3 82 93 ................
0b70: e3 80 82 0a 09 45 52 52 4f 52 5f 4e 4f 54 5f 46 .....ERROR_NOT_F
0b80: 49 4e 44 5f 41 52 43 5f 46 49 4c 45 3d 30 78 38 IND_ARC_FILE=0x8
0b90: 30 32 39 2c 2f 2f 20 e6 8c 87 e5 ae 9a e3 81 95 029,// .........
0ba0: e3 82 8c e3 81 9f e3 83 87 e3 82 a3 e3 83 ac e3 ................
0bb0: 82 af e3 83 88 e3 83 aa e3 81 ab e3 81 af e6 9b ................
0bc0: b8 e5 ba ab e3 81 8c e3 81 82 e3 82 8a e3 81 be ................
0bd0: e3 81 9b e3 82 93 e3 81 a7 e3 81 97 e3 81 9f e3 ................
0be0: 80 82 0a 09 45 52 52 4f 52 5f 52 45 53 50 4f 4e ....ERROR_RESPON
0bf0: 53 45 5f 52 45 41 44 3d 30 78 38 30 32 41 2c 2f SE_READ=0x802A,/
0c00: 2f 20 20 20 20 20 e3 83 ac e3 82 b9 e3 83 9d e3 / ..........
0c10: 83 b3 e3 82 b9 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ................
0c20: ab e3 81 ae e8 aa ad e3 81 bf e8 be bc e3 81 bf ................
0c30: e6 99 82 e3 81 ab e3 82 a8 e3 83 a9 e3 83 bc e3 ................
0c40: 81 8c e7 94 9f e3 81 98 e3 81 be e3 81 97 e3 81 ................
0c50: 9f e3 80 82 0a 09 45 52 52 4f 52 5f 54 4d 50 5f ......ERROR_TMP_
0c60: 43 4f 50 59 3d 30 78 38 30 32 43 2c 2f 2f 20 20 COPY=0x802C,//
0c70: 20 20 20 20 20 20 20 20 e4 bd 9c e6 a5 ad e3 83 ........
0c80: 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 ae e6 9b b8 ................
0c90: e5 ba ab e3 81 b8 e3 81 ae e6 9b b8 e3 81 8d e6 ................
0ca0: 88 bb e3 81 97 e3 81 8c e3 81 a7 e3 81 8d e3 81 ................
0cb0: be e3 81 9b e3 82 93 e3 81 a7 e3 81 97 e3 81 9f ................
0cc0: e3 80 82 0a 09 45 52 52 4f 52 5f 4e 4f 54 5f 46 .....ERROR_NOT_F
0cd0: 49 4e 44 5f 46 49 4c 45 3d 30 78 38 30 33 31 2c IND_FILE=0x8031,
0ce0: 2f 2f 20 20 20 20 20 e3 83 95 e3 82 a1 e3 82 a4 // .........
0cf0: e3 83 ab e3 81 8c e8 a6 8b e3 81 a4 e3 81 8b e3 ................
0d00: 82 8a e3 81 be e3 81 9b e3 82 93 e3 80 82 0a 09 ................
0d10: 45 52 52 4f 52 5f 47 45 54 5f 41 54 54 52 49 42 ERROR_GET_ATTRIB
0d20: 55 54 45 53 3d 30 78 38 30 33 34 2c 2f 2f 20 20 UTES=0x8034,//
0d30: 20 20 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e5 b1 ..............
0d40: 9e e6 80 a7 e3 81 8c e5 8f 96 e5 be 97 e3 81 a7 ................
0d50: e3 81 8d e3 81 be e3 81 9b e3 82 93 e3 80 82 0a ................
0d60: 09 45 52 52 4f 52 5f 47 45 54 5f 49 4e 46 4f 52 .ERROR_GET_INFOR
0d70: 4d 41 54 49 4f 4e 3d 30 78 38 30 33 36 2c 2f 2f MATION=0x8036,//
0d80: 20 20 20 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e6 .............
0d90: 83 85 e5 a0 b1 e3 81 8c e5 8f 96 e5 be 97 e3 81 ................
0da0: a7 e3 81 8d e3 81 be e3 81 9b e3 82 93 e3 80 82 ................
0db0: 0a 7d 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .}..//----------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 2d 2d 0a 2f 2f 20 e3 82 b3 e3 83 bc ------.// ......
0e00: e3 83 ab e3 83 90 e3 83 83 e3 82 af e9 96 a2 e6 ................
0e10: 95 b0 e3 81 ae e8 bf 94 e7 ad 94 e7 94 a8 e5 9e ................
0e20: 8b 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ..//------------
0e30: 2d 2d 2d 2d 2d 2d 2d 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 0a 0a 65 6e 75 6d 20 42 67 61 41 6e ----..enum BgaAn
0e70: 73 77 65 72 0a 7b 0a 09 4d 65 6c 74 49 74 2c 20 swer.{..MeltIt,
0e80: 53 6b 69 70 49 74 2c 20 41 62 6f 72 74 0a 7d 0a SkipIt, Abort.}.
0e90: 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .//-------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 2d 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 0a 2f 2f 20 46 69 6c 65 70 0a 2f 2f 20 ---.// Filep.//
0ee0: 20 20 44 e8 a8 80 e8 aa 9e e3 82 89 e3 81 97 e3 D.............
0ef0: 81 8b e3 82 89 e3 81 ac e3 81 ae e3 81 a7 e3 81 ................
0f00: 99 e3 81 8c 7a 6c 69 62 e3 82 84 6c 69 62 62 7a ....zlib...libbz
0f10: 32 e3 81 a8 e7 b0 a1 e5 8d 98 e3 81 ab e9 80 a3 2...............
0f20: e6 90 ba e3 81 99 e3 82 8b 0a 2f 2f 20 20 20 e9 ..........// .
0f30: 83 bd e5 90 88 e4 b8 8a 73 74 64 2e 63 2e 73 74 ........std.c.st
0f40: 64 69 6f 2e 46 49 4c 45 2a e3 81 a7 e3 83 95 e3 dio.FILE*.......
0f50: 82 a1 e3 82 a4 e3 83 ab e3 82 92 e8 aa ad e3 81 ................
0f60: bf e6 9b b8 e3 81 8d e3 81 97 e3 81 be e3 81 99 ................
0f70: e3 80 82 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ....//----------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 0a 0a 65 78 74 65 72 6e 28 43 ------..extern(C
0fc0: 29 0a 7b 0a 09 2f 2f 20 73 74 64 69 6f 2e 68 0a ).{..// stdio.h.
0fd0: 20 20 20 20 69 6e 74 20 66 69 6c 65 6e 6f 28 20 int fileno(
0fe0: 46 49 4c 45 20 2a 66 70 20 29 20 7b 20 72 65 74 FILE *fp ) { ret
0ff0: 75 72 6e 20 66 70 2e 5f 66 69 6c 65 3b 20 7d 0a urn fp._file; }.
1000: 09 2f 2f 20 69 6f 2e 68 0a 09 69 6e 74 20 6c 73 .// io.h..int ls
1010: 65 65 6b 28 20 69 6e 74 20 66 64 2c 20 69 6e 74 eek( int fd, int
1020: 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 6d 6f 64 offset, int mod
1030: 65 20 29 3b 0a 09 69 6e 74 20 64 75 70 28 20 69 e );..int dup( i
1040: 6e 74 20 66 64 20 29 3b 20 0a 09 69 6e 74 20 63 nt fd ); ..int c
1050: 6c 6f 73 65 28 20 69 6e 74 20 66 64 20 29 3b 0a lose( int fd );.
1060: 7d 0a 0a 63 6c 61 73 73 20 46 69 6c 65 70 0a 7b }..class Filep.{
1070: 0a 09 70 72 69 76 61 74 65 20 46 49 4c 45 2a 20 ..private FILE*
1080: 66 70 3b 0a 09 70 72 69 76 61 74 65 20 74 68 69 fp;..private thi
1090: 73 28 20 46 49 4c 45 2a 20 70 20 29 20 7b 20 66 s( FILE* p ) { f
10a0: 70 20 3d 20 70 3b 20 7d 0a 0a 09 73 74 61 74 69 p = p; }...stati
10b0: 63 20 46 69 6c 65 70 20 6f 70 65 6e 28 20 73 74 c Filep open( st
10c0: 72 69 6e 67 20 66 69 6c 65 6e 61 6d 65 2c 20 62 ring filename, b
10d0: 6f 6f 6c 20 72 65 61 64 20 29 0a 09 7b 0a 09 09 ool read )..{...
10e0: 46 49 4c 45 2a 20 66 70 20 3d 20 66 6f 70 65 6e FILE* fp = fopen
10f0: 28 66 69 6c 65 6e 61 6d 65 2e 74 6f 53 74 72 69 (filename.toStri
1100: 6e 67 7a 28 29 2c 20 72 65 61 64 3f 22 72 62 22 ngz(), read?"rb"
1110: 3a 22 77 62 22 29 3b 0a 09 09 72 65 74 75 72 6e :"wb");...return
1120: 20 28 66 70 20 3f 20 6e 65 77 20 46 69 6c 65 70 (fp ? new Filep
1130: 28 66 70 29 20 3a 20 6e 75 6c 6c 29 3b 0a 09 7d (fp) : null);..}
1140: 0a 0a 09 69 6e 74 20 64 75 70 5f 68 61 6e 28 29 ...int dup_han()
1150: 0a 09 7b 0a 09 09 69 6e 74 20 66 64 20 3d 20 64 ..{...int fd = d
1160: 75 70 28 20 66 69 6c 65 6e 6f 28 66 70 29 20 29 up( fileno(fp) )
1170: 3b 0a 09 09 6c 73 65 65 6b 28 20 66 64 2c 20 63 ;...lseek( fd, c
1180: 75 72 28 29 2c 20 30 20 29 3b 0a 09 09 72 65 74 ur(), 0 );...ret
1190: 75 72 6e 20 66 64 3b 0a 09 7d 0a 0a 09 76 6f 69 urn fd;..}...voi
11a0: 64 5b 5d 20 72 65 61 64 28 20 69 6e 74 20 73 69 d[] read( int si
11b0: 7a 20 29 0a 09 7b 0a 09 09 63 68 61 72 5b 5d 20 z )..{...char[]
11c0: 62 75 66 3b 20 62 75 66 2e 6c 65 6e 67 74 68 20 buf; buf.length
11d0: 3d 20 73 69 7a 3b 0a 09 09 69 6e 74 20 72 73 69 = siz;...int rsi
11e0: 7a 20 3d 20 66 72 65 61 64 28 20 62 75 66 2e 70 z = fread( buf.p
11f0: 74 72 2c 20 31 2c 20 73 69 7a 2c 20 66 70 20 29 tr, 1, siz, fp )
1200: 3b 0a 09 09 69 66 28 20 72 73 69 7a 20 3c 20 30 ;...if( rsiz < 0
1210: 20 29 0a 09 09 09 74 68 72 6f 77 20 6e 65 77 20 )....throw new
1220: 42 67 61 4d 65 6c 74 65 72 45 72 72 6f 72 28 45 BgaMelterError(E
1230: 52 52 4f 52 5f 46 49 4c 45 5f 4f 50 45 4e 29 3b RROR_FILE_OPEN);
1240: 0a 09 09 62 75 66 2e 6c 65 6e 67 74 68 20 3d 20 ...buf.length =
1250: 72 73 69 7a 3b 0a 09 09 72 65 74 75 72 6e 20 62 rsiz;...return b
1260: 75 66 3b 0a 09 7d 0a 0a 09 76 6f 69 64 20 77 72 uf;..}...void wr
1270: 69 74 65 28 20 76 6f 69 64 5b 5d 20 62 75 66 20 ite( void[] buf
1280: 29 0a 09 7b 0a 09 09 77 68 69 6c 65 28 20 62 75 )..{...while( bu
1290: 66 2e 6c 65 6e 67 74 68 20 3e 20 30 20 29 0a 09 f.length > 0 )..
12a0: 09 7b 0a 09 09 09 69 6e 74 20 72 73 69 7a 20 3d .{....int rsiz =
12b0: 20 66 77 72 69 74 65 28 20 62 75 66 2e 70 74 72 fwrite( buf.ptr
12c0: 2c 20 31 2c 20 62 75 66 2e 6c 65 6e 67 74 68 2c , 1, buf.length,
12d0: 20 66 70 20 29 3b 0a 09 09 09 69 66 28 20 72 73 fp );....if( rs
12e0: 69 7a 20 3c 20 30 20 29 20 72 65 74 75 72 6e 3b iz < 0 ) return;
12f0: 0a 09 09 09 62 75 66 20 3d 20 62 75 66 5b 72 73 ....buf = buf[rs
1300: 69 7a 20 2e 2e 20 24 5d 3b 0a 09 09 7d 0a 09 7d iz .. $];...}..}
1310: 0a 0a 09 69 6e 74 20 63 75 72 28 29 0a 09 7b 0a ...int cur()..{.
1320: 09 09 72 65 74 75 72 6e 20 66 74 65 6c 6c 28 66 ..return ftell(f
1330: 70 29 3b 0a 09 7d 0a 0a 09 76 6f 69 64 20 73 65 p);..}...void se
1340: 65 6b 5f 74 6f 28 20 69 6e 74 20 69 20 29 0a 09 ek_to( int i )..
1350: 7b 0a 09 09 66 73 65 65 6b 28 20 66 70 2c 20 69 {...fseek( fp, i
1360: 2c 20 73 74 64 2e 63 2e 73 74 64 69 6f 2e 53 45 , std.c.stdio.SE
1370: 45 4b 5f 53 45 54 20 29 3b 0a 09 7d 0a 0a 09 76 EK_SET );..}...v
1380: 6f 69 64 20 63 6c 6f 73 65 28 29 0a 09 7b 0a 09 oid close()..{..
1390: 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 09 7d 0a .fclose(fp);..}.
13a0: 0a 09 46 49 4c 45 2a 20 67 65 74 5f 66 70 28 29 ..FILE* get_fp()
13b0: 0a 09 7b 0a 09 09 72 65 74 75 72 6e 20 66 70 3b ..{...return fp;
13c0: 0a 09 7d 0a 7d 0a 0a 0a 2f 2f 2d 2d 2d 2d 2d 2d ..}.}...//------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2f 2f 20 e3 83 ----------.// ..
1410: a1 e3 82 a4 e3 83 b3 e3 82 af e3 83 a9 e3 82 b9 ................
1420: 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .//-------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1460: 2d 2d 2d 0a 0a 63 6c 61 73 73 20 42 67 61 4d 65 ---..class BgaMe
1470: 6c 74 65 72 0a 7b 0a 09 61 6c 69 61 73 20 42 67 lter.{..alias Bg
1480: 61 41 6e 73 77 65 72 20 64 65 6c 65 67 61 74 65 aAnswer delegate
1490: 28 72 65 66 20 42 67 61 48 65 61 64 65 72 29 20 (ref BgaHeader)
14a0: 46 69 6c 65 48 61 6e 64 6c 65 72 3b 0a 09 61 6c FileHandler;..al
14b0: 69 61 73 20 42 67 61 41 6e 73 77 65 72 20 64 65 ias BgaAnswer de
14c0: 6c 65 67 61 74 65 28 69 6e 74 2c 20 69 6e 74 29 legate(int, int)
14d0: 20 20 20 20 20 20 50 72 6f 67 72 65 73 73 48 61 ProgressHa
14e0: 6e 64 6c 65 72 3b 0a 0a 09 70 72 69 76 61 74 65 ndler;...private
14f0: 20 46 69 6c 65 70 20 66 70 20 3d 20 6e 75 6c 6c Filep fp = null
1500: 3b 0a 0a 09 74 68 69 73 28 20 73 74 72 69 6e 67 ;...this( string
1510: 20 61 72 63 5f 6e 61 6d 65 20 29 0a 09 7b 0a 09 arc_name )..{..
1520: 09 66 70 20 3d 20 46 69 6c 65 70 2e 6f 70 65 6e .fp = Filep.open
1530: 28 20 61 72 63 5f 6e 61 6d 65 2c 20 74 72 75 65 ( arc_name, true
1540: 20 29 3b 0a 09 09 69 66 28 20 66 70 20 69 73 20 );...if( fp is
1550: 6e 75 6c 6c 20 29 0a 09 09 09 74 68 72 6f 77 20 null )....throw
1560: 6e 65 77 20 42 67 61 4d 65 6c 74 65 72 45 72 72 new BgaMelterErr
1570: 6f 72 28 45 52 52 4f 52 5f 46 49 4c 45 5f 4f 50 or(ERROR_FILE_OP
1580: 45 4e 29 3b 0a 09 7d 0a 0a 09 76 6f 69 64 20 63 EN);..}...void c
1590: 6c 6f 73 65 28 29 0a 09 7b 0a 09 09 69 66 28 20 lose()..{...if(
15a0: 66 70 20 29 20 7b 20 66 70 2e 63 6c 6f 73 65 28 fp ) { fp.close(
15b0: 29 3b 20 66 70 20 3d 20 6e 75 6c 6c 3b 20 7d 0a ); fp = null; }.
15c0: 09 7d 0a 0a 09 76 6f 69 64 20 73 74 61 72 74 28 .}...void start(
15d0: 20 46 69 6c 65 48 61 6e 64 6c 65 72 20 66 68 2c FileHandler fh,
15e0: 20 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 ProgressHandler
15f0: 20 70 68 20 29 0a 09 7b 0a 09 09 74 72 79 0a 09 ph )..{...try..
1600: 09 7b 0a 09 09 09 2f 2f 20 e3 83 98 e3 83 83 e3 .{....// .......
1610: 83 80 e3 82 92 e6 8e a2 e3 81 99 0a 09 09 09 69 ...............i
1620: 6e 74 20 68 70 6f 73 20 3d 20 66 69 6e 64 5f 68 nt hpos = find_h
1630: 65 61 64 65 72 28 29 3b 0a 09 09 09 69 66 28 20 eader();....if(
1640: 68 70 6f 73 20 3d 3d 20 2d 31 20 29 0a 09 09 09 hpos == -1 )....
1650: 09 74 68 72 6f 77 20 6e 65 77 20 42 67 61 4d 65 .throw new BgaMe
1660: 6c 74 65 72 45 72 72 6f 72 28 45 52 52 4f 52 5f lterError(ERROR_
1670: 4e 4f 54 5f 41 52 43 5f 46 49 4c 45 29 3b 0a 09 NOT_ARC_FILE);..
1680: 09 09 66 70 2e 73 65 65 6b 5f 74 6f 28 68 70 6f ..fp.seek_to(hpo
1690: 73 29 3b 0a 0a 09 09 09 2f 2f 20 e3 83 ab e3 83 s);.....// .....
16a0: bc e3 83 97 ef bc 9a 0a 09 09 09 2f 2f 20 e3 83 ...........// ..
16b0: 98 e3 83 83 e3 83 80 e8 aa ad e3 81 bf e3 81 a8 ................
16c0: e3 82 8a 0a 09 09 09 42 67 61 48 65 61 64 65 72 .......BgaHeader
16d0: 20 68 64 72 3b 0a 09 09 09 77 68 69 6c 65 28 20 hdr;....while(
16e0: 72 65 61 64 5f 68 65 61 64 65 72 28 68 64 72 29 read_header(hdr)
16f0: 20 29 0a 09 09 09 7b 0a 09 09 09 09 2f 2f 20 e6 )....{.....// .
1700: ac a1 e3 81 ae e3 83 98 e3 83 83 e3 83 80 e4 bd ................
1710: 8d e7 bd ae e3 82 92 e8 a8 88 e7 ae 97 e3 81 97 ................
1720: e3 81 a6 e3 81 8a e3 81 8f 0a 09 09 09 09 75 69 ..............ui
1730: 6e 74 20 6e 65 78 74 70 6f 73 20 3d 20 66 70 2e nt nextpos = fp.
1740: 63 75 72 28 29 20 2b 20 68 64 72 2e 63 6f 6d 70 cur() + hdr.comp
1750: 72 65 73 73 65 64 5f 73 69 7a 65 3b 0a 09 09 09 ressed_size;....
1760: 09 74 72 79 0a 09 09 09 09 7b 0a 09 09 09 09 09 .try.....{......
1770: 2f 2f 20 63 61 6c 6c 62 61 63 6b 0a 09 09 09 09 // callback.....
1780: 09 42 67 61 41 6e 73 77 65 72 20 61 20 3d 20 66 .BgaAnswer a = f
1790: 68 28 68 64 72 29 3b 0a 09 09 09 09 09 69 66 28 h(hdr);......if(
17a0: 20 61 20 3d 3d 20 42 67 61 41 6e 73 77 65 72 2e a == BgaAnswer.
17b0: 41 62 6f 72 74 20 29 20 20 72 65 74 75 72 6e 3b Abort ) return;
17c0: 0a 09 09 09 09 09 69 66 28 20 61 20 3d 3d 20 42 ......if( a == B
17d0: 67 61 41 6e 73 77 65 72 2e 53 6b 69 70 49 74 20 gaAnswer.SkipIt
17e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 09 ) continue;.....
17f0: 09 09 2f 2f 20 e5 87 ba e5 8a 9b e5 85 88 e3 83 ..// ...........
1800: 95 e3 82 a1 e3 82 a4 e3 83 ab e3 82 92 e9 96 8b ................
1810: e3 81 8f 0a 09 09 09 09 09 69 66 28 20 6c 61 73 .........if( las
1820: 74 43 68 61 72 28 68 64 72 2e 66 6e 61 6d 65 29 tChar(hdr.fname)
1830: 3d 3d 27 5c 5c 27 20 29 0a 09 09 09 09 09 20 20 =='\\' )......
1840: 7b 20 70 61 74 68 4d 61 6b 65 28 68 64 72 2e 66 { pathMake(hdr.f
1850: 6e 61 6d 65 29 3b 20 63 6f 6e 74 69 6e 75 65 3b name); continue;
1860: 20 7d 0a 0a 09 09 09 09 09 46 69 6c 65 70 20 6f }.......Filep o
1870: 75 74 66 20 3d 20 46 69 6c 65 70 2e 6f 70 65 6e utf = Filep.open
1880: 28 20 70 61 74 68 4d 61 6b 65 28 68 64 72 2e 66 ( pathMake(hdr.f
1890: 6e 61 6d 65 29 2c 20 66 61 6c 73 65 20 29 3b 0a name), false );.
18a0: 09 09 09 09 09 69 66 28 20 6f 75 74 66 20 69 73 .....if( outf is
18b0: 20 6e 75 6c 6c 20 29 0a 09 09 09 09 09 09 74 68 null ).......th
18c0: 72 6f 77 20 6e 65 77 20 42 67 61 4d 65 6c 74 65 row new BgaMelte
18d0: 72 45 72 72 6f 72 28 45 52 52 4f 52 5f 46 49 4c rError(ERROR_FIL
18e0: 45 5f 4f 50 45 4e 29 3b 0a 0a 09 09 09 09 09 2f E_OPEN);......./
18f0: 2f 20 e8 a7 a3 e5 87 8d e5 87 a6 e7 90 86 0a 09 / ..............
1900: 09 09 09 09 62 6f 6f 6c 20 62 43 6f 6e 74 69 6e ....bool bContin
1910: 75 65 20 3d 20 74 72 75 65 3b 0a 09 09 09 09 09 ue = true;......
1920: 69 66 28 20 21 69 73 5f 63 6f 6d 70 72 65 73 73 if( !is_compress
1930: 65 64 28 68 64 72 29 20 29 0a 09 09 09 09 09 09 ed(hdr) ).......
1940: 62 43 6f 6e 74 69 6e 75 65 20 3d 20 4e 63 44 65 bContinue = NcDe
1950: 63 28 20 68 64 72 2e 6f 72 69 67 69 6e 61 6c 5f c( hdr.original_
1960: 73 69 7a 65 2c 20 6f 75 74 66 2c 20 70 68 20 29 size, outf, ph )
1970: 3b 0a 09 09 09 09 09 65 6c 73 65 20 69 66 28 20 ;......else if(
1980: 68 64 72 2e 6d 65 74 68 6f 64 20 3d 3d 20 22 47 hdr.method == "G
1990: 5a 49 50 22 20 29 0a 09 09 09 09 09 09 62 43 6f ZIP" ).......bCo
19a0: 6e 74 69 6e 75 65 20 3d 20 47 7a 44 65 63 28 20 ntinue = GzDec(
19b0: 68 64 72 2e 63 6f 6d 70 72 65 73 73 65 64 5f 73 hdr.compressed_s
19c0: 69 7a 65 2c 20 68 64 72 2e 6f 72 69 67 69 6e 61 ize, hdr.origina
19d0: 6c 5f 73 69 7a 65 2c 20 6f 75 74 66 2c 20 70 68 l_size, outf, ph
19e0: 20 29 3b 0a 09 09 09 09 09 65 6c 73 65 20 69 66 );......else if
19f0: 28 20 68 64 72 2e 6d 65 74 68 6f 64 20 3d 3d 20 ( hdr.method ==
1a00: 22 42 5a 32 5c 30 22 20 29 0a 09 09 09 09 09 09 "BZ2\0" ).......
1a10: 62 43 6f 6e 74 69 6e 75 65 20 3d 20 42 7a 44 65 bContinue = BzDe
1a20: 63 28 20 68 64 72 2e 6f 72 69 67 69 6e 61 6c 5f c( hdr.original_
1a30: 73 69 7a 65 2c 20 6f 75 74 66 2c 20 70 68 20 29 size, outf, ph )
1a40: 3b 0a 0a 09 09 09 09 09 2f 2f 20 e9 96 89 e3 81 ;.......// .....
1a50: 98 e3 81 a6 e5 b1 9e e6 80 a7 e8 a8 ad e5 ae 9a ................
1a60: 0a 09 09 09 09 09 6f 75 74 66 2e 63 6c 6f 73 65 ......outf.close
1a70: 28 29 3b 0a 09 09 09 09 09 64 6f 73 53 65 74 46 ();......dosSetF
1a80: 54 69 6d 65 28 20 68 64 72 2e 66 6e 61 6d 65 2c Time( hdr.fname,
1a90: 20 68 64 72 2e 64 61 74 65 2c 20 68 64 72 2e 74 hdr.date, hdr.t
1aa0: 69 6d 65 20 29 3b 0a 09 09 09 09 09 53 65 74 46 ime );......SetF
1ab0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 20 ileAttributesA(
1ac0: 68 64 72 2e 66 6e 61 6d 65 2e 74 6f 53 74 72 69 hdr.fname.toStri
1ad0: 6e 67 7a 28 29 2c 20 68 64 72 2e 61 74 74 72 69 ngz(), hdr.attri
1ae0: 62 20 29 3b 0a 09 09 09 09 09 69 66 28 20 21 62 b );......if( !b
1af0: 43 6f 6e 74 69 6e 75 65 20 29 0a 09 09 09 09 09 Continue )......
1b00: 09 72 65 74 75 72 6e 3b 0a 09 09 09 09 7d 0a 09 .return;.....}..
1b10: 09 09 09 66 69 6e 61 6c 6c 79 20 7b 20 66 70 2e ...finally { fp.
1b20: 73 65 65 6b 5f 74 6f 28 6e 65 78 74 70 6f 73 29 seek_to(nextpos)
1b30: 3b 20 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 09 66 ; }....}...}...f
1b40: 69 6e 61 6c 6c 79 20 7b 20 63 6c 6f 73 65 28 29 inally { close()
1b50: 3b 20 7d 0a 09 7d 0a 0a 09 73 74 61 74 69 63 20 ; }..}...static
1b60: 69 6e 74 20 73 69 67 6e 65 64 5f 63 68 61 72 28 int signed_char(
1b70: 20 63 68 61 72 20 63 20 29 0a 09 7b 0a 09 09 69 char c )..{...i
1b80: 6e 74 20 63 6e 20 3d 20 63 3b 0a 09 09 72 65 74 nt cn = c;...ret
1b90: 75 72 6e 20 28 63 6e 3e 3d 30 78 38 30 20 3f 20 urn (cn>=0x80 ?
1ba0: 63 6e 7c 30 78 66 66 66 66 66 66 30 30 20 3a 20 cn|0xffffff00 :
1bb0: 63 6e 29 3b 0a 09 7d 0a 0a 09 70 72 69 76 61 74 cn);..}...privat
1bc0: 65 20 69 6e 74 20 66 69 6e 64 5f 68 65 61 64 65 e int find_heade
1bd0: 72 28 29 0a 09 7b 0a 09 09 73 74 72 69 6e 67 20 r()..{...string
1be0: 64 61 74 20 3d 20 63 61 73 74 28 73 74 72 69 6e dat = cast(strin
1bf0: 67 29 20 66 70 2e 72 65 61 64 28 30 78 31 30 30 g) fp.read(0x100
1c00: 30 30 29 3b 0a 0a 09 09 66 6f 72 28 20 69 6e 74 00);....for( int
1c10: 20 69 3d 30 3b 20 69 3c 64 61 74 2e 6c 65 6e 67 i=0; i<dat.leng
1c20: 74 68 2d 32 38 3b 20 2b 2b 69 20 29 0a 09 09 7b th-28; ++i )...{
1c30: 0a 09 09 09 69 66 28 20 64 61 74 5b 69 2b 34 5d ....if( dat[i+4]
1c40: 21 3d 27 47 27 20 26 26 20 64 61 74 5b 69 2b 34 !='G' && dat[i+4
1c50: 5d 21 3d 27 42 27 20 29 20 63 6f 6e 74 69 6e 75 ]!='B' ) continu
1c60: 65 3b 0a 09 09 09 69 66 28 20 64 61 74 5b 69 2b e;....if( dat[i+
1c70: 35 5d 21 3d 27 5a 27 20 20 20 20 20 20 20 20 20 5]!='Z'
1c80: 20 20 20 20 20 20 20 20 20 29 20 63 6f 6e 74 69 ) conti
1c90: 6e 75 65 3b 0a 09 09 09 69 66 28 20 64 61 74 5b nue;....if( dat[
1ca0: 69 2b 36 5d 21 3d 27 49 27 20 26 26 20 64 61 74 i+6]!='I' && dat
1cb0: 5b 69 2b 36 5d 21 3d 27 32 27 20 29 20 63 6f 6e [i+6]!='2' ) con
1cc0: 74 69 6e 75 65 3b 0a 09 09 09 69 66 28 20 64 61 tinue;....if( da
1cd0: 74 5b 69 2b 37 5d 21 3d 27 50 27 20 26 26 20 64 t[i+7]!='P' && d
1ce0: 61 74 5b 69 2b 37 5d 21 3d 27 5c 30 27 29 20 63 at[i+7]!='\0') c
1cf0: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 09 20 69 6e ontinue;..... in
1d00: 74 20 63 68 65 63 6b 73 75 6d 20 3d 20 64 61 74 t checksum = dat
1d10: 5b 69 2b 30 5d 2b 28 64 61 74 5b 69 2b 31 5d 3c [i+0]+(dat[i+1]<
1d20: 3c 38 29 2b 28 64 61 74 5b 69 2b 32 5d 3c 3c 31 <8)+(dat[i+2]<<1
1d30: 36 29 2b 28 64 61 74 5b 69 2b 33 5d 3c 3c 32 34 6)+(dat[i+3]<<24
1d40: 29 3b 0a 09 09 09 75 69 6e 74 20 66 6e 6c 65 6e );....uint fnlen
1d50: 20 20 20 20 3d 20 64 61 74 5b 69 2b 32 34 5d 2b = dat[i+24]+
1d60: 28 64 61 74 5b 69 2b 32 35 5d 3c 3c 38 29 2b 64 (dat[i+25]<<8)+d
1d70: 61 74 5b 69 2b 32 36 5d 2b 28 64 61 74 5b 69 2b at[i+26]+(dat[i+
1d80: 32 37 5d 3c 3c 38 29 3b 0a 09 09 09 69 66 28 20 27]<<8);....if(
1d90: 69 2b 32 38 2b 66 6e 6c 65 6e 20 3e 20 64 61 74 i+28+fnlen > dat
1da0: 2e 6c 65 6e 67 74 68 20 29 20 20 20 20 20 20 20 .length )
1db0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 09 69 continue;.....i
1dc0: 6e 74 20 73 75 6d 20 3d 20 30 3b 0a 09 09 09 66 nt sum = 0;....f
1dd0: 6f 72 28 20 69 6e 74 20 6a 3d 69 2b 34 3b 20 6a or( int j=i+4; j
1de0: 21 3d 69 2b 32 38 2b 66 6e 6c 65 6e 3b 20 2b 2b !=i+28+fnlen; ++
1df0: 6a 20 29 0a 09 09 09 09 73 75 6d 20 2b 3d 20 73 j ).....sum += s
1e00: 69 67 6e 65 64 5f 63 68 61 72 28 64 61 74 5b 6a igned_char(dat[j
1e10: 5d 29 3b 0a 09 09 09 69 66 28 20 63 68 65 63 6b ]);....if( check
1e20: 73 75 6d 20 3d 3d 20 73 75 6d 20 29 0a 09 09 09 sum == sum )....
1e30: 09 72 65 74 75 72 6e 20 69 3b 0a 09 09 7d 0a 0a .return i;...}..
1e40: 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a ..return -1;..}.
1e50: 0a 09 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 72 ..private bool r
1e60: 65 61 64 5f 68 65 61 64 65 72 28 20 6f 75 74 20 ead_header( out
1e70: 42 67 61 48 65 61 64 65 72 20 68 64 72 20 29 0a BgaHeader hdr ).
1e80: 09 7b 0a 09 09 2f 2f 20 e3 83 aa e3 83 88 e3 83 .{...// ........
1e90: ab e3 82 a8 e3 83 b3 e3 83 87 e3 82 a3 e3 82 a2 ................
1ea0: e3 83 b3 e3 82 92 e4 bb ae e5 ae 9a e3 80 82 e3 ................
1eb0: 83 98 e3 83 83 e3 83 80 e8 aa ad e3 81 bf e8 be ................
1ec0: bc e3 81 bf 0a 09 09 73 74 72 69 6e 67 20 62 75 .......string bu
1ed0: 66 20 3d 20 63 61 73 74 28 73 74 72 69 6e 67 29 f = cast(string)
1ee0: 20 66 70 2e 72 65 61 64 28 32 38 29 3b 0a 09 09 fp.read(28);...
1ef0: 69 66 28 20 62 75 66 2e 6c 65 6e 67 74 68 20 3c if( buf.length <
1f00: 20 32 38 20 29 20 72 65 74 75 72 6e 20 66 61 6c 28 ) return fal
1f10: 73 65 3b 0a 09 09 62 75 66 2e 6c 65 6e 67 74 68 se;...buf.length
1f20: 20 3d 20 42 67 61 48 65 61 64 65 72 2e 73 69 7a = BgaHeader.siz
1f30: 65 6f 66 3b 0a 09 09 68 64 72 20 3d 20 28 63 61 eof;...hdr = (ca
1f40: 73 74 28 42 67 61 48 65 61 64 65 72 5b 5d 29 20 st(BgaHeader[])
1f50: 62 75 66 29 5b 30 5d 3b 0a 09 09 68 64 72 2e 66 buf)[0];...hdr.f
1f60: 6e 61 6d 65 20 3d 20 22 22 3b 0a 0a 09 09 2f 2f name = "";....//
1f70: 20 e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e5 90 8d ...............
1f80: 0a 09 09 68 64 72 2e 66 6e 61 6d 65 20 3d 20 63 ...hdr.fname = c
1f90: 61 73 74 28 73 74 72 69 6e 67 29 20 66 70 2e 72 ast(string) fp.r
1fa0: 65 61 64 28 68 64 72 2e 64 69 72 5f 6e 61 6d 65 ead(hdr.dir_name
1fb0: 5f 6c 65 6e 20 2b 20 68 64 72 2e 66 69 6c 65 5f _len + hdr.file_
1fc0: 6e 61 6d 65 5f 6c 65 6e 29 3b 0a 09 09 69 66 28 name_len);...if(
1fd0: 20 68 64 72 2e 66 6e 61 6d 65 2e 6c 65 6e 67 74 hdr.fname.lengt
1fe0: 68 20 3c 20 68 64 72 2e 64 69 72 5f 6e 61 6d 65 h < hdr.dir_name
1ff0: 5f 6c 65 6e 20 2b 20 68 64 72 2e 66 69 6c 65 5f _len + hdr.file_
2000: 6e 61 6d 65 5f 6c 65 6e 20 29 20 72 65 74 75 72 name_len ) retur
2010: 6e 20 66 61 6c 73 65 3b 0a 0a 09 09 2f 2f 20 e3 n false;....// .
2020: 83 81 e3 82 a7 e3 83 83 e3 82 af e3 82 b5 e3 83 ................
2030: a0 0a 09 09 69 6e 74 20 73 75 6d 20 3d 20 30 3b ....int sum = 0;
2040: 0a 09 09 66 6f 72 28 20 69 6e 74 20 69 3d 34 3b ...for( int i=4;
2050: 20 69 21 3d 32 38 3b 20 2b 2b 69 20 29 20 20 20 i!=28; ++i )
2060: 20 73 75 6d 20 2b 3d 20 73 69 67 6e 65 64 5f 63 sum += signed_c
2070: 68 61 72 28 62 75 66 5b 69 5d 29 3b 0a 09 09 66 har(buf[i]);...f
2080: 6f 72 65 61 63 68 28 20 63 68 61 72 20 63 20 3b oreach( char c ;
2090: 20 68 64 72 2e 66 6e 61 6d 65 20 29 20 73 75 6d hdr.fname ) sum
20a0: 20 2b 3d 20 73 69 67 6e 65 64 5f 63 68 61 72 28 += signed_char(
20b0: 63 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 73 75 c);...return (su
20c0: 6d 20 3d 3d 20 68 64 72 2e 63 68 65 63 6b 73 75 m == hdr.checksu
20d0: 6d 29 3b 0a 09 7d 0a 0a 09 70 72 69 76 61 74 65 m);..}...private
20e0: 20 62 6f 6f 6c 20 69 73 5f 63 6f 6d 70 72 65 73 bool is_compres
20f0: 73 65 64 28 20 72 65 66 20 42 67 61 48 65 61 64 sed( ref BgaHead
2100: 65 72 20 68 64 72 20 29 20 2f 2f 20 72 65 66 3d er hdr ) // ref=
2110: 6a 75 73 74 20 66 6f 72 20 6f 70 74 69 6d 69 7a just for optimiz
2120: 61 74 69 6f 6e 0a 09 7b 0a 09 09 2f 2f 20 e3 83 ation..{...// ..
2130: 98 e3 83 83 e3 83 80 e3 81 8b e3 82 89 e3 80 81 ................
2140: e3 83 95 e3 82 a1 e3 82 a4 e3 83 ab e3 81 8c e5 ................
2150: 9c a7 e7 b8 ae e6 a0 bc e7 b4 8d e3 81 95 e3 82 ................
2160: 8c e3 81 a6 e3 81 84 e3 82 8b e3 81 8b e3 81 a9 ................
2170: e3 81 86 e3 81 8b e3 82 92 e5 88 a4 e5 ae 9a 0a ................
2180: 09 09 69 66 28 20 68 64 72 2e 61 72 63 5f 74 79 ..if( hdr.arc_ty
2190: 70 65 3d 3d 32 20 29 0a 09 09 09 72 65 74 75 72 pe==2 )....retur
21a0: 6e 20 66 61 6c 73 65 3b 0a 09 09 69 66 28 20 68 n false;...if( h
21b0: 64 72 2e 61 72 63 5f 74 79 70 65 3d 3d 30 20 26 dr.arc_type==0 &
21c0: 26 20 68 64 72 2e 63 6f 6d 70 72 65 73 73 65 64 & hdr.compressed
21d0: 5f 73 69 7a 65 3d 3d 68 64 72 2e 6f 72 69 67 69 _size==hdr.origi
21e0: 6e 61 6c 5f 73 69 7a 65 20 29 0a 09 09 7b 0a 09 nal_size )...{..
21f0: 09 09 69 6e 74 20 78 20 3d 20 68 64 72 2e 66 6e ..int x = hdr.fn
2200: 61 6d 65 2e 6c 61 73 74 49 6e 64 65 78 4f 66 28 ame.lastIndexOf(
2210: 27 2e 27 29 3b 0a 09 09 09 69 66 28 20 78 20 3d '.');....if( x =
2220: 3d 20 2d 31 20 29 0a 09 09 09 09 72 65 74 75 72 = -1 ).....retur
2230: 6e 20 74 72 75 65 3b 0a 09 09 09 73 74 72 69 6e n true;....strin
2240: 67 20 65 78 74 20 3d 20 68 64 72 2e 66 6e 61 6d g ext = hdr.fnam
2250: 65 5b 78 2b 31 20 2e 2e 20 24 5d 2e 74 6f 4c 6f e[x+1 .. $].toLo
2260: 77 65 72 28 29 3b 0a 09 09 09 69 66 28 20 65 78 wer();....if( ex
2270: 74 3d 3d 22 61 72 63 22 20 7c 7c 20 65 78 74 3d t=="arc" || ext=
2280: 3d 22 61 72 6a 22 20 7c 7c 20 65 78 74 3d 3d 22 ="arj" || ext=="
2290: 62 7a 32 22 20 7c 7c 20 65 78 74 3d 3d 22 62 7a bz2" || ext=="bz
22a0: 61 22 0a 09 09 09 20 7c 7c 20 65 78 74 3d 3d 22 a".... || ext=="
22b0: 63 61 62 22 20 7c 7c 20 65 78 74 3d 3d 22 67 7a cab" || ext=="gz
22c0: 22 20 20 7c 7c 20 65 78 74 3d 3d 22 67 7a 61 22 " || ext=="gza"
22d0: 20 7c 7c 20 65 78 74 3d 3d 22 6c 7a 68 22 0a 09 || ext=="lzh"..
22e0: 09 09 20 7c 7c 20 65 78 74 3d 3d 22 6c 7a 73 22 .. || ext=="lzs"
22f0: 20 7c 7c 20 65 78 74 3d 3d 22 70 61 6b 22 20 7c || ext=="pak" |
2300: 7c 20 65 78 74 3d 3d 22 72 61 72 22 20 7c 7c 20 | ext=="rar" ||
2310: 65 78 74 3d 3d 22 74 61 7a 22 0a 09 09 09 20 7c ext=="taz".... |
2320: 7c 20 65 78 74 3d 3d 22 74 62 7a 22 20 7c 7c 20 | ext=="tbz" ||
2330: 65 78 74 3d 3d 22 74 67 7a 22 20 7c 7c 20 65 78 ext=="tgz" || ex
2340: 74 3d 3d 22 7a 22 20 20 20 7c 7c 20 65 78 74 3d t=="z" || ext=
2350: 3d 22 7a 69 70 22 0a 09 09 09 20 7c 7c 20 65 78 ="zip".... || ex
2360: 74 3d 3d 22 7a 6f 6f 22 20 29 0a 09 09 09 09 72 t=="zoo" ).....r
2370: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 09 7d eturn false;...}
2380: 0a 09 09 72 65 74 75 72 6e 20 74 72 75 65 3b 0a ...return true;.
2390: 09 7d 0a 0a 09 73 74 61 74 69 63 20 73 74 72 69 .}...static stri
23a0: 6e 67 20 70 61 74 68 4d 61 6b 65 28 20 73 74 72 ng pathMake( str
23b0: 69 6e 67 20 70 61 74 68 20 29 0a 09 7b 0a 09 09 ing path )..{...
23c0: 63 68 61 72 2a 20 70 73 20 3d 20 63 61 73 74 28 char* ps = cast(
23d0: 63 68 61 72 2a 29 70 61 74 68 2e 74 6f 53 74 72 char*)path.toStr
23e0: 69 6e 67 7a 28 29 3b 0a 09 09 66 6f 72 28 63 68 ingz();...for(ch
23f0: 61 72 2a 20 70 3d 70 73 3b 3b 20 2b 2b 70 29 0a ar* p=ps;; ++p).
2400: 09 09 7b 0a 09 09 09 66 6f 72 28 3b 20 2a 70 21 ..{....for(; *p!
2410: 3d 30 26 26 2a 70 21 3d 27 5c 5c 27 26 26 2a 70 =0&&*p!='\\'&&*p
2420: 21 3d 27 2f 27 3b 20 70 3d 43 68 61 72 4e 65 78 !='/'; p=CharNex
2430: 74 41 28 70 29 29 20 7b 7d 0a 09 09 09 69 66 28 tA(p)) {}....if(
2440: 20 2a 70 3d 3d 30 20 29 0a 09 09 09 09 62 72 65 *p==0 ).....bre
2450: 61 6b 3b 0a 09 09 09 43 72 65 61 74 65 44 69 72 ak;....CreateDir
2460: 65 63 74 6f 72 79 41 28 20 70 73 5b 30 2e 2e 28 ectoryA( ps[0..(
2470: 70 2d 70 73 29 5d 2e 74 6f 53 74 72 69 6e 67 7a p-ps)].toStringz
2480: 28 29 2c 20 6e 75 6c 6c 20 29 3b 0a 09 09 7d 0a (), null );...}.
2490: 09 09 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 09 ..return path;..
24a0: 7d 0a 0a 09 65 6e 75 6d 20 42 55 46 53 49 5a 20 }...enum BUFSIZ
24b0: 3d 20 36 35 35 33 36 3b 0a 0a 09 70 72 69 76 61 = 65536;...priva
24c0: 74 65 20 62 6f 6f 6c 20 4e 63 44 65 63 28 20 75 te bool NcDec( u
24d0: 69 6e 74 20 75 73 69 7a 2c 20 46 69 6c 65 70 20 int usiz, Filep
24e0: 6f 75 74 66 2c 20 50 72 6f 67 72 65 73 73 48 61 outf, ProgressHa
24f0: 6e 64 6c 65 72 20 70 68 20 29 0a 09 7b 0a 09 09 ndler ph )..{...
2500: 75 69 6e 74 20 69 6e 69 74 5f 75 73 69 7a 20 3d uint init_usiz =
2510: 20 75 73 69 7a 3b 0a 0a 09 09 2f 2f 20 e9 9d 9e usiz;....// ...
2520: e5 9c a7 e7 b8 ae e3 80 82 e3 82 b3 e3 83 94 e3 ................
2530: 83 bc e3 81 99 e3 82 8b e3 81 a0 e3 81 91 0a 09 ................
2540: 09 77 68 69 6c 65 28 20 75 73 69 7a 20 29 0a 09 .while( usiz )..
2550: 09 7b 0a 09 09 09 73 74 72 69 6e 67 20 72 20 3d .{....string r =
2560: 20 63 61 73 74 28 73 74 72 69 6e 67 29 20 66 70 cast(string) fp
2570: 2e 72 65 61 64 28 20 42 55 46 53 49 5a 3c 75 73 .read( BUFSIZ<us
2580: 69 7a 3f 42 55 46 53 49 5a 3a 75 73 69 7a 20 29 iz?BUFSIZ:usiz )
2590: 3b 0a 09 09 09 75 73 69 7a 20 2d 3d 20 72 2e 6c ;....usiz -= r.l
25a0: 65 6e 67 74 68 3b 0a 09 09 09 6f 75 74 66 2e 77 ength;....outf.w
25b0: 72 69 74 65 28 63 61 73 74 28 63 68 61 72 5b 5d rite(cast(char[]
25c0: 29 72 29 3b 0a 0a 09 09 09 2f 2f 20 64 6c 67 0a )r);.....// dlg.
25d0: 09 09 09 69 66 28 20 42 67 61 41 6e 73 77 65 72 ...if( BgaAnswer
25e0: 2e 41 62 6f 72 74 3d 3d 70 68 28 69 6e 69 74 5f .Abort==ph(init_
25f0: 75 73 69 7a 2d 75 73 69 7a 2c 75 73 69 7a 29 20 usiz-usiz,usiz)
2600: 29 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a ) return false;.
2610: 09 09 7d 0a 0a 09 09 2f 2f 20 64 6c 67 0a 09 09 ..}....// dlg...
2620: 69 66 28 20 42 67 61 41 6e 73 77 65 72 2e 41 62 if( BgaAnswer.Ab
2630: 6f 72 74 3d 3d 70 68 28 69 6e 69 74 5f 75 73 69 ort==ph(init_usi
2640: 7a 2d 75 73 69 7a 2c 75 73 69 7a 29 20 29 20 72 z-usiz,usiz) ) r
2650: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 09 72 eturn false;...r
2660: 65 74 75 72 6e 20 74 72 75 65 3b 0a 09 7d 0a 0a eturn true;..}..
2670: 09 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 47 7a .private bool Gz
2680: 44 65 63 28 20 75 69 6e 74 20 63 73 69 7a 2c 20 Dec( uint csiz,
2690: 75 69 6e 74 20 75 73 69 7a 2c 20 46 69 6c 65 70 uint usiz, Filep
26a0: 20 6f 75 74 66 2c 20 50 72 6f 67 72 65 73 73 48 outf, ProgressH
26b0: 61 6e 64 6c 65 72 20 70 68 20 29 0a 09 7b 0a 09 andler ph )..{..
26c0: 09 75 69 6e 74 20 69 6e 69 74 5f 75 73 69 7a 20 .uint init_usiz
26d0: 3d 20 75 73 69 7a 3b 0a 0a 09 09 2f 2f 20 7a 6c = usiz;....// zl
26e0: 69 62 e3 81 a7 e5 b1 95 e9 96 8b 0a 09 09 66 70 ib............fp
26f0: 2e 72 65 61 64 28 31 30 29 3b 20 63 73 69 7a 20 .read(10); csiz
2700: 2d 3d 20 31 30 3b 20 2f 2f 20 e3 83 98 e3 83 83 -= 10; // ......
2710: e3 83 80 2c e3 83 95 e3 83 83 e3 82 bf e3 82 b9 ...,............
2720: e3 82 ad e3 83 83 e3 83 97 0a 0a 09 09 75 62 79 .............uby
2730: 74 65 5b 5d 20 20 69 6e 62 75 66 3b 20 20 69 6e te[] inbuf; in
2740: 62 75 66 2e 6c 65 6e 67 74 68 20 3d 20 36 35 35 buf.length = 655
2750: 33 36 3b 0a 09 09 75 62 79 74 65 5b 5d 20 6f 75 36;...ubyte[] ou
2760: 74 62 75 66 3b 20 6f 75 74 62 75 66 2e 6c 65 6e tbuf; outbuf.len
2770: 67 74 68 20 3d 20 36 35 35 33 36 3b 0a 0a 09 09 gth = 65536;....
2780: 2f 2f 20 7a 6c 69 62 e6 ba 96 e5 82 99 0a 09 09 // zlib.........
2790: 7a 5f 73 74 72 65 61 6d 20 7a 73 3b 0a 09 09 7a z_stream zs;...z
27a0: 73 2e 7a 61 6c 6c 6f 63 20 20 20 3d 20 6e 75 6c s.zalloc = nul
27b0: 6c 3b 0a 09 09 7a 73 2e 7a 66 72 65 65 20 20 20 l;...zs.zfree
27c0: 20 3d 20 6e 75 6c 6c 3b 0a 0a 09 09 2f 2f 20 e5 = null;....// .
27d0: 87 ba e5 8a 9b e3 83 90 e3 83 83 e3 83 95 e3 82 ................
27e0: a1 0a 09 09 7a 73 2e 6e 65 78 74 5f 6f 75 74 20 ....zs.next_out
27f0: 20 3d 20 6f 75 74 62 75 66 2e 70 74 72 3b 0a 09 = outbuf.ptr;..
2800: 09 7a 73 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 .zs.avail_out =
2810: 6f 75 74 62 75 66 2e 6c 65 6e 67 74 68 3b 0a 0a outbuf.length;..
2820: 09 09 2f 2f 20 e5 85 a5 e5 8a 9b e3 83 90 e3 83 ..// ...........
2830: 83 e3 83 95 e3 82 a1 0a 09 09 69 6e 62 75 66 20 ..........inbuf
2840: 3d 20 63 61 73 74 28 75 62 79 74 65 5b 5d 29 20 = cast(ubyte[])
2850: 66 70 2e 72 65 61 64 28 20 63 73 69 7a 3c 36 35 fp.read( csiz<65
2860: 35 33 36 20 3f 20 63 73 69 7a 20 3a 20 36 35 35 536 ? csiz : 655
2870: 33 36 20 29 3b 0a 09 09 63 73 69 7a 20 20 20 20 36 );...csiz
2880: 20 20 20 2d 3d 20 69 6e 62 75 66 2e 6c 65 6e 67 -= inbuf.leng
2890: 74 68 3b 0a 09 09 7a 73 2e 6e 65 78 74 5f 69 6e th;...zs.next_in
28a0: 20 20 3d 20 69 6e 62 75 66 2e 70 74 72 3b 0a 09 = inbuf.ptr;..
28b0: 09 7a 73 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 69 .zs.avail_in = i
28c0: 6e 62 75 66 2e 6c 65 6e 67 74 68 3b 0a 0a 09 09 nbuf.length;....
28d0: 2f 2f 20 e3 82 b9 e3 82 bf e3 83 bc e3 83 88 0a // .............
28e0: 09 09 69 6e 66 6c 61 74 65 49 6e 69 74 32 28 20 ..inflateInit2(
28f0: 26 7a 73 2c 20 2d 31 35 20 29 3b 0a 09 09 74 72 &zs, -15 );...tr
2900: 79 20 7b 0a 0a 09 09 2f 2f 20 e6 9b b8 e5 ba ab y {....// ......
2910: e3 81 8b e3 82 89 e5 85 a5 e5 8a 9b e3 81 97 e7 ................
2920: b5 82 e3 82 8f e3 82 8b e3 81 be e3 81 a7 e3 83 ................
2930: ab e3 83 bc e3 83 97 0a 09 09 69 6e 74 20 65 72 ..........int er
2940: 72 20 3d 20 5a 5f 4f 4b 3b 0a 09 09 77 68 69 6c r = Z_OK;...whil
2950: 65 28 20 63 73 69 7a 26 26 75 73 69 7a 20 29 0a e( csiz&&usiz ).
2960: 09 09 7b 0a 09 09 09 77 68 69 6c 65 28 20 7a 73 ..{....while( zs
2970: 2e 61 76 61 69 6c 5f 6f 75 74 20 3e 20 30 20 29 .avail_out > 0 )
2980: 0a 09 09 09 7b 0a 09 09 09 09 65 72 72 20 3d 20 ....{.....err =
2990: 65 74 63 2e 63 2e 7a 6c 69 62 2e 69 6e 66 6c 61 etc.c.zlib.infla
29a0: 74 65 28 20 26 7a 73 2c 20 5a 5f 50 41 52 54 49 te( &zs, Z_PARTI
29b0: 41 4c 5f 46 4c 55 53 48 20 29 3b 0a 09 09 09 09 AL_FLUSH );.....
29c0: 69 66 28 20 65 72 72 21 3d 5a 5f 53 54 52 45 41 if( err!=Z_STREA
29d0: 4d 5f 45 4e 44 20 26 26 20 65 72 72 21 3d 5a 5f M_END && err!=Z_
29e0: 4f 4b 20 29 0a 09 09 09 09 09 63 73 69 7a 3d 30 OK )......csiz=0
29f0: 3b 0a 09 09 09 09 69 66 28 20 21 63 73 69 7a 20 ;.....if( !csiz
2a00: 29 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 0a 09 )......break;...
2a10: 09 09 09 69 66 28 20 7a 73 2e 61 76 61 69 6c 5f ...if( zs.avail_
2a20: 69 6e 3c 3d 30 20 29 0a 09 09 09 09 7b 0a 09 09 in<=0 ).....{...
2a30: 09 09 09 69 6e 62 75 66 20 3d 20 63 61 73 74 28 ...inbuf = cast(
2a40: 75 62 79 74 65 5b 5d 29 20 66 70 2e 72 65 61 64 ubyte[]) fp.read
2a50: 28 20 63 73 69 7a 3c 36 35 35 33 36 20 3f 20 63 ( csiz<65536 ? c
2a60: 73 69 7a 20 3a 20 36 35 35 33 36 20 29 3b 0a 09 siz : 65536 );..
2a70: 09 09 09 09 63 73 69 7a 20 20 20 20 20 20 20 2d ....csiz -
2a80: 3d 20 69 6e 62 75 66 2e 6c 65 6e 67 74 68 3b 0a = inbuf.length;.
2a90: 09 09 09 09 09 7a 73 2e 6e 65 78 74 5f 69 6e 20 .....zs.next_in
2aa0: 20 3d 20 69 6e 62 75 66 2e 70 74 72 3b 0a 09 09 = inbuf.ptr;...
2ab0: 09 09 09 7a 73 2e 61 76 61 69 6c 5f 69 6e 20 3d ...zs.avail_in =
2ac0: 20 69 6e 62 75 66 2e 6c 65 6e 67 74 68 3b 0a 0a inbuf.length;..
2ad0: 09 09 09 09 09 69 66 28 20 69 6e 62 75 66 2e 6c .....if( inbuf.l
2ae0: 65 6e 67 74 68 3d 3d 30 20 29 0a 09 09 09 09 09 ength==0 )......
2af0: 7b 0a 09 09 09 09 09 09 65 72 72 20 20 3d 20 5a {.......err = Z
2b00: 5f 53 54 52 45 41 4d 5f 45 4e 44 3b 0a 09 09 09 _STREAM_END;....
2b10: 09 09 09 63 73 69 7a 20 3d 20 30 3b 0a 09 09 09 ...csiz = 0;....
2b20: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d ...break;......}
2b30: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 .....}....}.....
2b40: 69 6e 74 20 77 72 69 74 74 65 6e 20 3d 20 6f 75 int written = ou
2b50: 74 62 75 66 2e 6c 65 6e 67 74 68 20 2d 20 7a 73 tbuf.length - zs
2b60: 2e 61 76 61 69 6c 5f 6f 75 74 3b 0a 09 09 09 69 .avail_out;....i
2b70: 66 28 20 75 73 69 7a 20 3c 20 77 72 69 74 74 65 f( usiz < writte
2b80: 6e 20 29 20 77 72 69 74 74 65 6e 20 3d 20 75 73 n ) written = us
2b90: 69 7a 3b 0a 09 09 09 75 73 69 7a 20 2d 3d 20 77 iz;....usiz -= w
2ba0: 72 69 74 74 65 6e 3b 0a 09 09 09 6f 75 74 66 2e ritten;....outf.
2bb0: 77 72 69 74 65 28 20 6f 75 74 62 75 66 5b 30 2e write( outbuf[0.
2bc0: 2e 77 72 69 74 74 65 6e 5d 20 29 3b 0a 09 09 09 .written] );....
2bd0: 7a 73 2e 6e 65 78 74 5f 6f 75 74 20 20 3d 20 6f zs.next_out = o
2be0: 75 74 62 75 66 2e 70 74 72 3b 0a 09 09 09 7a 73 utbuf.ptr;....zs
2bf0: 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 6f 75 74 .avail_out = out
2c00: 62 75 66 2e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 buf.length;.....
2c10: 2f 2f 20 64 6c 67 0a 09 09 09 69 66 28 20 42 67 // dlg....if( Bg
2c20: 61 41 6e 73 77 65 72 2e 41 62 6f 72 74 3d 3d 70 aAnswer.Abort==p
2c30: 68 28 69 6e 69 74 5f 75 73 69 7a 2d 75 73 69 7a h(init_usiz-usiz
2c40: 2c 75 73 69 7a 29 20 29 20 72 65 74 75 72 6e 20 ,usiz) ) return
2c50: 66 61 6c 73 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2f false;...}....//
2c60: 20 e5 87 ba e5 8a 9b e6 ae 8b e3 81 97 e3 82 92 ...............
2c70: e7 84 a1 e3 81 8f e3 81 99 e3 80 82 0a 09 09 77 ...............w
2c80: 68 69 6c 65 28 20 65 72 72 21 3d 5a 5f 53 54 52 hile( err!=Z_STR
2c90: 45 41 4d 5f 45 4e 44 26 26 75 73 69 7a 20 29 0a EAM_END&&usiz ).
2ca0: 09 09 7b 0a 09 09 09 65 72 72 20 3d 20 65 74 63 ..{....err = etc
2cb0: 2e 63 2e 7a 6c 69 62 2e 69 6e 66 6c 61 74 65 28 .c.zlib.inflate(
2cc0: 26 7a 73 2c 5a 5f 50 41 52 54 49 41 4c 5f 46 4c &zs,Z_PARTIAL_FL
2cd0: 55 53 48 29 3b 0a 09 09 09 69 66 28 20 65 72 72 USH);....if( err
2ce0: 21 3d 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 20 26 !=Z_STREAM_END &
2cf0: 26 20 65 72 72 21 3d 5a 5f 4f 4b 20 29 0a 09 09 & err!=Z_OK )...
2d00: 09 09 62 72 65 61 6b 3b 0a 0a 09 09 09 69 6e 74 ..break;.....int
2d10: 20 77 72 69 74 74 65 6e 20 3d 20 6f 75 74 62 75 written = outbu
2d20: 66 2e 6c 65 6e 67 74 68 20 2d 20 7a 73 2e 61 76 f.length - zs.av
2d30: 61 69 6c 5f 6f 75 74 3b 0a 09 09 09 69 66 28 20 ail_out;....if(
2d40: 75 73 69 7a 20 3c 20 77 72 69 74 74 65 6e 20 29 usiz < written )
2d50: 20 77 72 69 74 74 65 6e 20 3d 20 75 73 69 7a 3b written = usiz;
2d60: 0a 09 09 09 75 73 69 7a 20 2d 3d 20 77 72 69 74 ....usiz -= writ
2d70: 74 65 6e 3b 0a 09 09 09 6f 75 74 66 2e 77 72 69 ten;....outf.wri
2d80: 74 65 28 20 6f 75 74 62 75 66 5b 30 2e 2e 77 72 te( outbuf[0..wr
2d90: 69 74 74 65 6e 5d 20 29 3b 0a 09 09 09 7a 73 2e itten] );....zs.
2da0: 6e 65 78 74 5f 6f 75 74 20 20 3d 20 6f 75 74 62 next_out = outb
2db0: 75 66 2e 70 74 72 3b 0a 09 09 09 7a 73 2e 61 76 uf.ptr;....zs.av
2dc0: 61 69 6c 5f 6f 75 74 20 3d 20 6f 75 74 62 75 66 ail_out = outbuf
2dd0: 2e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 2f 2f 20 .length;.....//
2de0: 64 6c 67 0a 09 09 09 69 66 28 20 42 67 61 41 6e dlg....if( BgaAn
2df0: 73 77 65 72 2e 41 62 6f 72 74 3d 3d 70 68 28 69 swer.Abort==ph(i
2e00: 6e 69 74 5f 75 73 69 7a 2d 75 73 69 7a 2c 75 73 nit_usiz-usiz,us
2e10: 69 7a 29 20 29 20 72 65 74 75 72 6e 20 66 61 6c iz) ) return fal
2e20: 73 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2f 20 e7 b5 se;...}....// ..
2e30: 82 e4 ba 86 0a 09 09 7d 20 66 69 6e 61 6c 6c 79 .......} finally
2e40: 20 7b 20 69 6e 66 6c 61 74 65 45 6e 64 28 26 7a { inflateEnd(&z
2e50: 73 29 3b 20 7d 0a 0a 09 09 2f 2f 20 64 6c 67 0a s); }....// dlg.
2e60: 09 09 69 66 28 20 42 67 61 41 6e 73 77 65 72 2e ..if( BgaAnswer.
2e70: 41 62 6f 72 74 3d 3d 70 68 28 69 6e 69 74 5f 75 Abort==ph(init_u
2e80: 73 69 7a 2d 75 73 69 7a 2c 75 73 69 7a 29 20 29 siz-usiz,usiz) )
2e90: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 return false;..
2ea0: 09 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 09 7d .return true;..}
2eb0: 0a 0a 09 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 ...private bool
2ec0: 42 7a 44 65 63 28 20 75 69 6e 74 20 75 73 69 7a BzDec( uint usiz
2ed0: 2c 20 46 69 6c 65 70 20 6f 75 74 66 2c 20 50 72 , Filep outf, Pr
2ee0: 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 20 70 68 ogressHandler ph
2ef0: 20 29 0a 09 7b 0a 09 09 75 69 6e 74 20 69 6e 69 )..{...uint ini
2f00: 74 5f 75 73 69 7a 20 3d 20 75 73 69 7a 3b 0a 0a t_usiz = usiz;..
2f10: 09 09 2f 2f 20 6c 69 62 62 7a 32 e3 81 a7 e5 b1 ..// libbz2.....
2f20: 95 e9 96 8b 0a 09 09 69 6e 74 20 65 72 72 3b 0a .......int err;.
2f30: 09 09 42 5a 46 49 4c 45 2a 20 62 20 3d 20 42 5a ..BZFILE* b = BZ
2f40: 32 5f 62 7a 52 65 61 64 4f 70 65 6e 28 20 26 65 2_bzReadOpen( &e
2f50: 72 72 2c 20 66 70 2e 67 65 74 5f 66 70 28 29 2c rr, fp.get_fp(),
2f60: 20 30 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 20 29 0, 0, null, 0 )
2f70: 3b 0a 09 09 69 66 28 20 65 72 72 21 3d 42 5a 5f ;...if( err!=BZ_
2f80: 4f 4b 20 7c 7c 20 62 20 69 73 20 6e 75 6c 6c 20 OK || b is null
2f90: 29 0a 09 09 09 72 65 74 75 72 6e 20 74 72 75 65 )....return true
2fa0: 3b 0a 0a 09 09 74 72 79 0a 09 09 7b 0a 09 09 09 ;....try...{....
2fb0: 63 68 61 72 5b 5d 20 62 75 66 3b 20 62 75 66 2e char[] buf; buf.
2fc0: 6c 65 6e 67 74 68 20 3d 20 42 55 46 53 49 5a 3b length = BUFSIZ;
2fd0: 0a 09 09 09 69 6e 74 20 6c 65 6e 3b 0a 09 09 09 ....int len;....
2fe0: 77 68 69 6c 65 28 20 30 3c 28 6c 65 6e 3d 42 5a while( 0<(len=BZ
2ff0: 32 5f 62 7a 52 65 61 64 28 20 26 65 72 72 2c 20 2_bzRead( &err,
3000: 62 2c 20 62 75 66 2e 70 74 72 2c 20 42 55 46 53 b, buf.ptr, BUFS
3010: 49 5a 3c 75 73 69 7a 3f 42 55 46 53 49 5a 3a 75 IZ<usiz?BUFSIZ:u
3020: 73 69 7a 20 29 29 20 29 0a 09 09 09 7b 0a 09 09 siz )) )....{...
3030: 09 09 6f 75 74 66 2e 77 72 69 74 65 28 20 62 75 ..outf.write( bu
3040: 66 5b 30 2e 2e 6c 65 6e 5d 20 29 3b 0a 09 09 09 f[0..len] );....
3050: 09 75 73 69 7a 20 2d 3d 20 6c 65 6e 3b 0a 09 09 .usiz -= len;...
3060: 09 09 69 66 28 20 65 72 72 20 21 3d 20 42 5a 5f ..if( err != BZ_
3070: 4f 4b 20 29 0a 09 09 09 09 09 62 72 65 61 6b 3b OK )......break;
3080: 0a 0a 09 09 09 09 2f 2f 20 64 6c 67 0a 09 09 09 ......// dlg....
3090: 09 69 66 28 20 42 67 61 41 6e 73 77 65 72 2e 41 .if( BgaAnswer.A
30a0: 62 6f 72 74 3d 3d 70 68 28 69 6e 69 74 5f 75 73 bort==ph(init_us
30b0: 69 7a 2d 75 73 69 7a 2c 75 73 69 7a 29 20 29 20 iz-usiz,usiz) )
30c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 09 09 return false;...
30d0: 09 7d 0a 09 09 7d 20 66 69 6e 61 6c 6c 79 20 7b .}...} finally {
30e0: 20 42 5a 32 5f 62 7a 52 65 61 64 43 6c 6f 73 65 BZ2_bzReadClose
30f0: 28 20 26 65 72 72 2c 20 62 20 29 3b 20 7d 0a 0a ( &err, b ); }..
3100: 09 09 2f 2f 20 64 6c 67 0a 09 09 69 66 28 20 42 ..// dlg...if( B
3110: 67 61 41 6e 73 77 65 72 2e 41 62 6f 72 74 3d 3d gaAnswer.Abort==
3120: 70 68 28 69 6e 69 74 5f 75 73 69 7a 2d 75 73 69 ph(init_usiz-usi
3130: 7a 2c 75 73 69 7a 29 20 29 20 72 65 74 75 72 6e z,usiz) ) return
3140: 20 66 61 6c 73 65 3b 0a 09 09 72 65 74 75 72 6e false;...return
3150: 20 74 72 75 65 3b 0a 09 7d 0a 7d 0a true;..}.}.