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