Blender  V3.3
filereader_gzip.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2004-2021 Blender Foundation. All rights reserved. */
3 
8 #include <zlib.h>
9 
10 #include "BLI_blenlib.h"
11 #include "BLI_filereader.h"
12 
13 #include "MEM_guardedalloc.h"
14 
15 typedef struct {
17 
19 
20  z_stream strm;
21 
22  void *in_buf;
23  size_t in_size;
24 } GzipReader;
25 
26 static ssize_t gzip_read(FileReader *reader, void *buffer, size_t size)
27 {
28  GzipReader *gzip = (GzipReader *)reader;
29 
30  gzip->strm.avail_out = size;
31  gzip->strm.next_out = buffer;
32 
33  while (gzip->strm.avail_out > 0) {
34  if (gzip->strm.avail_in == 0) {
35  /* Ran out of buffered input data, read some more. */
36  size_t readsize = gzip->base->read(gzip->base, gzip->in_buf, gzip->in_size);
37 
38  if (readsize > 0) {
39  /* We got some data, so mark the buffer as refilled. */
40  gzip->strm.avail_in = readsize;
41  gzip->strm.next_in = gzip->in_buf;
42  }
43  else {
44  /* The underlying file is EOF, so return as much as we can. */
45  break;
46  }
47  }
48 
49  int ret = inflate(&gzip->strm, Z_NO_FLUSH);
50 
51  if (!ELEM(ret, Z_OK, Z_BUF_ERROR)) {
52  break;
53  }
54  }
55 
56  ssize_t read_len = size - gzip->strm.avail_out;
57  gzip->reader.offset += read_len;
58  return read_len;
59 }
60 
61 static void gzip_close(FileReader *reader)
62 {
63  GzipReader *gzip = (GzipReader *)reader;
64 
65  if (inflateEnd(&gzip->strm) != Z_OK) {
66  printf("close gzip stream error\n");
67  }
68  MEM_freeN((void *)gzip->in_buf);
69 
70  gzip->base->close(gzip->base);
71  MEM_freeN(gzip);
72 }
73 
75 {
76  GzipReader *gzip = MEM_callocN(sizeof(GzipReader), __func__);
77  gzip->base = base;
78 
79  if (inflateInit2(&gzip->strm, 16 + MAX_WBITS) != Z_OK) {
80  MEM_freeN(gzip);
81  return NULL;
82  }
83 
84  gzip->in_size = 256 * 2014;
85  gzip->in_buf = MEM_mallocN(gzip->in_size, "gzip in buf");
86 
87  gzip->reader.read = gzip_read;
88  gzip->reader.seek = NULL;
89  gzip->reader.close = gzip_close;
90 
91  return (FileReader *)gzip;
92 }
Wrapper for reading from various sources (e.g. raw files, compressed files, memory....
#define ELEM(...)
SSIZE_T ssize_t
Definition: BLI_winstuff.h:71
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
FileReader * BLI_filereader_new_gzip(FileReader *base)
static void gzip_close(FileReader *reader)
static ssize_t gzip_read(FileReader *reader, void *buffer, size_t size)
ccl_global float * buffer
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
return ret
FileReaderSeekFn seek
off64_t offset
FileReaderCloseFn close
FileReaderReadFn read
z_stream strm
FileReader * base
FileReader reader
size_t in_size