1
0
mirror of https://github.com/deadw00d/AROS.git synced 2025-12-06 13:11:35 +00:00
Files
AROS-v0/workbench/devs/diskimage/bz2_library/init.c

481 lines
12 KiB
C

/* Copyright 2007-2012 Fredrik Wikstrom. All rights reserved.
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
**
** 1. Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
**
** 2. Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in the
** documentation and/or other materials provided with the distribution.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
*/
#include <exec/exec.h>
#include <dos/dos.h>
#include <proto/exec.h>
#include <bzlib.h>
#include "support.h"
#include <SDI_compiler.h>
#include "bz2.library_rev.h"
#define LIBNAME "bz2.library"
const char USED verstag[] = VERSTAG;
#ifndef __AROS__
#define IPTR ULONG
#endif
struct ExecBase *SysBase;
struct BZ2Base {
struct Library libNode;
UWORD pad;
BPTR seglist;
};
int malloc_init(void);
void malloc_exit(void);
#ifdef __AROS__
static AROS_UFP3(struct BZ2Base *, LibInit,
AROS_UFPA(struct BZ2Base *, libBase, D0),
AROS_UFPA(BPTR, seglist, A0),
AROS_UFPA(struct ExecBase *, exec_base, A6)
);
static AROS_LD1(struct BZ2Base *, LibOpen,
AROS_LPA(ULONG, version, D0),
struct BZ2Base *, libBase, 1, BZlib
);
static AROS_LD0(BPTR, LibClose,
struct BZ2Base *, libBase, 2, BZlib
);
static AROS_LD0(BPTR, LibExpunge,
struct BZ2Base *, libBase, 3, BZlib
);
static AROS_LD0(APTR, LibReserved,
struct BZ2Base *, libBase, 4, BZlib
);
static AROS_LD0(const char *, BZlibVersion,
struct BZ2Base *, libBase, 5, BZlib
);
static AROS_LD4(LONG, CompressInit,
AROS_LPA(bz_stream *, strm, A0),
AROS_LPA(LONG, blockSize100k, D0),
AROS_LPA(LONG, verbosity, D1),
AROS_LPA(LONG, workFactor, D2),
struct BZ2Base *, libBase, 6, BZlib
);
static AROS_LD2(LONG, Compress,
AROS_LPA(bz_stream *, strm, A0),
AROS_LPA(LONG, action, D0),
struct BZ2Base *, libBase, 7, BZlib
);
static AROS_LD1(LONG, CompressEnd,
AROS_LPA(bz_stream *, strm, A0),
struct BZ2Base *, libBase, 8, BZlib
);
static AROS_LD3(LONG, DecompressInit,
AROS_LPA(bz_stream *, strm, A0),
AROS_LPA(LONG, verbosity, D0),
AROS_LPA(LONG, small, D1),
struct BZ2Base *, libBase, 9, BZlib
);
static AROS_LD1(LONG, Decompress,
AROS_LPA(bz_stream *, strm, A0),
struct BZ2Base *, libBase, 10, BZlib
);
static AROS_LD1(LONG, DecompressEnd,
AROS_LPA(bz_stream *, strm, A0),
struct BZ2Base *, libBase, 11, BZlib
);
static AROS_LD7(LONG, BuffToBuffCompress,
AROS_LPA(APTR, dest, A0),
AROS_LPA(ULONG *, destLen, A1),
AROS_LPA(APTR, source, A2),
AROS_LPA(ULONG, sourceLen, D0),
AROS_LPA(LONG, blockSize100k, D1),
AROS_LPA(LONG, verbosity, D2),
AROS_LPA(LONG, workFactor, D3),
struct BZ2Base *, libBase, 12, BZlib
);
static AROS_LD6(LONG, BuffToBuffDecompress,
AROS_LPA(APTR, dest, A0),
AROS_LPA(ULONG *, destLen, A1),
AROS_LPA(APTR, source, A2),
AROS_LPA(ULONG, sourceLen, D0),
AROS_LPA(LONG, small, D1),
AROS_LPA(LONG, verbosity, D2),
struct BZ2Base *, libBase, 13, BZlib
);
#else
static struct BZ2Base *LibInit (REG(d0, struct BZ2Base *libBase), REG(a0, BPTR seglist),
REG(a6, struct ExecBase *exec_base));
static struct BZ2Base *BZlib_LibOpen (REG(a6, struct BZ2Base *libBase), REG(d0, ULONG version));
static BPTR BZlib_LibClose (REG(a6, struct BZ2Base *libBase));
static BPTR BZlib_LibExpunge (REG(a6, struct BZ2Base *libBase));
static APTR BZlib_LibReserved (REG(a6, struct BZ2Base *libBase));
static const char *BZlib_BZlibVersion(void);
static LONG BZlib_CompressInit(REG(a0, bz_stream *strm), REG(d0, LONG blockSize100k),
REG(d1, LONG verbosity), REG(d2, LONG workFactor));
static LONG BZlib_Compress(REG(a0, bz_stream *strm), REG(d0, LONG action));
static LONG BZlib_CompressEnd(REG(a0, bz_stream *strm));
static LONG BZlib_DecompressInit(REG(a0, bz_stream *strm), REG(d0, LONG verbosity),
REG(d1, LONG small));
static LONG BZlib_Decompress(REG(a0, bz_stream *strm));
static LONG BZlib_DecompressEnd(REG(a0, bz_stream *strm));
static LONG BZlib_BuffToBuffCompress(REG(a0, APTR dest), REG(a1, ULONG *destLen),
REG(a2, APTR source), REG(d0, ULONG sourceLen), REG(d1, LONG blockSize100k),
REG(d2, LONG verbosity), REG(d3, LONG workFactor));
static LONG BZlib_BuffToBuffDecompress(REG(a0, APTR dest), REG(a1, ULONG *destLen),
REG(a2, APTR source), REG(d0, ULONG sourceLen), REG(d1, LONG small),
REG(d2, LONG verbosity));
#endif
#ifdef __AROS__
#define LIB_ENTRY(a,b) AROS_SLIB_ENTRY(a, BZlib, b)
#else
#define LIB_ENTRY(a,b) BZlib_##a
#endif
const CONST_APTR LibVectors[] = {
(APTR)LIB_ENTRY(LibOpen, 1),
(APTR)LIB_ENTRY(LibClose, 2),
(APTR)LIB_ENTRY(LibExpunge, 3),
(APTR)LIB_ENTRY(LibReserved, 4),
(APTR)LIB_ENTRY(BZlibVersion, 5),
(APTR)LIB_ENTRY(CompressInit, 6),
(APTR)LIB_ENTRY(Compress, 7),
(APTR)LIB_ENTRY(CompressEnd, 8),
(APTR)LIB_ENTRY(DecompressInit, 9),
(APTR)LIB_ENTRY(Decompress, 10),
(APTR)LIB_ENTRY(DecompressEnd, 11),
(APTR)LIB_ENTRY(BuffToBuffCompress, 12),
(APTR)LIB_ENTRY(BuffToBuffDecompress, 13),
(APTR)-1
};
const IPTR LibInitTab[] = {
sizeof(struct BZ2Base),
(IPTR)LibVectors,
(IPTR)NULL,
(IPTR)LibInit
};
CONST struct Resident USED lib_res = {
RTC_MATCHWORD,
(struct Resident *)&lib_res,
(APTR)(&lib_res + 1),
RTF_AUTOINIT,
VERSION,
NT_LIBRARY,
0,
(STRPTR)LIBNAME,
(STRPTR)VSTRING,
(APTR)&LibInitTab
};
#ifdef __AROS__
static AROS_UFH3(struct BZ2Base *, LibInit,
AROS_UFHA(struct BZ2Base *, libBase, D0),
AROS_UFHA(BPTR, seglist, A0),
AROS_UFHA(struct ExecBase *, exec_base, A6)
)
{
AROS_USERFUNC_INIT
#else
static struct BZ2Base *LibInit (REG(d0, struct BZ2Base *libBase), REG(a0, BPTR seglist),
REG(a6, struct ExecBase *exec_base))
{
#endif
libBase->libNode.lib_Node.ln_Type = NT_LIBRARY;
libBase->libNode.lib_Node.ln_Pri = 0;
libBase->libNode.lib_Node.ln_Name = LIBNAME;
libBase->libNode.lib_Flags = LIBF_SUMUSED|LIBF_CHANGED;
libBase->libNode.lib_Version = VERSION;
libBase->libNode.lib_Revision = REVISION;
libBase->libNode.lib_IdString = VSTRING;
SysBase = exec_base;
libBase->seglist = seglist;
if (malloc_init()) {
return libBase;
}
DeleteLibrary((struct Library *)libBase);
return NULL;
#ifdef __AROS__
AROS_USERFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH1(struct BZ2Base *, LibOpen,
AROS_LHA(ULONG, version, D0),
struct BZ2Base *, libBase, 1, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static struct BZ2Base *BZlib_LibOpen (REG(a6, struct BZ2Base *libBase), REG(d0, ULONG version)) {
#endif
libBase->libNode.lib_OpenCnt++;
libBase->libNode.lib_Flags &= ~LIBF_DELEXP;
return libBase;
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH0(BPTR, LibClose,
struct BZ2Base *, libBase, 2, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static BPTR BZlib_LibClose (REG(a6, struct BZ2Base *libBase)) {
#endif
libBase->libNode.lib_OpenCnt--;
return 0;
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH0(BPTR, LibExpunge,
struct BZ2Base *, libBase, 3, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static BPTR BZlib_LibExpunge (REG(a6, struct BZ2Base *libBase)) {
#endif
BPTR result = 0;
if (libBase->libNode.lib_OpenCnt > 0) {
libBase->libNode.lib_Flags |= LIBF_DELEXP;
return 0;
}
Remove(&libBase->libNode.lib_Node);
result = libBase->seglist;
malloc_exit();
DeleteLibrary((struct Library *)libBase);
return result;
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH0(APTR, LibReserved,
struct BZ2Base *, libBase, 4, BZlib
)
{
AROS_LIBFUNC_INIT
return NULL;
AROS_LIBFUNC_EXIT
}
#else
static APTR BZlib_LibReserved (REG(a6, struct BZ2Base *libBase)) {
return NULL;
}
#endif
#ifdef __AROS__
static AROS_LH0(const char *, BZlibVersion,
struct BZ2Base *, libBase, 5, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static const char *BZlib_BZlibVersion(void) {
#endif
return BZ2_bzlibVersion();
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH4(LONG, CompressInit,
AROS_LHA(bz_stream *, strm, A0),
AROS_LHA(LONG, blockSize100k, D0),
AROS_LHA(LONG, verbosity, D1),
AROS_LHA(LONG, workFactor, D2),
struct BZ2Base *, libBase, 6, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_CompressInit(REG(a0, bz_stream *strm), REG(d0, LONG blockSize100k),
REG(d1, LONG verbosity), REG(d2, LONG workFactor))
{
#endif
return BZ2_bzCompressInit(strm, blockSize100k, verbosity, workFactor);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH2(LONG, Compress,
AROS_LHA(bz_stream *, strm, A0),
AROS_LHA(LONG, action, D0),
struct BZ2Base *, libBase, 7, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_Compress(REG(a0, bz_stream *strm), REG(d0, LONG action)) {
#endif
return BZ2_bzCompress(strm, action);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH1(LONG, CompressEnd,
AROS_LHA(bz_stream *, strm, A0),
struct BZ2Base *, libBase, 8, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_CompressEnd(REG(a0, bz_stream *strm)) {
#endif
return BZ2_bzCompressEnd(strm);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH3(LONG, DecompressInit,
AROS_LHA(bz_stream *, strm, A0),
AROS_LHA(LONG, verbosity, D0),
AROS_LHA(LONG, small, D1),
struct BZ2Base *, libBase, 9, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_DecompressInit(REG(a0, bz_stream *strm), REG(d0, LONG verbosity),
REG(d1, LONG small))
{
#endif
return BZ2_bzDecompressInit(strm, verbosity, small);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH1(LONG, Decompress,
AROS_LHA(bz_stream *, strm, A0),
struct BZ2Base *, libBase, 10, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_Decompress(REG(a0, bz_stream *strm)) {
#endif
return BZ2_bzDecompress(strm);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH1(LONG, DecompressEnd,
AROS_LHA(bz_stream *, strm, A0),
struct BZ2Base *, libBase, 11, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_DecompressEnd(REG(a0, bz_stream *strm)) {
#endif
return BZ2_bzDecompressEnd(strm);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH7(LONG, BuffToBuffCompress,
AROS_LHA(APTR, dest, A0),
AROS_LHA(ULONG *, destLen, A1),
AROS_LHA(APTR, source, A2),
AROS_LHA(ULONG, sourceLen, D0),
AROS_LHA(LONG, blockSize100k, D1),
AROS_LHA(LONG, verbosity, D2),
AROS_LHA(LONG, workFactor, D3),
struct BZ2Base *, libBase, 12, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_BuffToBuffCompress(REG(a0, APTR dest), REG(a1, ULONG *destLen),
REG(a2, APTR source), REG(d0, ULONG sourceLen), REG(d1, LONG blockSize100k),
REG(d2, LONG verbosity), REG(d3, LONG workFactor))
{
#endif
return BZ2_bzBuffToBuffCompress(dest, (unsigned int *)destLen, source, sourceLen,
blockSize100k, verbosity, workFactor);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
#ifdef __AROS__
static AROS_LH6(LONG, BuffToBuffDecompress,
AROS_LHA(APTR, dest, A0),
AROS_LHA(ULONG *, destLen, A1),
AROS_LHA(APTR, source, A2),
AROS_LHA(ULONG, sourceLen, D0),
AROS_LHA(LONG, small, D1),
AROS_LHA(LONG, verbosity, D2),
struct BZ2Base *, libBase, 13, BZlib
)
{
AROS_LIBFUNC_INIT
#else
static LONG BZlib_BuffToBuffDecompress(REG(a0, APTR dest), REG(a1, ULONG *destLen),
REG(a2, APTR source), REG(d0, ULONG sourceLen), REG(d1, LONG small),
REG(d2, LONG verbosity))
{
#endif
return BZ2_bzBuffToBuffDecompress(dest, (unsigned int *)destLen, source, sourceLen,
small, verbosity);
#ifdef __AROS__
AROS_LIBFUNC_EXIT
#endif
}
void bz_internal_error (int errcode) {
Alert(errcode);
}