# DO NOT DELETE THIS LINE -- make depend depends on it.
-adler32.o: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
+adler32.o: $(SRCDIR)/functable.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
functable.o: $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/gzguts.h
compress.o example.o minigzip.o uncompr.o: $(SRCDIR)/zlib.h zconf.h
deflate_slow.o: $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/match.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
infback.o: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/inffixed.h
inffast.o: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/memcopy.h
-inflate.o: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/inffixed.h $(SRCDIR)/memcopy.h
+inflate.o: $(SRCDIR)/functable.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/inffixed.h $(SRCDIR)/memcopy.h
inftrees.o: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h
trees.o: $(SRCDIR)/deflate.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/trees.h
zutil.o: $(SRCDIR)/zutil.h $(SRCDIR)/gzguts.h $(SRCDIR)/zlib.h zconf.h
arch/x86/fill_window_sse.o: $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
arch/x86/x86.o: $(SRCDIR)/arch/x86/x86.h
-adler32.lo: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
+adler32.lo: $(SRCDIR)/functable.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
functable.lo: $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/gzguts.h
compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)/zlib.h zconf.h
deflate_slow.lo: $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/match.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h
infback.lo: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/inffixed.h
inffast.lo: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/memcopy.h
-inflate.lo: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/inffixed.h $(SRCDIR)/memcopy.h
+inflate.lo: $(SRCDIR)/functable.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/inffixed.h $(SRCDIR)/memcopy.h
inftrees.lo: $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/inftrees.h
trees.lo: $(SRCDIR)/deflate.h $(SRCDIR)/zutil.h $(SRCDIR)/zlib.h zconf.h $(SRCDIR)/trees.h
zutil.lo: $(SRCDIR)/zutil.h $(SRCDIR)/gzguts.h $(SRCDIR)/zlib.h zconf.h
/* @(#) $Id$ */
#include "zutil.h"
+#include "functable.h"
uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len);
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
-extern uint32_t adler32_neon(uint32_t adler, const unsigned char *buf, size_t len);
-#endif
-
static uint32_t adler32_combine_(uint32_t adler1, uint32_t adler2, z_off64_t len2);
#define BASE 65521U /* largest prime smaller than 65536 */
}
uint32_t ZEXPORT adler32_z(uint32_t adler, const unsigned char *buf, size_t len) {
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
- return adler32_neon(adler, buf, len);
-#else
- return adler32_c(adler, buf, len);
-#endif
+ if (functable.adler32 == NULL)
+ functableInit();
+ return functable.adler32(adler, buf, len);
}
/* ========================================================================= */
uint32_t ZEXPORT adler32(uint32_t adler, const unsigned char *buf, uint32_t len) {
- return adler32_z(adler, buf, len);
+ if (functable.adler32 == NULL)
+ functableInit();
+ return functable.adler32(adler, buf, len);
}
/* ========================================================================= */
/* when using zlib wrappers, compute Adler-32 for provided dictionary */
if (wrap == 1)
- strm->adler = adler32(strm->adler, dictionary, dictLength);
+ strm->adler = functable.adler32(strm->adler, dictionary, dictLength);
s->wrap = 0; /* avoid computing Adler-32 in read_buf */
/* if dictionary would fill window, just replace the history */
crc_reset(s);
else
#endif
- strm->adler = adler32(0L, NULL, 0);
+ strm->adler = functable.adler32(0L, NULL, 0);
s->last_flush = Z_NO_FLUSH;
_tr_init(s);
putShortMSB(s, (uint16_t)(strm->adler >> 16));
putShortMSB(s, (uint16_t)(strm->adler));
}
- strm->adler = adler32(0L, NULL, 0);
+ strm->adler = functable.adler32(0L, NULL, 0);
s->status = BUSY_STATE;
/* Compression must start with an empty pending buffer */
{
memcpy(buf, strm->next_in, len);
if (strm->state->wrap == 1)
- strm->adler = adler32(strm->adler, buf, len);
+ strm->adler = functable.adler32(strm->adler, buf, len);
}
strm->next_in += len;
strm->total_in += len;
# include "arch/x86/x86.h"
#endif
+
#ifdef X86_SSE4_2_CRC_HASH
extern Pos insert_string_sse(deflate_state *const s, const Pos str, unsigned int count);
#elif defined(ARM_ACLE_CRC_HASH)
extern void fill_window_arm(deflate_state *s);
#endif
+#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
+extern uint32_t adler32_neon(uint32_t adler, const unsigned char *buf, size_t len);
+#endif
+
+
/* =========================================================================
* Initialize functable
*/
+
+struct functable_s functable = {NULL,NULL,NULL};
+
+
ZLIB_INTERNAL void functableInit() {
// Initialize defaults
functable.insert_string=&insert_string_c;
functable.fill_window=&fill_window_c;
+ functable.adler32=&adler32_c;
// insert_string
#ifdef X86_SSE4_2_CRC_HASH
#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM)
functable.fill_window=&fill_window_arm;
#endif
+
+ // adler32
+ #if (defined(__ARM_NEON__) || defined(__ARM_NEON))
+ functable.adler32=&adler32_neon;
+ #endif
}
#include "deflate.h"
+uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len);
+
void functableInit();
struct functable_s {
void (* fill_window) (deflate_state *s);
Pos (* insert_string) (deflate_state *const s, const Pos str, unsigned int count);
-} functable;
+ uint32_t (* adler32) (uint32_t adler, const unsigned char *buf, size_t len);
+};
+
+extern struct functable_s functable;
+
#endif
#include "inflate.h"
#include "inffast.h"
#include "memcopy.h"
+#include "functable.h"
#ifdef MAKEFIXED
# ifndef BUILDFIXED
int ret;
struct inflate_state *state;
+ functableInit();
+
if (version == NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream)))
return Z_VERSION_ERROR;
if (strm == NULL)
/* check function to use adler32() for zlib or crc32() for gzip */
#ifdef GUNZIP
# define UPDATE(check, buf, len) \
- (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
+ (state->flags ? crc32(check, buf, len) : functable.adler32(check, buf, len))
#else
-# define UPDATE(check, buf, len) adler32(check, buf, len)
+# define UPDATE(check, buf, len) functable.adler32(check, buf, len)
#endif
/* check macros for header crc */
}
state->dmax = 1U << len;
Tracev((stderr, "inflate: zlib header ok\n"));
- strm->adler = state->check = adler32(0L, NULL, 0);
+ strm->adler = state->check = functable.adler32(0L, NULL, 0);
state->mode = hold & 0x200 ? DICTID : TYPE;
INITBITS();
break;
RESTORE();
return Z_NEED_DICT;
}
- strm->adler = state->check = adler32(0L, NULL, 0);
+ strm->adler = state->check = functable.adler32(0L, NULL, 0);
state->mode = TYPE;
case TYPE:
if (flush == Z_BLOCK || flush == Z_TREES)
/* check for correct dictionary identifier */
if (state->mode == DICT) {
- dictid = adler32(0L, NULL, 0);
- dictid = adler32(dictid, dictionary, dictLength);
+ dictid = functable.adler32(0L, NULL, 0);
+ dictid = functable.adler32(dictid, dictionary, dictLength);
if (dictid != state->check)
return Z_DATA_ERROR;
}