Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* ioapi.c -- IO base function header for compress/uncompress .zip
  2.    files using zlib + zip or unzip API
  3.  
  4.    Version 1.01e, February 12th, 2005
  5.  
  6.    Copyright (C) 1998-2005 Gilles Vollant
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #include "zlib.h"
  14. #include "ioapi.h"
  15.  
  16.  
  17.  
  18. /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
  19.  
  20. #ifndef SEEK_CUR
  21. #define SEEK_CUR    1
  22. #endif
  23.  
  24. #ifndef SEEK_END
  25. #define SEEK_END    2
  26. #endif
  27.  
  28. #ifndef SEEK_SET
  29. #define SEEK_SET    0
  30. #endif
  31.  
  32. voidpf ZCALLBACK fopen_file_func OF((
  33.    voidpf opaque,
  34.    const char* filename,
  35.    int mode));
  36.  
  37. uLong ZCALLBACK fread_file_func OF((
  38.    voidpf opaque,
  39.    voidpf stream,
  40.    void* buf,
  41.    uLong size));
  42.  
  43. uLong ZCALLBACK fwrite_file_func OF((
  44.    voidpf opaque,
  45.    voidpf stream,
  46.    const void* buf,
  47.    uLong size));
  48.  
  49. long ZCALLBACK ftell_file_func OF((
  50.    voidpf opaque,
  51.    voidpf stream));
  52.  
  53. long ZCALLBACK fseek_file_func OF((
  54.    voidpf opaque,
  55.    voidpf stream,
  56.    uLong offset,
  57.    int origin));
  58.  
  59. int ZCALLBACK fclose_file_func OF((
  60.    voidpf opaque,
  61.    voidpf stream));
  62.  
  63. int ZCALLBACK ferror_file_func OF((
  64.    voidpf opaque,
  65.    voidpf stream));
  66.  
  67.  
  68. voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
  69.    voidpf opaque;
  70.    const char* filename;
  71.    int mode;
  72. {
  73.     FILE* file = NULL;
  74.     const char* mode_fopen = NULL;
  75.     if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
  76.         mode_fopen = "rb";
  77.     else
  78.     if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
  79.         mode_fopen = "r+b";
  80.     else
  81.     if (mode & ZLIB_FILEFUNC_MODE_CREATE)
  82.         mode_fopen = "wb";
  83.  
  84.     if ((filename!=NULL) && (mode_fopen != NULL))
  85.         file = fopen(filename, mode_fopen);
  86.     return file;
  87. }
  88.  
  89.  
  90. uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
  91.    voidpf opaque;
  92.    voidpf stream;
  93.    void* buf;
  94.    uLong size;
  95. {
  96.     uLong ret;
  97.     ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
  98.     return ret;
  99. }
  100.  
  101.  
  102. uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
  103.    voidpf opaque;
  104.    voidpf stream;
  105.    const void* buf;
  106.    uLong size;
  107. {
  108.     uLong ret;
  109.     ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
  110.     return ret;
  111. }
  112.  
  113. long ZCALLBACK ftell_file_func (opaque, stream)
  114.    voidpf opaque;
  115.    voidpf stream;
  116. {
  117.     long ret;
  118.     ret = ftell((FILE *)stream);
  119.     return ret;
  120. }
  121.  
  122. long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
  123.    voidpf opaque;
  124.    voidpf stream;
  125.    uLong offset;
  126.    int origin;
  127. {
  128.     int fseek_origin=0;
  129.     long ret;
  130.     switch (origin)
  131.     {
  132.     case ZLIB_FILEFUNC_SEEK_CUR :
  133.         fseek_origin = SEEK_CUR;
  134.         break;
  135.     case ZLIB_FILEFUNC_SEEK_END :
  136.         fseek_origin = SEEK_END;
  137.         break;
  138.     case ZLIB_FILEFUNC_SEEK_SET :
  139.         fseek_origin = SEEK_SET;
  140.         break;
  141.     default: return -1;
  142.     }
  143.     ret = 0;
  144.     fseek((FILE *)stream, offset, fseek_origin);
  145.     return ret;
  146. }
  147.  
  148. int ZCALLBACK fclose_file_func (opaque, stream)
  149.    voidpf opaque;
  150.    voidpf stream;
  151. {
  152.     int ret;
  153.     ret = fclose((FILE *)stream);
  154.     return ret;
  155. }
  156.  
  157. int ZCALLBACK ferror_file_func (opaque, stream)
  158.    voidpf opaque;
  159.    voidpf stream;
  160. {
  161.     int ret;
  162.     ret = ferror((FILE *)stream);
  163.     return ret;
  164. }
  165.  
  166. void fill_fopen_filefunc (pzlib_filefunc_def)
  167.   zlib_filefunc_def* pzlib_filefunc_def;
  168. {
  169.     pzlib_filefunc_def->zopen_file = fopen_file_func;
  170.     pzlib_filefunc_def->zread_file = fread_file_func;
  171.     pzlib_filefunc_def->zwrite_file = fwrite_file_func;
  172.     pzlib_filefunc_def->ztell_file = ftell_file_func;
  173.     pzlib_filefunc_def->zseek_file = fseek_file_func;
  174.     pzlib_filefunc_def->zclose_file = fclose_file_func;
  175.     pzlib_filefunc_def->zerror_file = ferror_file_func;
  176.     pzlib_filefunc_def->opaque = NULL;
  177. }
  178.