8c1d114dcf
This change fixes problems with zip files created with newer zip utilities (a known issue is the iLike theme). QuaZip also allows better feedback during operations without changing the imported code. Additionally Rockbox Utility and the Theme Editor are now both using QuaZip; currently Rockbox Utility uses a copy of the sources, merging them later is planned. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29645 a1c6a512-1295-4272-9138-f99709370657
184 lines
4 KiB
C
184 lines
4 KiB
C
/* ioapi.c -- IO base function header for compress/uncompress .zip
|
|
files using zlib + zip or unzip API
|
|
|
|
Version 1.01e, February 12th, 2005
|
|
|
|
Copyright (C) 1998-2005 Gilles Vollant
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "zlib.h"
|
|
#include "ioapi.h"
|
|
|
|
|
|
|
|
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
|
|
|
#ifndef SEEK_CUR
|
|
#define SEEK_CUR 1
|
|
#endif
|
|
|
|
#ifndef SEEK_END
|
|
#define SEEK_END 2
|
|
#endif
|
|
|
|
#ifndef SEEK_SET
|
|
#define SEEK_SET 0
|
|
#endif
|
|
|
|
voidpf ZCALLBACK fopen_file_func OF((
|
|
voidpf opaque,
|
|
const char* filename,
|
|
int mode));
|
|
|
|
uLong ZCALLBACK fread_file_func OF((
|
|
voidpf opaque,
|
|
voidpf stream,
|
|
void* buf,
|
|
uLong size));
|
|
|
|
uLong ZCALLBACK fwrite_file_func OF((
|
|
voidpf opaque,
|
|
voidpf stream,
|
|
const void* buf,
|
|
uLong size));
|
|
|
|
long ZCALLBACK ftell_file_func OF((
|
|
voidpf opaque,
|
|
voidpf stream));
|
|
|
|
long ZCALLBACK fseek_file_func OF((
|
|
voidpf opaque,
|
|
voidpf stream,
|
|
uLong offset,
|
|
int origin));
|
|
|
|
int ZCALLBACK fclose_file_func OF((
|
|
voidpf opaque,
|
|
voidpf stream));
|
|
|
|
int ZCALLBACK ferror_file_func OF((
|
|
voidpf opaque,
|
|
voidpf stream));
|
|
|
|
|
|
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
|
|
voidpf opaque;
|
|
const char* filename;
|
|
int mode;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
FILE* file = NULL;
|
|
const char* mode_fopen = NULL;
|
|
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
|
mode_fopen = "rb";
|
|
else
|
|
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
|
mode_fopen = "r+b";
|
|
else
|
|
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
|
mode_fopen = "wb";
|
|
|
|
if ((filename!=NULL) && (mode_fopen != NULL))
|
|
file = fopen(filename, mode_fopen);
|
|
return file;
|
|
}
|
|
|
|
|
|
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
|
|
voidpf opaque;
|
|
voidpf stream;
|
|
void* buf;
|
|
uLong size;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
uLong ret;
|
|
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
|
return ret;
|
|
}
|
|
|
|
|
|
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
|
|
voidpf opaque;
|
|
voidpf stream;
|
|
const void* buf;
|
|
uLong size;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
uLong ret;
|
|
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
|
return ret;
|
|
}
|
|
|
|
long ZCALLBACK ftell_file_func (opaque, stream)
|
|
voidpf opaque;
|
|
voidpf stream;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
long ret;
|
|
ret = ftell((FILE *)stream);
|
|
return ret;
|
|
}
|
|
|
|
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
|
|
voidpf opaque;
|
|
voidpf stream;
|
|
uLong offset;
|
|
int origin;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
int fseek_origin=0;
|
|
long ret;
|
|
switch (origin)
|
|
{
|
|
case ZLIB_FILEFUNC_SEEK_CUR :
|
|
fseek_origin = SEEK_CUR;
|
|
break;
|
|
case ZLIB_FILEFUNC_SEEK_END :
|
|
fseek_origin = SEEK_END;
|
|
break;
|
|
case ZLIB_FILEFUNC_SEEK_SET :
|
|
fseek_origin = SEEK_SET;
|
|
break;
|
|
default: return -1;
|
|
}
|
|
ret = 0;
|
|
fseek((FILE *)stream, offset, fseek_origin);
|
|
return ret;
|
|
}
|
|
|
|
int ZCALLBACK fclose_file_func (opaque, stream)
|
|
voidpf opaque;
|
|
voidpf stream;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
int ret;
|
|
ret = fclose((FILE *)stream);
|
|
return ret;
|
|
}
|
|
|
|
int ZCALLBACK ferror_file_func (opaque, stream)
|
|
voidpf opaque;
|
|
voidpf stream;
|
|
{
|
|
(void) opaque; /* avoid "unused parameter" warning */
|
|
int ret;
|
|
ret = ferror((FILE *)stream);
|
|
return ret;
|
|
}
|
|
|
|
void fill_fopen_filefunc (pzlib_filefunc_def)
|
|
zlib_filefunc_def* pzlib_filefunc_def;
|
|
{
|
|
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
|
pzlib_filefunc_def->zread_file = fread_file_func;
|
|
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
|
pzlib_filefunc_def->ztell_file = ftell_file_func;
|
|
pzlib_filefunc_def->zseek_file = fseek_file_func;
|
|
pzlib_filefunc_def->zclose_file = fclose_file_func;
|
|
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
|
pzlib_filefunc_def->opaque = NULL;
|
|
}
|