&error);
if (!dctx->currlentable)
goto finished; /* error code set up by mktable */
- dctx->currdisttable = mktable(dctx->lengths + dctx->hlit,
- dctx->hdist,
+ if (dctx->hdist == 1 && dctx->lengths[dctx->hlit] == 0) {
+ /*
+ * Special case: if the code length list for the
+ * backward-distance table contains a single zero
+ * entry, it means this block will never encode a
+ * backward distance at all (i.e. it's all
+ * literals).
+ */
+ dctx->currdisttable = NULL;
+ } else {
+ dctx->currdisttable = mktable(dctx->lengths + dctx->hlit,
+ dctx->hdist,
#ifdef ANALYSIS
- "distance",
+ "distance",
#endif
- &error);
- if (!dctx->currdisttable)
- goto finished; /* error code set up by mktable */
+ &error);
+ if (!dctx->currdisttable)
+ goto finished; /* error code set up by mktable */
+ }
freetable(&dctx->lenlentable);
dctx->lenlentable = NULL;
dctx->state = INBLK;
freetable(&dctx->currlentable);
dctx->currlentable = NULL;
}
- if (dctx->currdisttable != dctx->staticdisttable) {
+ if (dctx->currdisttable &&
+ dctx->currdisttable != dctx->staticdisttable) {
freetable(&dctx->currdisttable);
dctx->currdisttable = NULL;
}
dctx->state = GOTLEN;
break;
case GOTLEN:
+ if (!dctx->currdisttable) {
+ error = DEFLATE_ERR_NODISTTABLE;
+ goto finished;
+ }
code = huflookup(&dctx->bits, &dctx->nbits, dctx->currdisttable);
debug(("recv: dist %d\n", code));
if (code == -1)
*/
if (dctx->nbits < 16)
goto finished;
- nlen = 0xFFFF & ~dctx->bits;
+ nlen = dctx->bits & 0xFFFF;
EATBITS(16);
if (dctx->uncomplen != (nlen ^ 0xFFFF)) {
error = DEFLATE_ERR_UNCOMP_HDR;
goto finished;
}
- if (dctx->uncomplen == 0)
- dctx->state = OUTSIDEBLK; /* block is empty */
- else
+ if (dctx->uncomplen == 0) {/* block is empty */
+ if (dctx->lastblock)
+ dctx->state = END;
+ else
+ dctx->state = OUTSIDEBLK;
+ } else
dctx->state = UNCOMP_DATA;
break;
case UNCOMP_DATA:
#endif
emit_char(dctx, dctx->bits & 0xFF);
EATBITS(8);
- if (--dctx->uncomplen == 0)
- dctx->state = OUTSIDEBLK; /* end of uncompressed block */
+ if (--dctx->uncomplen == 0) { /* end of uncompressed block */
+ if (dctx->lastblock)
+ dctx->state = END;
+ else
+ dctx->state = OUTSIDEBLK;
+ }
break;
case END:
/*
};
#undef A
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64)
+#define WINDOWS_IO
+#endif
+
+#if defined(WINDOWS_IO) && (defined(STANDALONE) || defined(TESTMODE))
+#include <fcntl.h>
+#include <io.h>
+#endif
+
#ifdef STANDALONE
int main(int argc, char **argv)
fprintf(stderr, "unable to open '%s'\n", filename);
return 1;
}
+
+#ifdef WINDOWS_IO
+ if(_setmode(_fileno(stdout), _O_BINARY ) == -1)
+ {
+ fprintf(stderr, "Can't set stdout to binary mode\n");
+ return 1;
+ }
+#endif
do {
ret = fread(buf, 1, sizeof(buf), fp);
chandle = deflate_compress_new(DEFLATE_TYPE_ZLIB);
dhandle = deflate_decompress_new(DEFLATE_TYPE_ZLIB);
+
+#ifdef WINDOWS_IO
+ if(_setmode(_fileno(stdout), _O_BINARY ) == -1)
+ {
+ fprintf(stderr, "Can't set stdout to binary mode\n");
+ return 1;
+ }
+#endif
do {
ret = fread(buf, 1, sizeof(buf), fp);