ioapi.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

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