source: trunk/third/zlib/contrib/minizip/minizip.c @ 15211

Revision 15211, 7.4 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15210, which included commits to RCS files with non-trunk default branches.
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <time.h>
5#include <errno.h>
6#include <fcntl.h>
7
8#ifdef unix
9# include <unistd.h>
10# include <utime.h>
11# include <sys/types.h>
12# include <sys/stat.h>
13#else
14# include <direct.h>
15# include <io.h>
16#endif
17
18#include "zip.h"
19
20
21#define WRITEBUFFERSIZE (16384)
22#define MAXFILENAME (256)
23
24#ifdef WIN32
25uLong filetime(f, tmzip, dt)
26    char *f;                /* name of file to get info on */
27    tm_zip *tmzip;             /* return value: access, modific. and creation times */
28    uLong *dt;             /* dostime */
29{
30  int ret = 0;
31  {
32      FILETIME ftLocal;
33      HANDLE hFind;
34      WIN32_FIND_DATA  ff32;
35
36      hFind = FindFirstFile(f,&ff32);
37      if (hFind != INVALID_HANDLE_VALUE)
38      {
39        FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
40        FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
41        FindClose(hFind);
42        ret = 1;
43      }
44  }
45  return ret;
46}
47#else
48#ifdef unix
49uLong filetime(f, tmzip, dt)
50    char *f;                /* name of file to get info on */
51    tm_zip *tmzip;             /* return value: access, modific. and creation times */
52    uLong *dt;             /* dostime */
53{
54  int ret=0;
55  struct stat s;        /* results of stat() */
56  struct tm* filedate;
57  time_t tm_t=0;
58 
59  if (strcmp(f,"-")!=0)
60  {
61    char name[MAXFILENAME];
62    int len = strlen(f);
63    strcpy(name, f);
64    if (name[len - 1] == '/')
65      name[len - 1] = '\0';
66    /* not all systems allow stat'ing a file with / appended */
67    if (stat(name,&s)==0)
68    {
69      tm_t = s.st_mtime;
70      ret = 1;
71    }
72  }
73  filedate = localtime(&tm_t);
74
75  tmzip->tm_sec  = filedate->tm_sec;
76  tmzip->tm_min  = filedate->tm_min;
77  tmzip->tm_hour = filedate->tm_hour;
78  tmzip->tm_mday = filedate->tm_mday;
79  tmzip->tm_mon  = filedate->tm_mon ;
80  tmzip->tm_year = filedate->tm_year;
81
82  return ret;
83}
84#else
85uLong filetime(f, tmzip, dt)
86    char *f;                /* name of file to get info on */
87    tm_zip *tmzip;             /* return value: access, modific. and creation times */
88    uLong *dt;             /* dostime */
89{
90    return 0;
91}
92#endif
93#endif
94
95
96
97
98int check_exist_file(filename)
99    const char* filename;
100{
101        FILE* ftestexist;
102    int ret = 1;
103        ftestexist = fopen(filename,"rb");
104        if (ftestexist==NULL)
105        ret = 0;
106    else
107        fclose(ftestexist);
108    return ret;
109}
110
111void do_banner()
112{
113        printf("MiniZip 0.15, demo of zLib + Zip package written by Gilles Vollant\n");
114        printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n");
115}
116
117void do_help()
118{       
119        printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ;
120}
121
122int main(argc,argv)
123        int argc;
124        char *argv[];
125{
126        int i;
127        int opt_overwrite=0;
128    int opt_compress_level=Z_DEFAULT_COMPRESSION;
129    int zipfilenamearg = 0;
130        char filename_try[MAXFILENAME];
131    int zipok;
132    int err=0;
133    int size_buf=0;
134    void* buf=NULL,
135
136
137        do_banner();
138        if (argc==1)
139        {
140                do_help();
141                exit(0);
142        return 0;
143        }
144        else
145        {
146                for (i=1;i<argc;i++)
147                {
148                        if ((*argv[i])=='-')
149                        {
150                                const char *p=argv[i]+1;
151                               
152                                while ((*p)!='\0')
153                                {                       
154                                        char c=*(p++);;
155                                        if ((c=='o') || (c=='O'))
156                                                opt_overwrite = 1;
157                    if ((c>='0') && (c<='9'))
158                        opt_compress_level = c-'0';
159                                }
160                        }
161                        else
162                                if (zipfilenamearg == 0)
163                    zipfilenamearg = i ;
164                }
165        }
166
167    size_buf = WRITEBUFFERSIZE;
168    buf = (void*)malloc(size_buf);
169    if (buf==NULL)
170    {
171        printf("Error allocating memory\n");
172        return ZIP_INTERNALERROR;
173    }
174
175        if (zipfilenamearg==0)
176        zipok=0;
177    else
178        {
179        int i,len;
180        int dot_found=0;
181
182        zipok = 1 ;
183                strcpy(filename_try,argv[zipfilenamearg]);
184        len=strlen(filename_try);
185        for (i=0;i<len;i++)
186            if (filename_try[i]=='.')
187                dot_found=1;
188
189        if (dot_found==0)
190            strcat(filename_try,".zip");
191
192        if (opt_overwrite==0)
193            if (check_exist_file(filename_try)!=0)
194                        {
195                char rep;
196                                do
197                                {
198                                        char answer[128];
199                                        printf("The file %s exist. Overwrite ? [y]es, [n]o : ",filename_try);
200                                        scanf("%1s",answer);
201                                        rep = answer[0] ;
202                                        if ((rep>='a') && (rep<='z'))
203                                                rep -= 0x20;
204                                }
205                                while ((rep!='Y') && (rep!='N'));
206                if (rep=='N')
207                    zipok = 0;
208                        }
209    }
210
211    if (zipok==1)
212    {
213        zipFile zf;
214        int errclose;
215        zf = zipOpen(filename_try,0);
216        if (zf == NULL)
217        {
218            printf("error opening %s\n",filename_try);
219            err= ZIP_ERRNO;
220        }
221        else
222            printf("creating %s\n",filename_try);
223
224        for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)
225        {
226            if (((*(argv[i]))!='-') && ((*(argv[i]))!='/'))
227            {
228                FILE * fin;
229                int size_read;
230                const char* filenameinzip = argv[i];
231                zip_fileinfo zi;
232
233                zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
234                zi.tmz_date.tm_mday = zi.tmz_date.tm_min = zi.tmz_date.tm_year = 0;
235                zi.dosDate = 0;
236                zi.internal_fa = 0;
237                zi.external_fa = 0;
238                filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
239
240
241                err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
242                                 NULL,0,NULL,0,NULL /* comment*/,
243                                 (opt_compress_level != 0) ? Z_DEFLATED : 0,
244                                 opt_compress_level);
245
246                if (err != ZIP_OK)
247                    printf("error in opening %s in zipfile\n",filenameinzip);
248                else
249                {
250                    fin = fopen(filenameinzip,"rb");
251                    if (fin==NULL)
252                    {
253                        err=ZIP_ERRNO;
254                        printf("error in opening %s for reading\n",filenameinzip);
255                    }
256                }
257
258                if (err == ZIP_OK)
259                    do
260                    {
261                        err = ZIP_OK;
262                        size_read = fread(buf,1,size_buf,fin);
263                        if (size_read < size_buf)
264                            if (feof(fin)==0)
265                        {
266                            printf("error in reading %s\n",filenameinzip);
267                            err = ZIP_ERRNO;
268                        }
269
270                        if (size_read>0)
271                        {
272                            err = zipWriteInFileInZip (zf,buf,size_read);
273                            if (err<0)
274                            {
275                                printf("error in writing %s in the zipfile\n",
276                                                 filenameinzip);
277                            }
278                               
279                        }
280                    } while ((err == ZIP_OK) && (size_read>0));
281
282                fclose(fin);
283                if (err<0)
284                    err=ZIP_ERRNO;
285                else
286                {                   
287                    err = zipCloseFileInZip(zf);
288                    if (err!=ZIP_OK)
289                        printf("error in closing %s in the zipfile\n",
290                                    filenameinzip);
291                }
292            }
293        }
294        errclose = zipClose(zf,NULL);
295        if (errclose != ZIP_OK)
296            printf("error in closing %s\n",filename_try);
297   }
298
299    free(buf);
300    exit(0);
301        return 0;  /* to avoid warning */
302}
Note: See TracBrowser for help on using the repository browser.