fast_excel 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +5 -2
- data/Makefile +14 -0
- data/README.md +7 -2
- data/Rakefile +10 -0
- data/extconf.rb +0 -0
- data/fast_excel.gemspec +3 -1
- data/lib/fast_excel/binding.rb +3 -7
- data/lib/rubygems_plugin.rb +3 -0
- data/libxlsxwriter/.gitignore +49 -0
- data/libxlsxwriter/.indent.pro +125 -0
- data/libxlsxwriter/.travis.yml +25 -0
- data/libxlsxwriter/CONTRIBUTING.md +226 -0
- data/libxlsxwriter/Changes.txt +557 -0
- data/libxlsxwriter/LICENSE.txt +89 -0
- data/libxlsxwriter/Makefile +156 -0
- data/libxlsxwriter/Readme.md +78 -0
- data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +30 -0
- data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +7 -0
- data/libxlsxwriter/include/xlsxwriter/app.h +79 -0
- data/libxlsxwriter/include/xlsxwriter/chart.h +3476 -0
- data/libxlsxwriter/include/xlsxwriter/common.h +372 -0
- data/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
- data/libxlsxwriter/include/xlsxwriter/core.h +51 -0
- data/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
- data/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
- data/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
- data/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
- data/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
- data/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
- data/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
- data/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
- data/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +214 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
- data/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
- data/libxlsxwriter/include/xlsxwriter/workbook.h +757 -0
- data/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
- data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
- data/libxlsxwriter/include/xlsxwriter.h +23 -0
- data/libxlsxwriter/lib/.gitignore +0 -0
- data/libxlsxwriter/libxlsxwriter.podspec +47 -0
- data/libxlsxwriter/src/Makefile +130 -0
- data/libxlsxwriter/src/app.c +443 -0
- data/libxlsxwriter/src/chart.c +6346 -0
- data/libxlsxwriter/src/content_types.c +345 -0
- data/libxlsxwriter/src/core.c +293 -0
- data/libxlsxwriter/src/custom.c +224 -0
- data/libxlsxwriter/src/drawing.c +746 -0
- data/libxlsxwriter/src/format.c +729 -0
- data/libxlsxwriter/src/hash_table.c +223 -0
- data/libxlsxwriter/src/packager.c +948 -0
- data/libxlsxwriter/src/relationships.c +245 -0
- data/libxlsxwriter/src/shared_strings.c +266 -0
- data/libxlsxwriter/src/styles.c +1088 -0
- data/libxlsxwriter/src/theme.c +348 -0
- data/libxlsxwriter/src/utility.c +515 -0
- data/libxlsxwriter/src/workbook.c +1930 -0
- data/libxlsxwriter/src/worksheet.c +5022 -0
- data/libxlsxwriter/src/xmlwriter.c +355 -0
- data/libxlsxwriter/third_party/minizip/Makefile +44 -0
- data/libxlsxwriter/third_party/minizip/Makefile.am +45 -0
- data/libxlsxwriter/third_party/minizip/Makefile.orig +25 -0
- data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +6 -0
- data/libxlsxwriter/third_party/minizip/MiniZip64_info.txt +74 -0
- data/libxlsxwriter/third_party/minizip/README.txt +5 -0
- data/libxlsxwriter/third_party/minizip/configure.ac +32 -0
- data/libxlsxwriter/third_party/minizip/crypt.h +131 -0
- data/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
- data/libxlsxwriter/third_party/minizip/ioapi.h +208 -0
- data/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
- data/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
- data/libxlsxwriter/third_party/minizip/make_vms.com +25 -0
- data/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
- data/libxlsxwriter/third_party/minizip/miniunzip.1 +63 -0
- data/libxlsxwriter/third_party/minizip/minizip.1 +46 -0
- data/libxlsxwriter/third_party/minizip/minizip.c +520 -0
- data/libxlsxwriter/third_party/minizip/minizip.pc.in +12 -0
- data/libxlsxwriter/third_party/minizip/mztools.c +291 -0
- data/libxlsxwriter/third_party/minizip/mztools.h +37 -0
- data/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
- data/libxlsxwriter/third_party/minizip/unzip.h +437 -0
- data/libxlsxwriter/third_party/minizip/zip.c +2007 -0
- data/libxlsxwriter/third_party/minizip/zip.h +367 -0
- data/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
- data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
- data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
- data/libxlsxwriter/version.txt +1 -0
- metadata +89 -6
- data/binaries/libxlsxwriter-alpine.so +0 -0
- data/binaries/libxlsxwriter-darwin.dylib +0 -0
- data/binaries/libxlsxwriter-glibc.so +0 -0
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
/*
|
|
2
|
+
miniunz.c
|
|
3
|
+
Version 1.1, February 14h, 2010
|
|
4
|
+
sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
|
5
|
+
|
|
6
|
+
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
|
7
|
+
|
|
8
|
+
Modifications of Unzip for Zip64
|
|
9
|
+
Copyright (C) 2007-2008 Even Rouault
|
|
10
|
+
|
|
11
|
+
Modifications for Zip64 support on both zip and unzip
|
|
12
|
+
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
|
|
16
|
+
#ifndef __USE_FILE_OFFSET64
|
|
17
|
+
#define __USE_FILE_OFFSET64
|
|
18
|
+
#endif
|
|
19
|
+
#ifndef __USE_LARGEFILE64
|
|
20
|
+
#define __USE_LARGEFILE64
|
|
21
|
+
#endif
|
|
22
|
+
#ifndef _LARGEFILE64_SOURCE
|
|
23
|
+
#define _LARGEFILE64_SOURCE
|
|
24
|
+
#endif
|
|
25
|
+
#ifndef _FILE_OFFSET_BIT
|
|
26
|
+
#define _FILE_OFFSET_BIT 64
|
|
27
|
+
#endif
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
#ifdef __APPLE__
|
|
31
|
+
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
|
|
32
|
+
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
|
|
33
|
+
#define FTELLO_FUNC(stream) ftello(stream)
|
|
34
|
+
#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
|
|
35
|
+
#else
|
|
36
|
+
#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
|
|
37
|
+
#define FTELLO_FUNC(stream) ftello64(stream)
|
|
38
|
+
#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
#include <stdio.h>
|
|
43
|
+
#include <stdlib.h>
|
|
44
|
+
#include <string.h>
|
|
45
|
+
#include <time.h>
|
|
46
|
+
#include <errno.h>
|
|
47
|
+
#include <fcntl.h>
|
|
48
|
+
|
|
49
|
+
#ifdef _WIN32
|
|
50
|
+
# include <direct.h>
|
|
51
|
+
# include <io.h>
|
|
52
|
+
#else
|
|
53
|
+
# include <unistd.h>
|
|
54
|
+
# include <utime.h>
|
|
55
|
+
#endif
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
#include "unzip.h"
|
|
59
|
+
|
|
60
|
+
#define CASESENSITIVITY (0)
|
|
61
|
+
#define WRITEBUFFERSIZE (8192)
|
|
62
|
+
#define MAXFILENAME (256)
|
|
63
|
+
|
|
64
|
+
#ifdef _WIN32
|
|
65
|
+
#define USEWIN32IOAPI
|
|
66
|
+
#include "iowin32.h"
|
|
67
|
+
#endif
|
|
68
|
+
/*
|
|
69
|
+
mini unzip, demo of unzip package
|
|
70
|
+
|
|
71
|
+
usage :
|
|
72
|
+
Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir]
|
|
73
|
+
|
|
74
|
+
list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
|
|
75
|
+
if it exists
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
/* change_file_date : change the date/time of a file
|
|
80
|
+
filename : the filename of the file where date/time must be modified
|
|
81
|
+
dosdate : the new date at the MSDos format (4 bytes)
|
|
82
|
+
tmu_date : the SAME new date at the tm_unz format */
|
|
83
|
+
void change_file_date(filename,dosdate,tmu_date)
|
|
84
|
+
const char *filename;
|
|
85
|
+
uLong dosdate;
|
|
86
|
+
tm_unz tmu_date;
|
|
87
|
+
{
|
|
88
|
+
#ifdef _WIN32
|
|
89
|
+
HANDLE hFile;
|
|
90
|
+
FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
|
|
91
|
+
|
|
92
|
+
hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE,
|
|
93
|
+
0,NULL,OPEN_EXISTING,0,NULL);
|
|
94
|
+
GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
|
|
95
|
+
DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
|
|
96
|
+
LocalFileTimeToFileTime(&ftLocal,&ftm);
|
|
97
|
+
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
|
|
98
|
+
CloseHandle(hFile);
|
|
99
|
+
#else
|
|
100
|
+
#ifdef unix || __APPLE__
|
|
101
|
+
struct utimbuf ut;
|
|
102
|
+
struct tm newdate;
|
|
103
|
+
newdate.tm_sec = tmu_date.tm_sec;
|
|
104
|
+
newdate.tm_min=tmu_date.tm_min;
|
|
105
|
+
newdate.tm_hour=tmu_date.tm_hour;
|
|
106
|
+
newdate.tm_mday=tmu_date.tm_mday;
|
|
107
|
+
newdate.tm_mon=tmu_date.tm_mon;
|
|
108
|
+
if (tmu_date.tm_year > 1900)
|
|
109
|
+
newdate.tm_year=tmu_date.tm_year - 1900;
|
|
110
|
+
else
|
|
111
|
+
newdate.tm_year=tmu_date.tm_year ;
|
|
112
|
+
newdate.tm_isdst=-1;
|
|
113
|
+
|
|
114
|
+
ut.actime=ut.modtime=mktime(&newdate);
|
|
115
|
+
utime(filename,&ut);
|
|
116
|
+
#endif
|
|
117
|
+
#endif
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
/* mymkdir and change_file_date are not 100 % portable
|
|
122
|
+
As I don't know well Unix, I wait feedback for the unix portion */
|
|
123
|
+
|
|
124
|
+
int mymkdir(dirname)
|
|
125
|
+
const char* dirname;
|
|
126
|
+
{
|
|
127
|
+
int ret=0;
|
|
128
|
+
#ifdef _WIN32
|
|
129
|
+
ret = _mkdir(dirname);
|
|
130
|
+
#elif unix
|
|
131
|
+
ret = mkdir (dirname,0775);
|
|
132
|
+
#elif __APPLE__
|
|
133
|
+
ret = mkdir (dirname,0775);
|
|
134
|
+
#endif
|
|
135
|
+
return ret;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
int makedir (newdir)
|
|
139
|
+
char *newdir;
|
|
140
|
+
{
|
|
141
|
+
char *buffer ;
|
|
142
|
+
char *p;
|
|
143
|
+
int len = (int)strlen(newdir);
|
|
144
|
+
|
|
145
|
+
if (len <= 0)
|
|
146
|
+
return 0;
|
|
147
|
+
|
|
148
|
+
buffer = (char*)malloc(len+1);
|
|
149
|
+
if (buffer==NULL)
|
|
150
|
+
{
|
|
151
|
+
printf("Error allocating memory\n");
|
|
152
|
+
return UNZ_INTERNALERROR;
|
|
153
|
+
}
|
|
154
|
+
strcpy(buffer,newdir);
|
|
155
|
+
|
|
156
|
+
if (buffer[len-1] == '/') {
|
|
157
|
+
buffer[len-1] = '\0';
|
|
158
|
+
}
|
|
159
|
+
if (mymkdir(buffer) == 0)
|
|
160
|
+
{
|
|
161
|
+
free(buffer);
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
p = buffer+1;
|
|
166
|
+
while (1)
|
|
167
|
+
{
|
|
168
|
+
char hold;
|
|
169
|
+
|
|
170
|
+
while(*p && *p != '\\' && *p != '/')
|
|
171
|
+
p++;
|
|
172
|
+
hold = *p;
|
|
173
|
+
*p = 0;
|
|
174
|
+
if ((mymkdir(buffer) == -1) && (errno == ENOENT))
|
|
175
|
+
{
|
|
176
|
+
printf("couldn't create directory %s\n",buffer);
|
|
177
|
+
free(buffer);
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
if (hold == 0)
|
|
181
|
+
break;
|
|
182
|
+
*p++ = hold;
|
|
183
|
+
}
|
|
184
|
+
free(buffer);
|
|
185
|
+
return 1;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
void do_banner()
|
|
189
|
+
{
|
|
190
|
+
printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
|
|
191
|
+
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
void do_help()
|
|
195
|
+
{
|
|
196
|
+
printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
|
|
197
|
+
" -e Extract without pathname (junk paths)\n" \
|
|
198
|
+
" -x Extract with pathname\n" \
|
|
199
|
+
" -v list files\n" \
|
|
200
|
+
" -l list files\n" \
|
|
201
|
+
" -d directory to extract into\n" \
|
|
202
|
+
" -o overwrite files without prompting\n" \
|
|
203
|
+
" -p extract crypted file using password\n\n");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
void Display64BitsSize(ZPOS64_T n, int size_char)
|
|
207
|
+
{
|
|
208
|
+
/* to avoid compatibility problem , we do here the conversion */
|
|
209
|
+
char number[21];
|
|
210
|
+
int offset=19;
|
|
211
|
+
int pos_string = 19;
|
|
212
|
+
number[20]=0;
|
|
213
|
+
for (;;) {
|
|
214
|
+
number[offset]=(char)((n%10)+'0');
|
|
215
|
+
if (number[offset] != '0')
|
|
216
|
+
pos_string=offset;
|
|
217
|
+
n/=10;
|
|
218
|
+
if (offset==0)
|
|
219
|
+
break;
|
|
220
|
+
offset--;
|
|
221
|
+
}
|
|
222
|
+
{
|
|
223
|
+
int size_display_string = 19-pos_string;
|
|
224
|
+
while (size_char > size_display_string)
|
|
225
|
+
{
|
|
226
|
+
size_char--;
|
|
227
|
+
printf(" ");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
printf("%s",&number[pos_string]);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
int do_list(uf)
|
|
235
|
+
unzFile uf;
|
|
236
|
+
{
|
|
237
|
+
uLong i;
|
|
238
|
+
unz_global_info64 gi;
|
|
239
|
+
int err;
|
|
240
|
+
|
|
241
|
+
err = unzGetGlobalInfo64(uf,&gi);
|
|
242
|
+
if (err!=UNZ_OK)
|
|
243
|
+
printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
|
244
|
+
printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
|
|
245
|
+
printf(" ------ ------ ---- ----- ---- ---- ------ ----\n");
|
|
246
|
+
for (i=0;i<gi.number_entry;i++)
|
|
247
|
+
{
|
|
248
|
+
char filename_inzip[256];
|
|
249
|
+
unz_file_info64 file_info;
|
|
250
|
+
uLong ratio=0;
|
|
251
|
+
const char *string_method;
|
|
252
|
+
char charCrypt=' ';
|
|
253
|
+
err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
|
254
|
+
if (err!=UNZ_OK)
|
|
255
|
+
{
|
|
256
|
+
printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
if (file_info.uncompressed_size>0)
|
|
260
|
+
ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size);
|
|
261
|
+
|
|
262
|
+
/* display a '*' if the file is crypted */
|
|
263
|
+
if ((file_info.flag & 1) != 0)
|
|
264
|
+
charCrypt='*';
|
|
265
|
+
|
|
266
|
+
if (file_info.compression_method==0)
|
|
267
|
+
string_method="Stored";
|
|
268
|
+
else
|
|
269
|
+
if (file_info.compression_method==Z_DEFLATED)
|
|
270
|
+
{
|
|
271
|
+
uInt iLevel=(uInt)((file_info.flag & 0x6)/2);
|
|
272
|
+
if (iLevel==0)
|
|
273
|
+
string_method="Defl:N";
|
|
274
|
+
else if (iLevel==1)
|
|
275
|
+
string_method="Defl:X";
|
|
276
|
+
else if ((iLevel==2) || (iLevel==3))
|
|
277
|
+
string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
|
|
278
|
+
}
|
|
279
|
+
else
|
|
280
|
+
if (file_info.compression_method==Z_BZIP2ED)
|
|
281
|
+
{
|
|
282
|
+
string_method="BZip2 ";
|
|
283
|
+
}
|
|
284
|
+
else
|
|
285
|
+
string_method="Unkn. ";
|
|
286
|
+
|
|
287
|
+
Display64BitsSize(file_info.uncompressed_size,7);
|
|
288
|
+
printf(" %6s%c",string_method,charCrypt);
|
|
289
|
+
Display64BitsSize(file_info.compressed_size,7);
|
|
290
|
+
printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
|
|
291
|
+
ratio,
|
|
292
|
+
(uLong)file_info.tmu_date.tm_mon + 1,
|
|
293
|
+
(uLong)file_info.tmu_date.tm_mday,
|
|
294
|
+
(uLong)file_info.tmu_date.tm_year % 100,
|
|
295
|
+
(uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,
|
|
296
|
+
(uLong)file_info.crc,filename_inzip);
|
|
297
|
+
if ((i+1)<gi.number_entry)
|
|
298
|
+
{
|
|
299
|
+
err = unzGoToNextFile(uf);
|
|
300
|
+
if (err!=UNZ_OK)
|
|
301
|
+
{
|
|
302
|
+
printf("error %d with zipfile in unzGoToNextFile\n",err);
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return 0;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
|
|
313
|
+
unzFile uf;
|
|
314
|
+
const int* popt_extract_without_path;
|
|
315
|
+
int* popt_overwrite;
|
|
316
|
+
const char* password;
|
|
317
|
+
{
|
|
318
|
+
char filename_inzip[256];
|
|
319
|
+
char* filename_withoutpath;
|
|
320
|
+
char* p;
|
|
321
|
+
int err=UNZ_OK;
|
|
322
|
+
FILE *fout=NULL;
|
|
323
|
+
void* buf;
|
|
324
|
+
uInt size_buf;
|
|
325
|
+
|
|
326
|
+
unz_file_info64 file_info;
|
|
327
|
+
uLong ratio=0;
|
|
328
|
+
err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
|
329
|
+
|
|
330
|
+
if (err!=UNZ_OK)
|
|
331
|
+
{
|
|
332
|
+
printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
|
|
333
|
+
return err;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
size_buf = WRITEBUFFERSIZE;
|
|
337
|
+
buf = (void*)malloc(size_buf);
|
|
338
|
+
if (buf==NULL)
|
|
339
|
+
{
|
|
340
|
+
printf("Error allocating memory\n");
|
|
341
|
+
return UNZ_INTERNALERROR;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
p = filename_withoutpath = filename_inzip;
|
|
345
|
+
while ((*p) != '\0')
|
|
346
|
+
{
|
|
347
|
+
if (((*p)=='/') || ((*p)=='\\'))
|
|
348
|
+
filename_withoutpath = p+1;
|
|
349
|
+
p++;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if ((*filename_withoutpath)=='\0')
|
|
353
|
+
{
|
|
354
|
+
if ((*popt_extract_without_path)==0)
|
|
355
|
+
{
|
|
356
|
+
printf("creating directory: %s\n",filename_inzip);
|
|
357
|
+
mymkdir(filename_inzip);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
else
|
|
361
|
+
{
|
|
362
|
+
const char* write_filename;
|
|
363
|
+
int skip=0;
|
|
364
|
+
|
|
365
|
+
if ((*popt_extract_without_path)==0)
|
|
366
|
+
write_filename = filename_inzip;
|
|
367
|
+
else
|
|
368
|
+
write_filename = filename_withoutpath;
|
|
369
|
+
|
|
370
|
+
err = unzOpenCurrentFilePassword(uf,password);
|
|
371
|
+
if (err!=UNZ_OK)
|
|
372
|
+
{
|
|
373
|
+
printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (((*popt_overwrite)==0) && (err==UNZ_OK))
|
|
377
|
+
{
|
|
378
|
+
char rep=0;
|
|
379
|
+
FILE* ftestexist;
|
|
380
|
+
ftestexist = FOPEN_FUNC(write_filename,"rb");
|
|
381
|
+
if (ftestexist!=NULL)
|
|
382
|
+
{
|
|
383
|
+
fclose(ftestexist);
|
|
384
|
+
do
|
|
385
|
+
{
|
|
386
|
+
char answer[128];
|
|
387
|
+
int ret;
|
|
388
|
+
|
|
389
|
+
printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
|
|
390
|
+
ret = scanf("%1s",answer);
|
|
391
|
+
if (ret != 1)
|
|
392
|
+
{
|
|
393
|
+
exit(EXIT_FAILURE);
|
|
394
|
+
}
|
|
395
|
+
rep = answer[0] ;
|
|
396
|
+
if ((rep>='a') && (rep<='z'))
|
|
397
|
+
rep -= 0x20;
|
|
398
|
+
}
|
|
399
|
+
while ((rep!='Y') && (rep!='N') && (rep!='A'));
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (rep == 'N')
|
|
403
|
+
skip = 1;
|
|
404
|
+
|
|
405
|
+
if (rep == 'A')
|
|
406
|
+
*popt_overwrite=1;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
if ((skip==0) && (err==UNZ_OK))
|
|
410
|
+
{
|
|
411
|
+
fout=FOPEN_FUNC(write_filename,"wb");
|
|
412
|
+
/* some zipfile don't contain directory alone before file */
|
|
413
|
+
if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
|
|
414
|
+
(filename_withoutpath!=(char*)filename_inzip))
|
|
415
|
+
{
|
|
416
|
+
char c=*(filename_withoutpath-1);
|
|
417
|
+
*(filename_withoutpath-1)='\0';
|
|
418
|
+
makedir(write_filename);
|
|
419
|
+
*(filename_withoutpath-1)=c;
|
|
420
|
+
fout=FOPEN_FUNC(write_filename,"wb");
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (fout==NULL)
|
|
424
|
+
{
|
|
425
|
+
printf("error opening %s\n",write_filename);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
if (fout!=NULL)
|
|
430
|
+
{
|
|
431
|
+
printf(" extracting: %s\n",write_filename);
|
|
432
|
+
|
|
433
|
+
do
|
|
434
|
+
{
|
|
435
|
+
err = unzReadCurrentFile(uf,buf,size_buf);
|
|
436
|
+
if (err<0)
|
|
437
|
+
{
|
|
438
|
+
printf("error %d with zipfile in unzReadCurrentFile\n",err);
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
if (err>0)
|
|
442
|
+
if (fwrite(buf,err,1,fout)!=1)
|
|
443
|
+
{
|
|
444
|
+
printf("error in writing extracted file\n");
|
|
445
|
+
err=UNZ_ERRNO;
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
while (err>0);
|
|
450
|
+
if (fout)
|
|
451
|
+
fclose(fout);
|
|
452
|
+
|
|
453
|
+
if (err==0)
|
|
454
|
+
change_file_date(write_filename,file_info.dosDate,
|
|
455
|
+
file_info.tmu_date);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
if (err==UNZ_OK)
|
|
459
|
+
{
|
|
460
|
+
err = unzCloseCurrentFile (uf);
|
|
461
|
+
if (err!=UNZ_OK)
|
|
462
|
+
{
|
|
463
|
+
printf("error %d with zipfile in unzCloseCurrentFile\n",err);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
else
|
|
467
|
+
unzCloseCurrentFile(uf); /* don't lose the error */
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
free(buf);
|
|
471
|
+
return err;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
|
|
476
|
+
unzFile uf;
|
|
477
|
+
int opt_extract_without_path;
|
|
478
|
+
int opt_overwrite;
|
|
479
|
+
const char* password;
|
|
480
|
+
{
|
|
481
|
+
uLong i;
|
|
482
|
+
unz_global_info64 gi;
|
|
483
|
+
int err;
|
|
484
|
+
FILE* fout=NULL;
|
|
485
|
+
|
|
486
|
+
err = unzGetGlobalInfo64(uf,&gi);
|
|
487
|
+
if (err!=UNZ_OK)
|
|
488
|
+
printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
|
489
|
+
|
|
490
|
+
for (i=0;i<gi.number_entry;i++)
|
|
491
|
+
{
|
|
492
|
+
if (do_extract_currentfile(uf,&opt_extract_without_path,
|
|
493
|
+
&opt_overwrite,
|
|
494
|
+
password) != UNZ_OK)
|
|
495
|
+
break;
|
|
496
|
+
|
|
497
|
+
if ((i+1)<gi.number_entry)
|
|
498
|
+
{
|
|
499
|
+
err = unzGoToNextFile(uf);
|
|
500
|
+
if (err!=UNZ_OK)
|
|
501
|
+
{
|
|
502
|
+
printf("error %d with zipfile in unzGoToNextFile\n",err);
|
|
503
|
+
break;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
return 0;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)
|
|
512
|
+
unzFile uf;
|
|
513
|
+
const char* filename;
|
|
514
|
+
int opt_extract_without_path;
|
|
515
|
+
int opt_overwrite;
|
|
516
|
+
const char* password;
|
|
517
|
+
{
|
|
518
|
+
int err = UNZ_OK;
|
|
519
|
+
if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
|
|
520
|
+
{
|
|
521
|
+
printf("file %s not found in the zipfile\n",filename);
|
|
522
|
+
return 2;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
if (do_extract_currentfile(uf,&opt_extract_without_path,
|
|
526
|
+
&opt_overwrite,
|
|
527
|
+
password) == UNZ_OK)
|
|
528
|
+
return 0;
|
|
529
|
+
else
|
|
530
|
+
return 1;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
int main(argc,argv)
|
|
535
|
+
int argc;
|
|
536
|
+
char *argv[];
|
|
537
|
+
{
|
|
538
|
+
const char *zipfilename=NULL;
|
|
539
|
+
const char *filename_to_extract=NULL;
|
|
540
|
+
const char *password=NULL;
|
|
541
|
+
char filename_try[MAXFILENAME+16] = "";
|
|
542
|
+
int i;
|
|
543
|
+
int ret_value=0;
|
|
544
|
+
int opt_do_list=0;
|
|
545
|
+
int opt_do_extract=1;
|
|
546
|
+
int opt_do_extract_withoutpath=0;
|
|
547
|
+
int opt_overwrite=0;
|
|
548
|
+
int opt_extractdir=0;
|
|
549
|
+
const char *dirname=NULL;
|
|
550
|
+
unzFile uf=NULL;
|
|
551
|
+
|
|
552
|
+
do_banner();
|
|
553
|
+
if (argc==1)
|
|
554
|
+
{
|
|
555
|
+
do_help();
|
|
556
|
+
return 0;
|
|
557
|
+
}
|
|
558
|
+
else
|
|
559
|
+
{
|
|
560
|
+
for (i=1;i<argc;i++)
|
|
561
|
+
{
|
|
562
|
+
if ((*argv[i])=='-')
|
|
563
|
+
{
|
|
564
|
+
const char *p=argv[i]+1;
|
|
565
|
+
|
|
566
|
+
while ((*p)!='\0')
|
|
567
|
+
{
|
|
568
|
+
char c=*(p++);;
|
|
569
|
+
if ((c=='l') || (c=='L'))
|
|
570
|
+
opt_do_list = 1;
|
|
571
|
+
if ((c=='v') || (c=='V'))
|
|
572
|
+
opt_do_list = 1;
|
|
573
|
+
if ((c=='x') || (c=='X'))
|
|
574
|
+
opt_do_extract = 1;
|
|
575
|
+
if ((c=='e') || (c=='E'))
|
|
576
|
+
opt_do_extract = opt_do_extract_withoutpath = 1;
|
|
577
|
+
if ((c=='o') || (c=='O'))
|
|
578
|
+
opt_overwrite=1;
|
|
579
|
+
if ((c=='d') || (c=='D'))
|
|
580
|
+
{
|
|
581
|
+
opt_extractdir=1;
|
|
582
|
+
dirname=argv[i+1];
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
if (((c=='p') || (c=='P')) && (i+1<argc))
|
|
586
|
+
{
|
|
587
|
+
password=argv[i+1];
|
|
588
|
+
i++;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
else
|
|
593
|
+
{
|
|
594
|
+
if (zipfilename == NULL)
|
|
595
|
+
zipfilename = argv[i];
|
|
596
|
+
else if ((filename_to_extract==NULL) && (!opt_extractdir))
|
|
597
|
+
filename_to_extract = argv[i] ;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
if (zipfilename!=NULL)
|
|
603
|
+
{
|
|
604
|
+
|
|
605
|
+
# ifdef USEWIN32IOAPI
|
|
606
|
+
zlib_filefunc64_def ffunc;
|
|
607
|
+
# endif
|
|
608
|
+
|
|
609
|
+
strncpy(filename_try, zipfilename,MAXFILENAME-1);
|
|
610
|
+
/* strncpy doesnt append the trailing NULL, of the string is too long. */
|
|
611
|
+
filename_try[ MAXFILENAME ] = '\0';
|
|
612
|
+
|
|
613
|
+
# ifdef USEWIN32IOAPI
|
|
614
|
+
fill_win32_filefunc64A(&ffunc);
|
|
615
|
+
uf = unzOpen2_64(zipfilename,&ffunc);
|
|
616
|
+
# else
|
|
617
|
+
uf = unzOpen64(zipfilename);
|
|
618
|
+
# endif
|
|
619
|
+
if (uf==NULL)
|
|
620
|
+
{
|
|
621
|
+
strcat(filename_try,".zip");
|
|
622
|
+
# ifdef USEWIN32IOAPI
|
|
623
|
+
uf = unzOpen2_64(filename_try,&ffunc);
|
|
624
|
+
# else
|
|
625
|
+
uf = unzOpen64(filename_try);
|
|
626
|
+
# endif
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
if (uf==NULL)
|
|
631
|
+
{
|
|
632
|
+
printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename);
|
|
633
|
+
return 1;
|
|
634
|
+
}
|
|
635
|
+
printf("%s opened\n",filename_try);
|
|
636
|
+
|
|
637
|
+
if (opt_do_list==1)
|
|
638
|
+
ret_value = do_list(uf);
|
|
639
|
+
else if (opt_do_extract==1)
|
|
640
|
+
{
|
|
641
|
+
#ifdef _WIN32
|
|
642
|
+
if (opt_extractdir && _chdir(dirname))
|
|
643
|
+
#else
|
|
644
|
+
if (opt_extractdir && chdir(dirname))
|
|
645
|
+
#endif
|
|
646
|
+
{
|
|
647
|
+
printf("Error changing into %s, aborting\n", dirname);
|
|
648
|
+
exit(-1);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
if (filename_to_extract == NULL)
|
|
652
|
+
ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password);
|
|
653
|
+
else
|
|
654
|
+
ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
unzClose(uf);
|
|
658
|
+
|
|
659
|
+
return ret_value;
|
|
660
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
.\" Hey, EMACS: -*- nroff -*-
|
|
2
|
+
.TH miniunzip 1 "Nov 7, 2001"
|
|
3
|
+
.\" Please adjust this date whenever revising the manpage.
|
|
4
|
+
.\"
|
|
5
|
+
.\" Some roff macros, for reference:
|
|
6
|
+
.\" .nh disable hyphenation
|
|
7
|
+
.\" .hy enable hyphenation
|
|
8
|
+
.\" .ad l left justify
|
|
9
|
+
.\" .ad b justify to both left and right margins
|
|
10
|
+
.\" .nf disable filling
|
|
11
|
+
.\" .fi enable filling
|
|
12
|
+
.\" .br insert line break
|
|
13
|
+
.\" .sp <n> insert n+1 empty lines
|
|
14
|
+
.\" for manpage-specific macros, see man(7)
|
|
15
|
+
.SH NAME
|
|
16
|
+
miniunzip - uncompress and examine ZIP archives
|
|
17
|
+
.SH SYNOPSIS
|
|
18
|
+
.B miniunzip
|
|
19
|
+
.RI [ -exvlo ]
|
|
20
|
+
zipfile [ files_to_extract ] [-d tempdir]
|
|
21
|
+
.SH DESCRIPTION
|
|
22
|
+
.B minizip
|
|
23
|
+
is a simple tool which allows the extraction of compressed file
|
|
24
|
+
archives in the ZIP format used by the MS-DOS utility PKZIP. It was
|
|
25
|
+
written as a demonstration of the
|
|
26
|
+
.IR zlib (3)
|
|
27
|
+
library and therefore lack many of the features of the
|
|
28
|
+
.IR unzip (1)
|
|
29
|
+
program.
|
|
30
|
+
.SH OPTIONS
|
|
31
|
+
A number of options are supported. With the exception of
|
|
32
|
+
.BI \-d\ tempdir
|
|
33
|
+
these must be supplied before any
|
|
34
|
+
other arguments and are:
|
|
35
|
+
.TP
|
|
36
|
+
.BI \-l\ ,\ \-\-v
|
|
37
|
+
List the files in the archive without extracting them.
|
|
38
|
+
.TP
|
|
39
|
+
.B \-o
|
|
40
|
+
Overwrite files without prompting for confirmation.
|
|
41
|
+
.TP
|
|
42
|
+
.B \-x
|
|
43
|
+
Extract files (default).
|
|
44
|
+
.PP
|
|
45
|
+
The
|
|
46
|
+
.I zipfile
|
|
47
|
+
argument is the name of the archive to process. The next argument can be used
|
|
48
|
+
to specify a single file to extract from the archive.
|
|
49
|
+
|
|
50
|
+
Lastly, the following option can be specified at the end of the command-line:
|
|
51
|
+
.TP
|
|
52
|
+
.BI \-d\ tempdir
|
|
53
|
+
Extract the archive in the directory
|
|
54
|
+
.I tempdir
|
|
55
|
+
rather than the current directory.
|
|
56
|
+
.SH SEE ALSO
|
|
57
|
+
.BR minizip (1),
|
|
58
|
+
.BR zlib (3),
|
|
59
|
+
.BR unzip (1).
|
|
60
|
+
.SH AUTHOR
|
|
61
|
+
This program was written by Gilles Vollant. This manual page was
|
|
62
|
+
written by Mark Brown <broonie@sirena.org.uk>. The -d tempdir option
|
|
63
|
+
was added by Dirk Eddelbuettel <edd@debian.org>.
|