in benchmarks/JetStream2/wasm/TSF/tsf_adaptive_reader.c [128:286]
static tsf_bool_t select_mode(tsf_adpt_rdr_t *reader,
uint8_t *spillover,
uint32_t spillover_len,
tsf_bool_t free_spillover) {
uint8_t magic[4];
uint32_t tocopy=tsf_min(4,spillover_len);
void *tofree;
if (free_spillover && spillover_len>0) {
tofree=spillover;
} else {
tofree=NULL;
}
memcpy(magic,spillover,tocopy);
spillover+=tocopy;
spillover_len-=tocopy;
if (tocopy<4) {
tsf_assert(spillover_len==0);
if (!tsf_full_read_of_partial(reader->reader,reader->reader_arg,
magic+tocopy,4-tocopy)) {
if (tofree!=NULL) free(tofree);
return tsf_false;
}
}
if (!memcmp(magic,TSF_SP_MAGIC_CODE,TSF_SP_MAGIC_LEN)) {
reader->buf_size=tsf_max(reader->nozip_buf_size,
spillover_len+TSF_SP_MAGIC_LEN);
reader->buf=malloc(reader->buf_size);
if (reader->buf==NULL) {
tsf_set_errno("Could not allocate buffer");
if (tofree!=NULL) free(tofree);
return tsf_false;
}
memcpy(reader->buf,spillover,spillover_len);
memcpy(reader->buf+spillover_len,TSF_SP_MAGIC_CODE,TSF_SP_MAGIC_LEN);
reader->puti=spillover_len+TSF_SP_MAGIC_LEN;
reader->geti=0;
if (tofree!=NULL) free(tofree);
reader->mode=TSF_ZIP_NONE;
} else if (!memcmp(magic,TSF_SP_BZIP2_MAGIC_CODE,TSF_SP_MAGIC_LEN) ||
!memcmp(magic,TSF_SP_ZLIB_MAGIC_CODE,TSF_SP_MAGIC_LEN)) {
int res;
if (!memcmp(magic,TSF_SP_ZLIB_MAGIC_CODE,TSF_SP_MAGIC_LEN)) {
reader->buf_size=tsf_max(reader->attr.z.buf_size,spillover_len);
} else {
reader->buf_size=tsf_max(reader->attr.b.buf_size,spillover_len);
}
reader->buf=malloc(reader->buf_size);
if (reader->buf==NULL) {
tsf_set_errno("Could not allocate buffer");
if (tofree!=NULL) free(tofree);
return tsf_false;
}
memcpy(reader->buf,spillover,spillover_len);
if (tofree!=NULL) free(tofree);
reader->abstract.next_in=reader->buf;
reader->abstract.avail_in=spillover_len;
if (!memcmp(magic,TSF_SP_ZLIB_MAGIC_CODE,TSF_SP_MAGIC_LEN)) {
if (!reader->attr.z.allow) {
tsf_set_error(TSF_E_PARSE_ERROR,
"The stream is compressed using ZLib, but "
"the given attributes specify that "
"ZLib is not allowed");
if (tofree!=NULL) free(tofree);
free(reader->buf);
return tsf_false;
}
#ifdef HAVE_ZLIB
reader->stream=malloc(sizeof(z_stream));
if (reader->stream==NULL) {
tsf_set_errno("Could not malloc z_stream");
free(reader->buf);
return tsf_false;
}
Cz(reader)->zalloc=NULL;
Cz(reader)->zfree=NULL;
Cz(reader)->opaque=NULL;
if (reader->attr.z.advanced_init) {
res=inflateInit2(Cz(reader),
reader->attr.z.windowBits);
} else {
res=inflateInit(Cz(reader));
}
if (res!=Z_OK) {
tsf_set_zlib_error(res,Cz(reader)->msg,
"Trying to initialize inflation in ZLib");
free(Cz(reader));
free(reader->buf);
return tsf_false;
}
reader->mode=TSF_ZIP_ZLIB;
#else
tsf_set_error(TSF_E_NOT_SUPPORTED,
"TSF_ZIP_ZLIB is not supported by "
"tsf_zip_reader_create() because ZLib support "
"was not configured into the TSF library");
if (tofree!=NULL) free(tofree);
free(reader->buf);
return tsf_false;
#endif
} else {
if (!reader->attr.b.allow) {
tsf_set_error(TSF_E_PARSE_ERROR,
"The stream is compressed using libbzip2, but "
"the given attributes specify that "
"libbzip2 is not allowed");
if (tofree!=NULL) free(tofree);
free(reader->buf);
return tsf_false;
}
#ifdef HAVE_BZIP2
reader->stream=malloc(sizeof(bz_stream));
if (reader->stream==NULL) {
tsf_set_errno("Could not malloc bz_stream");
free(reader->buf);
return tsf_false;
}
Cbz(reader)->bzalloc=NULL;
Cbz(reader)->bzfree=NULL;
Cbz(reader)->opaque=NULL;
res=BZ2_bzDecompressInit(Cbz(reader),
reader->attr.b.verbosity,
reader->attr.b.small);
if (res!=BZ_OK) {
tsf_set_libbzip2_error(res,
"Trying to initialize decompression in libbzip2");
free(Cbz(reader));
free(reader->buf);
return tsf_false;
}
reader->mode=TSF_ZIP_BZIP2;
#else
tsf_set_error(TSF_E_NOT_SUPPORTED,
"TSF_ZIP_BZIP2 is not supported by "
"tsf_zip_reader_create() because libbzip2 "
"support was not configured into the TSF "
"library");
free(reader->buf);
if (tofree!=NULL) free(tofree);
return tsf_false;
#endif
}
} else {
if (tofree!=NULL) free(tofree);
tsf_set_error(TSF_E_PARSE_ERROR,
"Not a valid magic code for any TSF stream file format");
return tsf_false;
}
return tsf_true;
}