home *** CD-ROM | disk | FTP | other *** search
/ Freelog 11 / Freelog011.iso / Bas / Compression / ZLib / contrib / minizip / minizip.c < prev    next >
C/C++ Source or Header  |  1998-03-19  |  8KB  |  303 lines

  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
  25. uLong 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
  49. uLong 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
  85. uLong 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.  
  98. int 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.  
  111. void 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.  
  117. void do_help()
  118. {    
  119.     printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ;
  120. }
  121.  
  122. int 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. }
  303.