Code

zlib: wrap deflateBound() too
[git.git] / zlib.c
1 /*
2  * zlib wrappers to make sure we don't silently miss errors
3  * at init time.
4  */
5 #include "cache.h"
7 static const char *zerr_to_string(int status)
8 {
9         switch (status) {
10         case Z_MEM_ERROR:
11                 return "out of memory";
12         case Z_VERSION_ERROR:
13                 return "wrong version";
14         case Z_NEED_DICT:
15                 return "needs dictionary";
16         case Z_DATA_ERROR:
17                 return "data stream error";
18         case Z_STREAM_ERROR:
19                 return "stream consistency error";
20         default:
21                 return "unknown error";
22         }
23 }
25 void git_inflate_init(z_streamp strm)
26 {
27         int status = inflateInit(strm);
29         if (status == Z_OK)
30                 return;
31         die("inflateInit: %s (%s)", zerr_to_string(status),
32             strm->msg ? strm->msg : "no message");
33 }
35 void git_inflate_init_gzip_only(z_streamp strm)
36 {
37         /*
38          * Use default 15 bits, +16 is to accept only gzip and to
39          * yield Z_DATA_ERROR when fed zlib format.
40          */
41         const int windowBits = 15 + 16;
42         int status = inflateInit2(strm, windowBits);
44         if (status == Z_OK)
45                 return;
46         die("inflateInit2: %s (%s)", zerr_to_string(status),
47             strm->msg ? strm->msg : "no message");
48 }
50 void git_inflate_end(z_streamp strm)
51 {
52         int status = inflateEnd(strm);
54         if (status == Z_OK)
55                 return;
56         error("inflateEnd: %s (%s)", zerr_to_string(status),
57               strm->msg ? strm->msg : "no message");
58 }
60 int git_inflate(z_streamp strm, int flush)
61 {
62         int status = inflate(strm, flush);
64         switch (status) {
65         /* Z_BUF_ERROR: normal, needs more space in the output buffer */
66         case Z_BUF_ERROR:
67         case Z_OK:
68         case Z_STREAM_END:
69                 return status;
71         case Z_MEM_ERROR:
72                 die("inflate: out of memory");
73         default:
74                 break;
75         }
76         error("inflate: %s (%s)", zerr_to_string(status),
77               strm->msg ? strm->msg : "no message");
78         return status;
79 }
81 #if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
82 #define deflateBound(c,s)  ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
83 #endif
85 unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
86 {
87         return deflateBound(strm, size);
88 }
90 void git_deflate_init(z_streamp strm, int level)
91 {
92         int status = deflateInit(strm, level);
94         if (status == Z_OK)
95                 return;
96         die("deflateInit: %s (%s)", zerr_to_string(status),
97             strm->msg ? strm->msg : "no message");
98 }
100 void git_deflate_init_gzip(z_streamp strm, int level)
102         /*
103          * Use default 15 bits, +16 is to generate gzip header/trailer
104          * instead of the zlib wrapper.
105          */
106         const int windowBits = 15 + 16;
107         int status = deflateInit2(strm, level,
108                                   Z_DEFLATED, windowBits,
109                                   8, Z_DEFAULT_STRATEGY);
110         if (status == Z_OK)
111                 return;
112         die("deflateInit2: %s (%s)", zerr_to_string(status),
113             strm->msg ? strm->msg : "no message");
116 void git_deflate_end(z_streamp strm)
118         int status = deflateEnd(strm);
120         if (status == Z_OK)
121                 return;
122         error("deflateEnd: %s (%s)", zerr_to_string(status),
123               strm->msg ? strm->msg : "no message");
126 int git_deflate_end_gently(z_streamp strm)
128         return deflateEnd(strm);
131 int git_deflate(z_streamp strm, int flush)
133         int status = deflate(strm, flush);
135         switch (status) {
136         /* Z_BUF_ERROR: normal, needs more space in the output buffer */
137         case Z_BUF_ERROR:
138         case Z_OK:
139         case Z_STREAM_END:
140                 return status;
142         case Z_MEM_ERROR:
143                 die("deflate: out of memory");
144         default:
145                 break;
146         }
147         error("deflate: %s (%s)", zerr_to_string(status),
148               strm->msg ? strm->msg : "no message");
149         return status;