(root)/
binutils-2.41/
zlib/
contrib/
minizip/
ioapi.c
       1  /* ioapi.h -- IO base function header for compress/uncompress .zip
       2     part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
       3  
       4           Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
       5  
       6           Modifications for Zip64 support
       7           Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
       8  
       9           For more info read MiniZip_info.txt
      10  
      11  */
      12  
      13  #if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS)))
      14          #define _CRT_SECURE_NO_WARNINGS
      15  #endif
      16  
      17  #if defined(__APPLE__) || defined(IOAPI_NO_64)
      18  // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
      19  #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
      20  #define FTELLO_FUNC(stream) ftello(stream)
      21  #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
      22  #else
      23  #define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
      24  #define FTELLO_FUNC(stream) ftello64(stream)
      25  #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
      26  #endif
      27  
      28  
      29  #include "ioapi.h"
      30  
      31  voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
      32  {
      33      if (pfilefunc->zfile_func64.zopen64_file != NULL)
      34          return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
      35      else
      36      {
      37          return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
      38      }
      39  }
      40  
      41  long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
      42  {
      43      if (pfilefunc->zfile_func64.zseek64_file != NULL)
      44          return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
      45      else
      46      {
      47          uLong offsetTruncated = (uLong)offset;
      48          if (offsetTruncated != offset)
      49              return -1;
      50          else
      51              return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
      52      }
      53  }
      54  
      55  ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
      56  {
      57      if (pfilefunc->zfile_func64.zseek64_file != NULL)
      58          return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
      59      else
      60      {
      61          uLong tell_uLong = (uLong)(*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
      62          if ((tell_uLong) == MAXU32)
      63              return (ZPOS64_T)-1;
      64          else
      65              return tell_uLong;
      66      }
      67  }
      68  
      69  void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
      70  {
      71      p_filefunc64_32->zfile_func64.zopen64_file = NULL;
      72      p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
      73      p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
      74      p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
      75      p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
      76      p_filefunc64_32->zfile_func64.ztell64_file = NULL;
      77      p_filefunc64_32->zfile_func64.zseek64_file = NULL;
      78      p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
      79      p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
      80      p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
      81      p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
      82      p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
      83  }
      84  
      85  
      86  
      87  static voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
      88  static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
      89  static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
      90  static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
      91  static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
      92  static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
      93  static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
      94  
      95  static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
      96  {
      97      (void)opaque;
      98      FILE* file = NULL;
      99      const char* mode_fopen = NULL;
     100      if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
     101          mode_fopen = "rb";
     102      else
     103      if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
     104          mode_fopen = "r+b";
     105      else
     106      if (mode & ZLIB_FILEFUNC_MODE_CREATE)
     107          mode_fopen = "wb";
     108  
     109      if ((filename!=NULL) && (mode_fopen != NULL))
     110          file = fopen(filename, mode_fopen);
     111      return file;
     112  }
     113  
     114  static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
     115  {
     116      (void)opaque;
     117      FILE* file = NULL;
     118      const char* mode_fopen = NULL;
     119      if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
     120          mode_fopen = "rb";
     121      else
     122      if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
     123          mode_fopen = "r+b";
     124      else
     125      if (mode & ZLIB_FILEFUNC_MODE_CREATE)
     126          mode_fopen = "wb";
     127  
     128      if ((filename!=NULL) && (mode_fopen != NULL))
     129          file = FOPEN_FUNC((const char*)filename, mode_fopen);
     130      return file;
     131  }
     132  
     133  
     134  static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
     135  {
     136      (void)opaque;
     137      uLong ret;
     138      ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
     139      return ret;
     140  }
     141  
     142  static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
     143  {
     144      (void)opaque;
     145      uLong ret;
     146      ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
     147      return ret;
     148  }
     149  
     150  static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
     151  {
     152      (void)opaque;
     153      long ret;
     154      ret = ftell((FILE *)stream);
     155      return ret;
     156  }
     157  
     158  
     159  static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
     160  {
     161      (void)opaque;
     162      ZPOS64_T ret;
     163      ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
     164      return ret;
     165  }
     166  
     167  static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin)
     168  {
     169      (void)opaque;
     170      int fseek_origin=0;
     171      long ret;
     172      switch (origin)
     173      {
     174      case ZLIB_FILEFUNC_SEEK_CUR :
     175          fseek_origin = SEEK_CUR;
     176          break;
     177      case ZLIB_FILEFUNC_SEEK_END :
     178          fseek_origin = SEEK_END;
     179          break;
     180      case ZLIB_FILEFUNC_SEEK_SET :
     181          fseek_origin = SEEK_SET;
     182          break;
     183      default: return -1;
     184      }
     185      ret = 0;
     186      if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0)
     187          ret = -1;
     188      return ret;
     189  }
     190  
     191  static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin)
     192  {
     193      (void)opaque;
     194      int fseek_origin=0;
     195      long ret;
     196      switch (origin)
     197      {
     198      case ZLIB_FILEFUNC_SEEK_CUR :
     199          fseek_origin = SEEK_CUR;
     200          break;
     201      case ZLIB_FILEFUNC_SEEK_END :
     202          fseek_origin = SEEK_END;
     203          break;
     204      case ZLIB_FILEFUNC_SEEK_SET :
     205          fseek_origin = SEEK_SET;
     206          break;
     207      default: return -1;
     208      }
     209      ret = 0;
     210  
     211      if(FSEEKO_FUNC((FILE *)stream, (long)offset, fseek_origin) != 0)
     212                          ret = -1;
     213  
     214      return ret;
     215  }
     216  
     217  
     218  static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
     219  {
     220      (void)opaque;
     221      int ret;
     222      ret = fclose((FILE *)stream);
     223      return ret;
     224  }
     225  
     226  static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
     227  {
     228      (void)opaque;
     229      int ret;
     230      ret = ferror((FILE *)stream);
     231      return ret;
     232  }
     233  
     234  void fill_fopen_filefunc (pzlib_filefunc_def)
     235    zlib_filefunc_def* pzlib_filefunc_def;
     236  {
     237      pzlib_filefunc_def->zopen_file = fopen_file_func;
     238      pzlib_filefunc_def->zread_file = fread_file_func;
     239      pzlib_filefunc_def->zwrite_file = fwrite_file_func;
     240      pzlib_filefunc_def->ztell_file = ftell_file_func;
     241      pzlib_filefunc_def->zseek_file = fseek_file_func;
     242      pzlib_filefunc_def->zclose_file = fclose_file_func;
     243      pzlib_filefunc_def->zerror_file = ferror_file_func;
     244      pzlib_filefunc_def->opaque = NULL;
     245  }
     246  
     247  void fill_fopen64_filefunc (zlib_filefunc64_def*  pzlib_filefunc_def)
     248  {
     249      pzlib_filefunc_def->zopen64_file = fopen64_file_func;
     250      pzlib_filefunc_def->zread_file = fread_file_func;
     251      pzlib_filefunc_def->zwrite_file = fwrite_file_func;
     252      pzlib_filefunc_def->ztell64_file = ftell64_file_func;
     253      pzlib_filefunc_def->zseek64_file = fseek64_file_func;
     254      pzlib_filefunc_def->zclose_file = fclose_file_func;
     255      pzlib_filefunc_def->zerror_file = ferror_file_func;
     256      pzlib_filefunc_def->opaque = NULL;
     257  }