diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2024-05-09 15:38:18 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2024-05-09 15:38:18 (GMT) |
commit | 66e873c8202caf7d1e1a3c038f01eebe530e85b6 (patch) | |
tree | 2755b823621f10ca9325835720ee64a0463338e1 | |
parent | 254add09a17c17d2fa889222043363443e367a71 (diff) | |
download | tcl-66e873c8202caf7d1e1a3c038f01eebe530e85b6.zip tcl-66e873c8202caf7d1e1a3c038f01eebe530e85b6.tar.gz tcl-66e873c8202caf7d1e1a3c038f01eebe530e85b6.tar.bz2 |
Tidy up the zlib code a bit
In particular, 'cd' was used for vars of different types (ClientData, ZlibChannelData) which was quite confusing.
-rw-r--r-- | generic/tclZlib.c | 816 |
1 files changed, 430 insertions, 386 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c index 4138089..595ddf4 100644 --- a/generic/tclZlib.c +++ b/generic/tclZlib.c @@ -33,11 +33,12 @@ * format or automatic detection of format. Putting it here is slightly less * gross! */ - -#define WBITS_RAW (-MAX_WBITS) -#define WBITS_ZLIB (MAX_WBITS) -#define WBITS_GZIP (MAX_WBITS | 16) -#define WBITS_AUTODETECT (MAX_WBITS | 32) +enum WBitsFlags { + WBITS_RAW = (-MAX_WBITS), /* RAW compressed data */ + WBITS_ZLIB = (MAX_WBITS), /* Zlib-format compressed data */ + WBITS_GZIP = (MAX_WBITS | 16), /* Gzip-format compressed data */ + WBITS_AUTODETECT = (MAX_WBITS | 32) /* Auto-detect format from its header */ +}; /* * Structure used for handling gzip headers that are generated from a @@ -64,7 +65,7 @@ typedef struct { Tcl_Obj *inData, *outData; /* Input / output buffers (lists) */ Tcl_Obj *currentInput; /* Pointer to what is currently being * inflated. */ - Tcl_Size outPos; + Tcl_Size outPos; /* Index into output buffer to write to next. */ int mode; /* Either TCL_ZLIB_STREAM_DEFLATE or * TCL_ZLIB_STREAM_INFLATE. */ int format; /* Flags from the TCL_ZLIB_FORMAT_* */ @@ -82,9 +83,11 @@ typedef struct { * structure. */ } ZlibStreamHandle; -#define DICT_TO_SET 0x1 /* If we need to set a compression dictionary +enum ZlibStreamHandleFlags { + DICT_TO_SET = 0x1 /* If we need to set a compression dictionary * in the low-level engine at the next * opportunity. */ +}; /* * Macros to make it clearer in some of the twiddlier accesses what is @@ -130,21 +133,18 @@ typedef struct { } ZlibChannelData; /* - * Value bits for the flags field. Definitions are: - * ASYNC - Whether this is an asynchronous channel. - * IN_HEADER - Whether the inHeader field has been registered with - * the input compressor. - * OUT_HEADER - Whether the outputHeader field has been registered - * with the output decompressor. - * STREAM_DECOMPRESS - Signal decompress pending data. - * STREAM_DONE - Flag to signal stream end up to transform input. + * Value bits for the ZlibChannelData::flags field. */ - -#define ASYNC 0x01 -#define IN_HEADER 0x02 -#define OUT_HEADER 0x04 -#define STREAM_DECOMPRESS 0x08 -#define STREAM_DONE 0x10 +enum ZlibChannelDataFlags { + ASYNC = 0x01, /* Set if this is an asynchronous channel. */ + IN_HEADER = 0x02, /* Set if the inHeader field has been + * registered with the input compressor. */ + OUT_HEADER = 0x04, /* Set if the outputHeader field has been + * registered with the output decompressor. */ + STREAM_DECOMPRESS = 0x08, /* Set to signal decompress pending data. */ + STREAM_DONE = 0x10 /* Set to signal stream end up to transform + * input. */ +}; /* * Size of buffers allocated by default, and the range it can be set to. The @@ -187,8 +187,9 @@ static int GenerateHeader(Tcl_Interp *interp, Tcl_Obj *dictObj, GzipHeader *headerPtr, int *extraSizePtr); static int ZlibPushSubcmd(Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); -static int ResultDecompress(ZlibChannelData *cd, char *buf, - int toRead, int flush, int *errorCodePtr); +static int ResultDecompress(ZlibChannelData *chanDataPtr, + char *buf, int toRead, int flush, + int *errorCodePtr); static Tcl_Channel ZlibStackChannelTransform(Tcl_Interp *interp, int mode, int format, int level, int limit, Tcl_Channel channel, Tcl_Obj *gzipHeaderDictPtr, @@ -196,7 +197,8 @@ static Tcl_Channel ZlibStackChannelTransform(Tcl_Interp *interp, static void ZlibStreamCleanup(ZlibStreamHandle *zshPtr); static int ZlibStreamSubcmd(Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); -static inline void ZlibTransformEventTimerKill(ZlibChannelData *cd); +static inline void ZlibTransformEventTimerKill( + ZlibChannelData *chanDataPtr); static void ZlibTransformTimerRun(void *clientData); /* @@ -214,7 +216,7 @@ static const Tcl_ChannelType zlibChannelType = { ZlibTransformGetOption, ZlibTransformWatch, ZlibTransformGetHandle, - ZlibTransformClose, /* close2Proc */ + ZlibTransformClose, /* close2Proc */ ZlibTransformBlockMode, NULL, /* flushProc */ ZlibTransformEventHandler, @@ -262,7 +264,8 @@ ConvertError( */ case Z_ERRNO: - Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_PosixError(interp),-1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_PosixError(interp), TCL_AUTO_LENGTH)); return; /* @@ -313,7 +316,7 @@ ConvertError( snprintf(codeStrBuf, sizeof(codeStrBuf), "%d", code); break; } - Tcl_SetObjResult(interp, Tcl_NewStringObj(zError(code), -1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj(zError(code), TCL_AUTO_LENGTH)); /* * Tricky point! We might pass NULL twice here (and will when the error @@ -350,11 +353,11 @@ ConvertErrorToList( return Tcl_NewListObj(3, objv); case Z_ERRNO: TclNewLiteralStringObj(objv[2], "POSIX"); - objv[3] = Tcl_NewStringObj(Tcl_ErrnoId(), -1); + objv[3] = Tcl_NewStringObj(Tcl_ErrnoId(), TCL_AUTO_LENGTH); return Tcl_NewListObj(4, objv); case Z_NEED_DICT: TclNewLiteralStringObj(objv[2], "NEED_DICT"); - TclNewIntObj(objv[3], (Tcl_WideInt)adler); + TclNewIntObj(objv[3], (Tcl_WideInt) adler); return Tcl_NewListObj(4, objv); /* @@ -405,13 +408,26 @@ GetValue( const char *nameStr, Tcl_Obj **valuePtrPtr) { - Tcl_Obj *name = Tcl_NewStringObj(nameStr, -1); + Tcl_Obj *name = Tcl_NewStringObj(nameStr, TCL_AUTO_LENGTH); int result = Tcl_DictObjGet(interp, dictObj, name, valuePtrPtr); TclDecrRefCount(name); return result; } +/* + * RFC 1952 says that header strings are in ISO 8859-1 (LATIN-1). + */ +static inline Tcl_Encoding +Latin1(void) +{ + Tcl_Encoding latin1enc = Tcl_GetEncoding(NULL, "iso8859-1"); + if (latin1enc == NULL) { + Tcl_Panic("no latin-1 encoding"); + } + return latin1enc; +} + static int GenerateHeader( Tcl_Interp *interp, /* Where to put error messages. */ @@ -426,39 +442,31 @@ GenerateHeader( Tcl_Size length; Tcl_WideInt wideValue = 0; const char *valueStr; - Tcl_Encoding latin1enc; + Tcl_Encoding latin1enc = Latin1(); static const char *const types[] = { "binary", "text" }; - /* - * RFC 1952 says that header strings are in ISO 8859-1 (LATIN-1). - */ - - latin1enc = Tcl_GetEncoding(NULL, "iso8859-1"); - if (latin1enc == NULL) { - Tcl_Panic("no latin-1 encoding"); - } - if (GetValue(interp, dictObj, "comment", &value) != TCL_OK) { goto error; } else if (value != NULL) { Tcl_EncodingState state; valueStr = TclGetStringFromObj(value, &length); result = Tcl_UtfToExternal(NULL, latin1enc, valueStr, length, - TCL_ENCODING_START|TCL_ENCODING_END|TCL_ENCODING_PROFILE_STRICT, &state, - headerPtr->nativeCommentBuf, MAX_COMMENT_LEN-1, NULL, &len, - NULL); + TCL_ENCODING_START|TCL_ENCODING_END|TCL_ENCODING_PROFILE_STRICT, + &state, headerPtr->nativeCommentBuf, MAX_COMMENT_LEN - 1, NULL, + &len, NULL); if (result != TCL_OK) { if (interp) { if (result == TCL_CONVERT_UNKNOWN) { - Tcl_AppendResult( - interp, "Comment contains characters > 0xFF", (char *)NULL); + Tcl_AppendResult(interp, + "Comment contains characters > 0xFF", (char *)NULL); } else { - Tcl_AppendResult(interp, "Comment too large for zip", (char *)NULL); + Tcl_AppendResult(interp, "Comment too large for zip", + (char *)NULL); } } - result = TCL_ERROR; /* TCL_CONVERT_* -> TCL_ERROR*/ + result = TCL_ERROR; /* TCL_CONVERT_* -> TCL_ERROR */ goto error; } headerPtr->nativeCommentBuf[len] = '\0'; @@ -481,20 +489,20 @@ GenerateHeader( Tcl_EncodingState state; valueStr = TclGetStringFromObj(value, &length); result = Tcl_UtfToExternal(NULL, latin1enc, valueStr, length, - TCL_ENCODING_START|TCL_ENCODING_END|TCL_ENCODING_PROFILE_STRICT, &state, - headerPtr->nativeFilenameBuf, MAXPATHLEN-1, NULL, &len, - NULL); + TCL_ENCODING_START|TCL_ENCODING_END|TCL_ENCODING_PROFILE_STRICT, + &state, headerPtr->nativeFilenameBuf, MAXPATHLEN - 1, NULL, + &len, NULL); if (result != TCL_OK) { if (interp) { if (result == TCL_CONVERT_UNKNOWN) { - Tcl_AppendResult( - interp, "Filename contains characters > 0xFF", (char *)NULL); + Tcl_AppendResult(interp, + "Filename contains characters > 0xFF", (char *)NULL); } else { - Tcl_AppendResult( - interp, "Filename too large for zip", (char *)NULL); + Tcl_AppendResult(interp, + "Filename too large for zip", (char *)NULL); } } - result = TCL_ERROR; /* TCL_CONVERT_* -> TCL_ERROR*/ + result = TCL_ERROR; /* TCL_CONVERT_* -> TCL_ERROR */ goto error; } headerPtr->nativeFilenameBuf[len] = '\0'; @@ -555,7 +563,8 @@ GenerateHeader( */ #define SetValue(dictObj, key, value) \ - Tcl_DictObjPut(NULL, (dictObj), Tcl_NewStringObj((key), -1), (value)) + Tcl_DictObjPut(NULL, (dictObj), Tcl_NewStringObj( \ + (key), TCL_AUTO_LENGTH), (value)) static void ExtractHeader( @@ -567,35 +576,21 @@ ExtractHeader( if (headerPtr->comment != Z_NULL) { if (latin1enc == NULL) { - /* - * RFC 1952 says that header strings are in ISO 8859-1 (LATIN-1). - */ - - latin1enc = Tcl_GetEncoding(NULL, "iso8859-1"); - if (latin1enc == NULL) { - Tcl_Panic("no latin-1 encoding"); - } + latin1enc = Latin1(); } - (void)Tcl_ExternalToUtfDString(latin1enc, (char *) headerPtr->comment, TCL_INDEX_NONE, - &tmp); + (void) Tcl_ExternalToUtfDString(latin1enc, (char *) headerPtr->comment, + TCL_AUTO_LENGTH, &tmp); SetValue(dictObj, "comment", Tcl_DStringToObj(&tmp)); } SetValue(dictObj, "crc", Tcl_NewBooleanObj(headerPtr->hcrc)); if (headerPtr->name != Z_NULL) { if (latin1enc == NULL) { - /* - * RFC 1952 says that header strings are in ISO 8859-1 (LATIN-1). - */ - - latin1enc = Tcl_GetEncoding(NULL, "iso8859-1"); - if (latin1enc == NULL) { - Tcl_Panic("no latin-1 encoding"); - } + latin1enc = Latin1(); } - (void)Tcl_ExternalToUtfDString(latin1enc, (char *) headerPtr->name, TCL_INDEX_NONE, - &tmp); + (void) Tcl_ExternalToUtfDString(latin1enc, (char *) headerPtr->name, + TCL_AUTO_LENGTH, &tmp); SetValue(dictObj, "filename", Tcl_DStringToObj(&tmp)); } if (headerPtr->os != 255) { @@ -605,8 +600,8 @@ ExtractHeader( SetValue(dictObj, "time", Tcl_NewWideIntObj(headerPtr->time)); } if (headerPtr->text != Z_UNKNOWN) { - SetValue(dictObj, "type", - Tcl_NewStringObj(headerPtr->text ? "text" : "binary", -1)); + SetValue(dictObj, "type", Tcl_NewStringObj( + headerPtr->text ? "text" : "binary", TCL_AUTO_LENGTH)); } if (latin1enc != NULL) { @@ -660,11 +655,9 @@ Deflate( int flush, size_t *writtenPtr) { - int e; - strm->next_out = (Bytef *) bufferPtr; strm->avail_out = bufferSize; - e = deflate(strm, flush); + int e = deflate(strm, flush); if (writtenPtr != NULL) { *writtenPtr = bufferSize - strm->avail_out; } @@ -737,7 +730,7 @@ Tcl_ZlibStreamInit( case TCL_ZLIB_FORMAT_GZIP: wbits = WBITS_GZIP; if (dictObj) { - gzHeaderPtr = (GzipHeader *)Tcl_Alloc(sizeof(GzipHeader)); + gzHeaderPtr = (GzipHeader *) Tcl_Alloc(sizeof(GzipHeader)); memset(gzHeaderPtr, 0, sizeof(GzipHeader)); if (GenerateHeader(interp, dictObj, gzHeaderPtr, NULL) != TCL_OK) { @@ -771,7 +764,7 @@ Tcl_ZlibStreamInit( break; case TCL_ZLIB_FORMAT_GZIP: wbits = WBITS_GZIP; - gzHeaderPtr = (GzipHeader *)Tcl_Alloc(sizeof(GzipHeader)); + gzHeaderPtr = (GzipHeader *) Tcl_Alloc(sizeof(GzipHeader)); memset(gzHeaderPtr, 0, sizeof(GzipHeader)); gzHeaderPtr->header.name = (Bytef *) gzHeaderPtr->nativeFilenameBuf; @@ -797,7 +790,7 @@ Tcl_ZlibStreamInit( " TCL_ZLIB_STREAM_INFLATE"); } - zshPtr = (ZlibStreamHandle *)Tcl_Alloc(sizeof(ZlibStreamHandle)); + zshPtr = (ZlibStreamHandle *) Tcl_Alloc(sizeof(ZlibStreamHandle)); zshPtr->interp = interp; zshPtr->mode = mode; zshPtr->format = format; @@ -840,7 +833,8 @@ Tcl_ZlibStreamInit( */ if (interp != NULL) { - if (Tcl_EvalEx(interp, "::incr ::tcl::zlib::cmdcounter", TCL_INDEX_NONE, 0) != TCL_OK) { + if (Tcl_EvalEx(interp, "::incr ::tcl::zlib::cmdcounter", + TCL_AUTO_LENGTH, 0) != TCL_OK) { goto error; } Tcl_DStringInit(&cmdname); @@ -849,7 +843,7 @@ Tcl_ZlibStreamInit( if (Tcl_FindCommand(interp, Tcl_DStringValue(&cmdname), NULL, 0) != NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "BUG: Stream command name already exists", -1)); + "BUG: Stream command name already exists", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "BUG", "EXISTING_CMD", (char *)NULL); Tcl_DStringFree(&cmdname); goto error; @@ -922,9 +916,9 @@ Tcl_ZlibStreamInit( static void ZlibStreamCmdDelete( - void *cd) + void *clientData) { - ZlibStreamHandle *zshPtr = (ZlibStreamHandle *)cd; + ZlibStreamHandle *zshPtr = (ZlibStreamHandle *) clientData; zshPtr->cmd = NULL; ZlibStreamCleanup(zshPtr); @@ -1241,7 +1235,7 @@ Tcl_ZlibStreamPut( if (zshPtr->streamEnd) { if (zshPtr->interp) { Tcl_SetObjResult(zshPtr->interp, Tcl_NewStringObj( - "already past compressed stream end", -1)); + "already past compressed stream end", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(zshPtr->interp, "TCL", "ZIP", "CLOSED", (char *)NULL); } return TCL_ERROR; @@ -1284,7 +1278,7 @@ Tcl_ZlibStreamPut( if (outSize > BUFFER_SIZE_LIMIT) { outSize = BUFFER_SIZE_LIMIT; } - dataTmp = (char *)Tcl_Alloc(outSize); + dataTmp = (char *) Tcl_Alloc(outSize); while (1) { e = Deflate(&zshPtr->stream, dataTmp, outSize, flush, &toStore); @@ -1318,7 +1312,7 @@ Tcl_ZlibStreamPut( if (outSize < BUFFER_SIZE_LIMIT) { outSize = BUFFER_SIZE_LIMIT; /* There may be *lots* of data left to output... */ - dataTmp = (char *)Tcl_Realloc(dataTmp, outSize); + dataTmp = (char *) Tcl_Realloc(dataTmp, outSize); } } @@ -1360,7 +1354,7 @@ int Tcl_ZlibStreamGet( Tcl_ZlibStream zshandle, /* As obtained from Tcl_ZlibStreamInit */ Tcl_Obj *data, /* A place to append the data. */ - Tcl_Size count) /* Number of bytes to grab as a maximum, you + Tcl_Size count) /* Number of bytes to grab as a maximum, you * may get less! */ { ZlibStreamHandle *zshPtr = (ZlibStreamHandle *) zshandle; @@ -1396,7 +1390,7 @@ Tcl_ZlibStreamGet( * Prepare the place to store the data. */ - dataPtr = Tcl_SetByteArrayLength(data, existing+count); + dataPtr = Tcl_SetByteArrayLength(data, existing + count); dataPtr += existing; zshPtr->stream.next_out = dataPtr; @@ -1472,7 +1466,7 @@ Tcl_ZlibStreamGet( if (zshPtr->interp) { Tcl_SetObjResult(zshPtr->interp, Tcl_NewStringObj( "unexpected zlib internal state during" - " decompression", -1)); + " decompression", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(zshPtr->interp, "TCL", "ZIP", "STATE", (char *)NULL); } @@ -1517,7 +1511,7 @@ Tcl_ZlibStreamGet( if (e != Z_NEED_DICT || !HaveDictToSet(zshPtr)) { break; } - e = SetInflateDictionary(&zshPtr->stream,zshPtr->compDictObj); + e = SetInflateDictionary(&zshPtr->stream, zshPtr->compDictObj); DictWasSet(zshPtr); } while (e == Z_OK); } @@ -1570,7 +1564,7 @@ Tcl_ZlibStreamGet( Tcl_ListObjIndex(NULL, zshPtr->outData, 0, &itemObj); itemPtr = Tcl_GetBytesFromObj(NULL, itemObj, &itemLen); - if ((itemLen-zshPtr->outPos) >= count-dataPos) { + if ((itemLen - zshPtr->outPos) >= (count - dataPos)) { Tcl_Size len = count - dataPos; memcpy(dataPtr + dataPos, itemPtr + zshPtr->outPos, len); @@ -1817,10 +1811,10 @@ Tcl_ZlibInflate( if (gzipHeaderDictObj) { headerPtr = &header; memset(headerPtr, 0, sizeof(gz_header)); - nameBuf = (char *)Tcl_Alloc(MAXPATHLEN); + nameBuf = (char *) Tcl_Alloc(MAXPATHLEN); header.name = (Bytef *) nameBuf; header.name_max = MAXPATHLEN - 1; - commentBuf = (char *)Tcl_Alloc(MAX_COMMENT_LEN); + commentBuf = (char *) Tcl_Alloc(MAX_COMMENT_LEN); header.comment = (Bytef *) commentBuf; header.comm_max = MAX_COMMENT_LEN - 1; } @@ -1830,10 +1824,10 @@ Tcl_ZlibInflate( * Start with a buffer (up to) 3 times the size of the input data. */ - if (inLen < 32*1024*1024) { - bufferSize = 3*inLen; - } else if (inLen < 256*1024*1024) { - bufferSize = 2*inLen; + if (inLen < 32 * 1024 * 1024) { + bufferSize = 3 * inLen; + } else if (inLen < 256 * 1024 * 1024) { + bufferSize = 2 * inLen; } else { bufferSize = inLen; } @@ -1843,7 +1837,7 @@ Tcl_ZlibInflate( outData = Tcl_SetByteArrayLength(obj, bufferSize); memset(&stream, 0, sizeof(z_stream)); stream.avail_in = inLen+1; /* +1 because zlib can "over-request" - * input (but ignore it!) */ + * input (but ignore it!) */ stream.next_in = inData; stream.avail_out = bufferSize; stream.next_out = outData; @@ -1887,7 +1881,7 @@ Tcl_ZlibInflate( } newBufferSize = bufferSize + 5 * stream.avail_in; if (newBufferSize == bufferSize) { - newBufferSize = bufferSize+1000; + newBufferSize = bufferSize + 1000; } newOutData = Tcl_SetByteArrayLength(obj, newBufferSize); @@ -1979,6 +1973,8 @@ Tcl_ZlibAdler32( * * Implementation of the [zlib] command. * + * TODO: Convert this to an ensemble. + * *---------------------------------------------------------------------- */ @@ -2017,8 +2013,8 @@ ZlibCmd( } switch (command) { - case CMD_ADLER: /* adler32 str ?startvalue? - * -> checksum */ + case CMD_ADLER: /* adler32 str ?startvalue? + * -> checksum */ if (objc < 3 || objc > 4) { Tcl_WrongNumArgs(interp, 2, objv, "data ?startValue?"); return TCL_ERROR; @@ -2027,7 +2023,7 @@ ZlibCmd( if (data == NULL) { return TCL_ERROR; } - if (objc>3 && Tcl_GetIntFromObj(interp, objv[3], + if (objc > 3 && Tcl_GetIntFromObj(interp, objv[3], (int *) &start) != TCL_OK) { return TCL_ERROR; } @@ -2037,8 +2033,8 @@ ZlibCmd( Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt) (uLong) Tcl_ZlibAdler32(start, data, dlen))); return TCL_OK; - case CMD_CRC: /* crc32 str ?startvalue? - * -> checksum */ + case CMD_CRC: /* crc32 str ?startvalue? + * -> checksum */ if (objc < 3 || objc > 4) { Tcl_WrongNumArgs(interp, 2, objv, "data ?startValue?"); return TCL_ERROR; @@ -2047,7 +2043,7 @@ ZlibCmd( if (data == NULL) { return TCL_ERROR; } - if (objc>3 && Tcl_GetIntFromObj(interp, objv[3], + if (objc > 3 && Tcl_GetIntFromObj(interp, objv[3], (int *) &start) != TCL_OK) { return TCL_ERROR; } @@ -2057,8 +2053,8 @@ ZlibCmd( Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt) (uLong) Tcl_ZlibCRC32(start, data, dlen))); return TCL_OK; - case CMD_DEFLATE: /* deflate data ?level? - * -> rawCompressedData */ + case CMD_DEFLATE: /* deflate data ?level? + * -> rawCompressedData */ if (objc < 3 || objc > 4) { Tcl_WrongNumArgs(interp, 2, objv, "data ?level?"); return TCL_ERROR; @@ -2073,8 +2069,8 @@ ZlibCmd( } return Tcl_ZlibDeflate(interp, TCL_ZLIB_FORMAT_RAW, objv[2], level, NULL); - case CMD_COMPRESS: /* compress data ?level? - * -> zlibCompressedData */ + case CMD_COMPRESS: /* compress data ?level? + * -> zlibCompressedData */ if (objc < 3 || objc > 4) { Tcl_WrongNumArgs(interp, 2, objv, "data ?level?"); return TCL_ERROR; @@ -2089,8 +2085,8 @@ ZlibCmd( } return Tcl_ZlibDeflate(interp, TCL_ZLIB_FORMAT_ZLIB, objv[2], level, NULL); - case CMD_GZIP: /* gzip data ?level? - * -> gzippedCompressedData */ + case CMD_GZIP: /* gzip data ?level? + * -> gzippedCompressedData */ headerDictObj = NULL; /* @@ -2123,10 +2119,10 @@ ZlibCmd( } switch (option) { case 0: - headerDictObj = objv[i+1]; + headerDictObj = objv[i + 1]; break; case 1: - if (Tcl_GetIntFromObj(interp, objv[i+1], + if (Tcl_GetIntFromObj(interp, objv[i + 1], &level) != TCL_OK) { return TCL_ERROR; } @@ -2139,8 +2135,8 @@ ZlibCmd( } return Tcl_ZlibDeflate(interp, TCL_ZLIB_FORMAT_GZIP, objv[2], level, headerDictObj); - case CMD_INFLATE: /* inflate rawcomprdata ?bufferSize? - * -> decompressedData */ + case CMD_INFLATE: /* inflate rawcomprdata ?bufferSize? + * -> decompressedData */ if (objc < 3 || objc > 4) { Tcl_WrongNumArgs(interp, 2, objv, "data ?bufferSize?"); return TCL_ERROR; @@ -2158,9 +2154,8 @@ ZlibCmd( } return Tcl_ZlibInflate(interp, TCL_ZLIB_FORMAT_RAW, objv[2], buffersize, NULL); - case CMD_DECOMPRESS: /* decompress zlibcomprdata \ - * ?bufferSize? - * -> decompressedData */ + case CMD_DECOMPRESS: /* decompress zlibcomprdata ?bufferSize? + * -> decompressedData */ if (objc < 3 || objc > 4) { Tcl_WrongNumArgs(interp, 2, objv, "data ?bufferSize?"); return TCL_ERROR; @@ -2178,8 +2173,8 @@ ZlibCmd( } return Tcl_ZlibInflate(interp, TCL_ZLIB_FORMAT_ZLIB, objv[2], buffersize, NULL); - case CMD_GUNZIP: { /* gunzip gzippeddata ?bufferSize? - * -> decompressedData */ + case CMD_GUNZIP: { /* gunzip gzippeddata ?-headerVar varName? + * -> decompressedData */ Tcl_Obj *headerVarObj; if (objc < 3 || objc > 5 || ((objc & 1) == 0)) { @@ -2198,7 +2193,7 @@ ZlibCmd( } switch (option) { case 0: - if (TclGetWideIntFromObj(interp, objv[i+1], + if (TclGetWideIntFromObj(interp, objv[i + 1], &wideLen) != TCL_OK) { return TCL_ERROR; } @@ -2209,7 +2204,7 @@ ZlibCmd( buffersize = wideLen; break; case 1: - headerVarObj = objv[i+1]; + headerVarObj = objv[i + 1]; TclNewObj(headerDictObj); break; } @@ -2227,19 +2222,19 @@ ZlibCmd( } return TCL_OK; } - case CMD_STREAM: /* stream deflate/inflate/...gunzip \ - * ?options...? - * -> handleCmd */ + case CMD_STREAM: /* stream deflate/inflate/...gunzip options... + * -> handleCmd */ return ZlibStreamSubcmd(interp, objc, objv); - case CMD_PUSH: /* push mode channel options... - * -> channel */ + case CMD_PUSH: /* push mode channel options... + * -> channel */ return ZlibPushSubcmd(interp, objc, objv); - }; + } return TCL_ERROR; badLevel: - Tcl_SetObjResult(interp, Tcl_NewStringObj("level must be 0 to 9", -1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "level must be 0 to 9", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "VALUE", "COMPRESSIONLEVEL", (char *)NULL); if (extraInfoStr) { Tcl_AddErrorInfo(interp, extraInfoStr); @@ -2370,7 +2365,7 @@ ZlibStreamSubcmd( sizeof(OptDescriptor), "option", 0, &option) != TCL_OK) { return TCL_ERROR; } - obj[desc[option].offset] = objv[i+1]; + obj[desc[option].offset] = objv[i + 1]; } /* @@ -2383,7 +2378,8 @@ ZlibStreamSubcmd( } else if (Tcl_GetIntFromObj(interp, levelObj, &level) != TCL_OK) { return TCL_ERROR; } else if (level < 0 || level > 9) { - Tcl_SetObjResult(interp, Tcl_NewStringObj("level must be 0 to 9",-1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "level must be 0 to 9", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "VALUE", "COMPRESSIONLEVEL", (char *)NULL); Tcl_AddErrorInfo(interp, "\n (in -level option)"); return TCL_ERROR; @@ -2492,7 +2488,7 @@ ZlibPushSubcmd( Tcl_Panic("should be unreachable"); } - if (TclGetChannelFromObj(interp, objv[3], &chan, &chanMode, 0) != TCL_OK){ + if (TclGetChannelFromObj(interp, objv[3], &chan, &chanMode, 0) != TCL_OK) { return TCL_ERROR; } @@ -2502,13 +2498,15 @@ ZlibPushSubcmd( if (mode == TCL_ZLIB_STREAM_DEFLATE && !(chanMode & TCL_WRITABLE)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "compression may only be applied to writable channels", -1)); + "compression may only be applied to writable channels", + TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "UNWRITABLE", (char *)NULL); return TCL_ERROR; } if (mode == TCL_ZLIB_STREAM_INFLATE && !(chanMode & TCL_READABLE)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "decompression may only be applied to readable channels",TCL_INDEX_NONE)); + "decompression may only be applied to readable channels", + TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "UNREADABLE", (char *)NULL); return TCL_ERROR; } @@ -2523,33 +2521,33 @@ ZlibPushSubcmd( &option) != TCL_OK) { return TCL_ERROR; } - if (++i > objc-1) { + if (++i > objc - 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "value missing for %s option", pushOptions[option])); Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", (char *)NULL); return TCL_ERROR; } switch (option) { - case poHeader: + case poHeader: /* -header headerDict */ headerObj = objv[i]; if (Tcl_DictObjSize(interp, headerObj, &dummy) != TCL_OK) { goto genericOptionError; } break; - case poLevel: - if (Tcl_GetIntFromObj(interp, objv[i], (int*) &level) != TCL_OK) { + case poLevel: /* -level compLevel */ + if (Tcl_GetIntFromObj(interp, objv[i], (int *) &level) != TCL_OK) { goto genericOptionError; } if (level < 0 || level > 9) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "level must be 0 to 9", -1)); + "level must be 0 to 9", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "VALUE", "COMPRESSIONLEVEL", (char *)NULL); goto genericOptionError; } break; - case poLimit: - if (Tcl_GetIntFromObj(interp, objv[i], (int*) &limit) != TCL_OK) { + case poLimit: /* -limit numBytes */ + if (Tcl_GetIntFromObj(interp, objv[i], (int *) &limit) != TCL_OK) { goto genericOptionError; } if (limit < 1 || limit > MAX_BUFFER_SIZE) { @@ -2560,11 +2558,11 @@ ZlibPushSubcmd( goto genericOptionError; } break; - case poDictionary: + case poDictionary: /* -dictionary compDict */ if (format == TCL_ZLIB_FORMAT_GZIP) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "a compression dictionary may not be set in the " - "gzip format", -1)); + "gzip format", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "BADOPT", (char *)NULL); goto genericOptionError; } @@ -2573,7 +2571,8 @@ ZlibPushSubcmd( } } - if (compDictObj && (NULL == Tcl_GetBytesFromObj(interp, compDictObj, (Tcl_Size *)NULL))) { + if (compDictObj && (NULL == Tcl_GetBytesFromObj(interp, compDictObj, + (Tcl_Size *)NULL))) { return TCL_ERROR; } @@ -2603,12 +2602,12 @@ ZlibPushSubcmd( static int ZlibStreamCmd( - void *cd, + void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { - Tcl_ZlibStream zstream = (Tcl_ZlibStream)cd; + Tcl_ZlibStream zstream = (Tcl_ZlibStream) clientData; int count, code; Tcl_Obj *obj; static const char *const cmds[] = { @@ -2729,12 +2728,12 @@ ZlibStreamCmd( static int ZlibStreamAddCmd( - void *cd, + void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { - Tcl_ZlibStream zstream = (Tcl_ZlibStream)cd; + Tcl_ZlibStream zstream = (Tcl_ZlibStream) clientData; int code, buffersize = -1, flush = -1, i; Tcl_Obj *obj, *compDictObj = NULL; static const char *const add_options[] = { @@ -2751,32 +2750,32 @@ ZlibStreamAddCmd( } switch (index) { - case ao_flush: /* -flush */ + case ao_flush: /* -flush */ if (flush >= 0) { flush = -2; } else { flush = Z_SYNC_FLUSH; } break; - case ao_fullflush: /* -fullflush */ + case ao_fullflush: /* -fullflush */ if (flush >= 0) { flush = -2; } else { flush = Z_FULL_FLUSH; } break; - case ao_finalize: /* -finalize */ + case ao_finalize: /* -finalize */ if (flush >= 0) { flush = -2; } else { flush = Z_FINISH; } break; - case ao_buffer: /* -buffer */ - if (i == objc-2) { + case ao_buffer: /* -buffer bufferSize */ + if (i == objc - 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "\"-buffer\" option must be followed by integer " - "decompression buffersize", -1)); + "decompression buffersize", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", (char *)NULL); return TCL_ERROR; } @@ -2791,11 +2790,11 @@ ZlibStreamAddCmd( return TCL_ERROR; } break; - case ao_dictionary: - if (i == objc-2) { + case ao_dictionary: /* -dictionary compDict */ + if (i == objc - 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "\"-dictionary\" option must be followed by" - " compression dictionary bytes", -1)); + " compression dictionary bytes", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", (char *)NULL); return TCL_ERROR; } @@ -2806,7 +2805,7 @@ ZlibStreamAddCmd( if (flush == -2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "\"-flush\", \"-fullflush\" and \"-finalize\" options" - " are mutually exclusive", -1)); + " are mutually exclusive", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "EXCLUSIVE", (char *)NULL); return TCL_ERROR; } @@ -2836,7 +2835,7 @@ ZlibStreamAddCmd( * Send the data to the stream core, along with any flushing directive. */ - if (Tcl_ZlibStreamPut(zstream, objv[objc-1], flush) != TCL_OK) { + if (Tcl_ZlibStreamPut(zstream, objv[objc - 1], flush) != TCL_OK) { return TCL_ERROR; } @@ -2856,12 +2855,12 @@ ZlibStreamAddCmd( static int ZlibStreamPutCmd( - void *cd, + void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { - Tcl_ZlibStream zstream = (Tcl_ZlibStream)cd; + Tcl_ZlibStream zstream = (Tcl_ZlibStream) clientData; int flush = -1, i; Tcl_Obj *compDictObj = NULL; static const char *const put_options[] = { @@ -2878,32 +2877,32 @@ ZlibStreamPutCmd( } switch (index) { - case po_flush: /* -flush */ + case po_flush: /* -flush */ if (flush >= 0) { flush = -2; } else { flush = Z_SYNC_FLUSH; } break; - case po_fullflush: /* -fullflush */ + case po_fullflush: /* -fullflush */ if (flush >= 0) { flush = -2; } else { flush = Z_FULL_FLUSH; } break; - case po_finalize: /* -finalize */ + case po_finalize: /* -finalize */ if (flush >= 0) { flush = -2; } else { flush = Z_FINISH; } break; - case po_dictionary: - if (i == objc-2) { + case po_dictionary: /* -dictionary compDict */ + if (i == objc - 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "\"-dictionary\" option must be followed by" - " compression dictionary bytes", -1)); + " compression dictionary bytes", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", (char *)NULL); return TCL_ERROR; } @@ -2913,7 +2912,7 @@ ZlibStreamPutCmd( if (flush == -2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "\"-flush\", \"-fullflush\" and \"-finalize\" options" - " are mutually exclusive", -1)); + " are mutually exclusive", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "EXCLUSIVE", (char *)NULL); return TCL_ERROR; } @@ -2942,17 +2941,17 @@ ZlibStreamPutCmd( * Send the data to the stream core, along with any flushing directive. */ - return Tcl_ZlibStreamPut(zstream, objv[objc-1], flush); + return Tcl_ZlibStreamPut(zstream, objv[objc - 1], flush); } static int ZlibStreamHeaderCmd( - void *cd, + void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { - ZlibStreamHandle *zshPtr = (ZlibStreamHandle *)cd; + ZlibStreamHandle *zshPtr = (ZlibStreamHandle *) clientData; Tcl_Obj *resultObj; if (objc != 2) { @@ -2961,7 +2960,8 @@ ZlibStreamHeaderCmd( } else if (zshPtr->mode != TCL_ZLIB_STREAM_INFLATE || zshPtr->format != TCL_ZLIB_FORMAT_GZIP) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "only gunzip streams can produce header information", -1)); + "only gunzip streams can produce header information", + TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ZIP", "BADOP", (char *)NULL); return TCL_ERROR; } @@ -2976,6 +2976,17 @@ ZlibStreamHeaderCmd( *---------------------------------------------------------------------- * Set of functions to support channel stacking. *---------------------------------------------------------------------- + */ + +static inline int +HaveFlag( + ZlibChannelData *chanDataPtr, + int flag) +{ + return (chanDataPtr->flags & flag) != 0; +} + +/* * * ZlibTransformClose -- * @@ -2988,9 +2999,9 @@ static int ZlibTransformClose( void *instanceData, Tcl_Interp *interp, - int flags) + int flags) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; int e, result = TCL_OK; size_t written; @@ -3002,17 +3013,17 @@ ZlibTransformClose( * Delete the support timer. */ - ZlibTransformEventTimerKill(cd); + ZlibTransformEventTimerKill(chanDataPtr); /* * Flush any data waiting to be compressed. */ - if (cd->mode == TCL_ZLIB_STREAM_DEFLATE) { - cd->outStream.avail_in = 0; + if (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) { + chanDataPtr->outStream.avail_in = 0; do { - e = Deflate(&cd->outStream, cd->outBuffer, cd->outAllocated, - Z_FINISH, &written); + e = Deflate(&chanDataPtr->outStream, chanDataPtr->outBuffer, + chanDataPtr->outAllocated, Z_FINISH, &written); /* * Can't be sure that deflate() won't declare the buffer to be @@ -3021,17 +3032,18 @@ ZlibTransformClose( if (e == Z_BUF_ERROR) { e = Z_OK; - written = cd->outAllocated; + written = chanDataPtr->outAllocated; } if (e != Z_OK && e != Z_STREAM_END) { /* TODO: is this the right way to do errors on close? */ if (!TclInThreadExit()) { - ConvertError(interp, e, cd->outStream.adler); + ConvertError(interp, e, chanDataPtr->outStream.adler); } result = TCL_ERROR; break; } - if (written && Tcl_WriteRaw(cd->parent, cd->outBuffer, written) == TCL_IO_FAILURE) { + if (written && Tcl_WriteRaw(chanDataPtr->parent, + chanDataPtr->outBuffer, written) == TCL_IO_FAILURE) { /* TODO: is this the right way to do errors on close? * Note: when close is called from FinalizeIOSubsystem then * interp may be NULL */ @@ -3044,38 +3056,40 @@ ZlibTransformClose( break; } } while (e != Z_STREAM_END); - (void) deflateEnd(&cd->outStream); + (void) deflateEnd(&chanDataPtr->outStream); } else { /* * If we have unused bytes from the read input (overshot by * Z_STREAM_END or on possible error), unget them back to the parent * channel, so that they appear as not being read yet. */ - if (cd->inStream.avail_in) { - Tcl_Ungets (cd->parent, (char *)cd->inStream.next_in, cd->inStream.avail_in, 0); + if (chanDataPtr->inStream.avail_in) { + Tcl_Ungets(chanDataPtr->parent, + (char *) chanDataPtr->inStream.next_in, + chanDataPtr->inStream.avail_in, 0); } - (void) inflateEnd(&cd->inStream); + (void) inflateEnd(&chanDataPtr->inStream); } /* * Release all memory. */ - if (cd->compDictObj) { - Tcl_DecrRefCount(cd->compDictObj); - cd->compDictObj = NULL; + if (chanDataPtr->compDictObj) { + Tcl_DecrRefCount(chanDataPtr->compDictObj); + chanDataPtr->compDictObj = NULL; } - if (cd->inBuffer) { - Tcl_Free(cd->inBuffer); - cd->inBuffer = NULL; + if (chanDataPtr->inBuffer) { + Tcl_Free(chanDataPtr->inBuffer); + chanDataPtr->inBuffer = NULL; } - if (cd->outBuffer) { - Tcl_Free(cd->outBuffer); - cd->outBuffer = NULL; + if (chanDataPtr->outBuffer) { + Tcl_Free(chanDataPtr->outBuffer); + chanDataPtr->outBuffer = NULL; } - Tcl_Free(cd); + Tcl_Free(chanDataPtr); return result; } @@ -3096,31 +3110,32 @@ ZlibTransformInput( int toRead, int *errorCodePtr) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; Tcl_DriverInputProc *inProc = - Tcl_ChannelInputProc(Tcl_GetChannelType(cd->parent)); + Tcl_ChannelInputProc(Tcl_GetChannelType(chanDataPtr->parent)); int readBytes, gotBytes; - if (cd->mode == TCL_ZLIB_STREAM_DEFLATE) { - return inProc(Tcl_GetChannelInstanceData(cd->parent), buf, toRead, - errorCodePtr); + if (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) { + return inProc(Tcl_GetChannelInstanceData(chanDataPtr->parent), buf, + toRead, errorCodePtr); } gotBytes = 0; - readBytes = cd->inStream.avail_in; /* how many bytes in buffer now */ - while (!(cd->flags & STREAM_DONE) && toRead > 0) { - unsigned int n; int decBytes; + readBytes = chanDataPtr->inStream.avail_in; /* how many bytes in buffer now */ + while (!HaveFlag(chanDataPtr, STREAM_DONE) && toRead > 0) { + unsigned int n; + int decBytes; /* if starting from scratch or continuation after full decompression */ - if (!cd->inStream.avail_in) { + if (!chanDataPtr->inStream.avail_in) { /* buffer to start, we can read to whole available buffer */ - cd->inStream.next_in = (Bytef *) cd->inBuffer; + chanDataPtr->inStream.next_in = (Bytef *) chanDataPtr->inBuffer; } /* * If done - no read needed anymore, check we have to copy rest of * decompressed data, otherwise return with size (or 0 for Eof) */ - if (cd->flags & STREAM_DECOMPRESS) { + if (HaveFlag(chanDataPtr, STREAM_DECOMPRESS)) { goto copyDecompressed; } /* @@ -3131,7 +3146,8 @@ ZlibTransformInput( */ /* Check free buffer size and adjust size of next chunk to read. */ - n = cd->inAllocated - ((char *)cd->inStream.next_in - cd->inBuffer); + n = chanDataPtr->inAllocated - ((char *) + chanDataPtr->inStream.next_in - chanDataPtr->inBuffer); if (n <= 0) { /* Normally unreachable: not enough input buffer to uncompress. * Todo: firstly try to realloc inBuffer upto MAX_BUFFER_SIZE. @@ -3139,10 +3155,11 @@ ZlibTransformInput( *errorCodePtr = ENOBUFS; return -1; } - if (n > cd->readAheadLimit) { - n = cd->readAheadLimit; + if (n > chanDataPtr->readAheadLimit) { + n = chanDataPtr->readAheadLimit; } - readBytes = Tcl_ReadRaw(cd->parent, (char *)cd->inStream.next_in, n); + readBytes = Tcl_ReadRaw(chanDataPtr->parent, + (char *) chanDataPtr->inStream.next_in, n); /* * Three cases here: @@ -3155,9 +3172,8 @@ ZlibTransformInput( */ if (readBytes == -1) { - /* See ReflectInput() in tclIORTrans.c */ - if (Tcl_InputBlocked(cd->parent) && (gotBytes > 0)) { + if (Tcl_InputBlocked(chanDataPtr->parent) && (gotBytes > 0)) { break; } @@ -3166,7 +3182,7 @@ ZlibTransformInput( } /* more bytes (or Eof if readBytes == 0) */ - cd->inStream.avail_in += readBytes; + chanDataPtr->inStream.avail_in += readBytes; copyDecompressed: @@ -3178,9 +3194,8 @@ copyDecompressed: * partial data waiting is converted and returned. */ - decBytes = ResultDecompress(cd, buf, toRead, - (readBytes != 0) ? Z_NO_FLUSH : Z_SYNC_FLUSH, - errorCodePtr); + decBytes = ResultDecompress(chanDataPtr, buf, toRead, + (readBytes != 0) ? Z_NO_FLUSH : Z_SYNC_FLUSH, errorCodePtr); if (decBytes == -1) { return -1; } @@ -3188,15 +3203,15 @@ copyDecompressed: buf += decBytes; toRead -= decBytes; - if (((decBytes == 0) || (cd->flags & STREAM_DECOMPRESS))) { + if ((decBytes == 0) || HaveFlag(chanDataPtr, STREAM_DECOMPRESS)) { /* * The drain delivered nothing (or buffer too small to decompress). * Time to deliver what we've got. */ - if (!gotBytes && !(cd->flags & STREAM_DONE)) { + if (!gotBytes && !HaveFlag(chanDataPtr, STREAM_DONE)) { /* if no-data, but not ready - avoid signaling Eof, * continue in blocking mode, otherwise EAGAIN */ - if (Tcl_InputBlocked(cd->parent)) { + if (Tcl_InputBlocked(chanDataPtr->parent)) { continue; } *errorCodePtr = EAGAIN; @@ -3231,16 +3246,16 @@ ZlibTransformOutput( int toWrite, int *errorCodePtr) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; Tcl_DriverOutputProc *outProc = - Tcl_ChannelOutputProc(Tcl_GetChannelType(cd->parent)); + Tcl_ChannelOutputProc(Tcl_GetChannelType(chanDataPtr->parent)); int e; size_t produced; Tcl_Obj *errObj; - if (cd->mode == TCL_ZLIB_STREAM_INFLATE) { - return outProc(Tcl_GetChannelInstanceData(cd->parent), buf, toWrite, - errorCodePtr); + if (chanDataPtr->mode == TCL_ZLIB_STREAM_INFLATE) { + return outProc(Tcl_GetChannelInstanceData(chanDataPtr->parent), buf, + toWrite, errorCodePtr); } /* @@ -3251,32 +3266,34 @@ ZlibTransformOutput( return 0; } - cd->outStream.next_in = (Bytef *) buf; - cd->outStream.avail_in = toWrite; - while (cd->outStream.avail_in > 0) { - e = Deflate(&cd->outStream, cd->outBuffer, cd->outAllocated, - Z_NO_FLUSH, &produced); + chanDataPtr->outStream.next_in = (Bytef *) buf; + chanDataPtr->outStream.avail_in = toWrite; + while (chanDataPtr->outStream.avail_in > 0) { + e = Deflate(&chanDataPtr->outStream, chanDataPtr->outBuffer, + chanDataPtr->outAllocated, Z_NO_FLUSH, &produced); if (e != Z_OK || produced == 0) { break; } - if (Tcl_WriteRaw(cd->parent, cd->outBuffer, produced) == TCL_IO_FAILURE) { + if (Tcl_WriteRaw(chanDataPtr->parent, chanDataPtr->outBuffer, + produced) == TCL_IO_FAILURE) { *errorCodePtr = Tcl_GetErrno(); return -1; } } if (e == Z_OK) { - return toWrite - cd->outStream.avail_in; + return toWrite - chanDataPtr->outStream.avail_in; } errObj = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(NULL, errObj, Tcl_NewStringObj("-errorcode",-1)); + Tcl_ListObjAppendElement(NULL, errObj, Tcl_NewStringObj( + "-errorcode", TCL_AUTO_LENGTH)); Tcl_ListObjAppendElement(NULL, errObj, - ConvertErrorToList(e, cd->outStream.adler)); + ConvertErrorToList(e, chanDataPtr->outStream.adler)); Tcl_ListObjAppendElement(NULL, errObj, - Tcl_NewStringObj(cd->outStream.msg, -1)); - Tcl_SetChannelError(cd->parent, errObj); + Tcl_NewStringObj(chanDataPtr->outStream.msg, TCL_AUTO_LENGTH)); + Tcl_SetChannelError(chanDataPtr->parent, errObj); *errorCodePtr = EINVAL; return -1; } @@ -3294,22 +3311,22 @@ ZlibTransformOutput( static int ZlibTransformFlush( Tcl_Interp *interp, - ZlibChannelData *cd, + ZlibChannelData *chanDataPtr, int flushType) { int e; size_t len; - cd->outStream.avail_in = 0; + chanDataPtr->outStream.avail_in = 0; do { /* * Get the bytes to go out of the compression engine. */ - e = Deflate(&cd->outStream, cd->outBuffer, cd->outAllocated, - flushType, &len); + e = Deflate(&chanDataPtr->outStream, chanDataPtr->outBuffer, + chanDataPtr->outAllocated, flushType, &len); if (e != Z_OK && e != Z_BUF_ERROR) { - ConvertError(interp, e, cd->outStream.adler); + ConvertError(interp, e, chanDataPtr->outStream.adler); return TCL_ERROR; } @@ -3317,7 +3334,8 @@ ZlibTransformFlush( * Write the bytes we've received to the next layer. */ - if (len > 0 && Tcl_WriteRaw(cd->parent, cd->outBuffer, len) == TCL_IO_FAILURE) { + if (len > 0 && Tcl_WriteRaw(chanDataPtr->parent, chanDataPtr->outBuffer, + len) == TCL_IO_FAILURE) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "problem flushing channel: %s", Tcl_PosixError(interp))); @@ -3354,17 +3372,17 @@ ZlibTransformSetOption( /* not used */ const char *optionName, const char *value) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; Tcl_DriverSetOptionProc *setOptionProc = - Tcl_ChannelSetOptionProc(Tcl_GetChannelType(cd->parent)); + Tcl_ChannelSetOptionProc(Tcl_GetChannelType(chanDataPtr->parent)); static const char *compressChanOptions = "dictionary flush"; static const char *gzipChanOptions = "flush"; static const char *decompressChanOptions = "dictionary limit"; static const char *gunzipChanOptions = "flush limit"; - int haveFlushOpt = (cd->mode == TCL_ZLIB_STREAM_DEFLATE); + int haveFlushOpt = (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE); if (optionName && (strcmp(optionName, "-dictionary") == 0) - && (cd->format != TCL_ZLIB_FORMAT_GZIP)) { + && (chanDataPtr->format != TCL_ZLIB_FORMAT_GZIP)) { Tcl_Obj *compDictObj; int code; @@ -3374,21 +3392,21 @@ ZlibTransformSetOption( /* not used */ Tcl_DecrRefCount(compDictObj); return TCL_ERROR; } - if (cd->compDictObj) { - TclDecrRefCount(cd->compDictObj); + if (chanDataPtr->compDictObj) { + TclDecrRefCount(chanDataPtr->compDictObj); } - cd->compDictObj = compDictObj; + chanDataPtr->compDictObj = compDictObj; code = Z_OK; - if (cd->mode == TCL_ZLIB_STREAM_DEFLATE) { - code = SetDeflateDictionary(&cd->outStream, compDictObj); + if (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) { + code = SetDeflateDictionary(&chanDataPtr->outStream, compDictObj); if (code != Z_OK) { - ConvertError(interp, code, cd->outStream.adler); + ConvertError(interp, code, chanDataPtr->outStream.adler); return TCL_ERROR; } - } else if (cd->format == TCL_ZLIB_FORMAT_RAW) { - code = SetInflateDictionary(&cd->inStream, compDictObj); + } else if (chanDataPtr->format == TCL_ZLIB_FORMAT_RAW) { + code = SetInflateDictionary(&chanDataPtr->inStream, compDictObj); if (code != Z_OK) { - ConvertError(interp, code, cd->inStream.adler); + ConvertError(interp, code, chanDataPtr->inStream.adler); return TCL_ERROR; } } @@ -3415,7 +3433,7 @@ ZlibTransformSetOption( /* not used */ * Try to actually do the flush now. */ - return ZlibTransformFlush(interp, cd, flushType); + return ZlibTransformFlush(interp, chanDataPtr, flushType); } } else { if (optionName && strcmp(optionName, "-limit") == 0) { @@ -3425,21 +3443,22 @@ ZlibTransformSetOption( /* not used */ return TCL_ERROR; } else if (newLimit < 1 || newLimit > MAX_BUFFER_SIZE) { Tcl_SetObjResult(interp, Tcl_NewStringObj( - "-limit must be between 1 and 65536", -1)); - Tcl_SetErrorCode(interp, "TCL", "VALUE", "READLIMIT", (char *)NULL); + "-limit must be between 1 and 65536", TCL_AUTO_LENGTH)); + Tcl_SetErrorCode(interp, "TCL", "VALUE", "READLIMIT", + (char *)NULL); return TCL_ERROR; } } } if (setOptionProc == NULL) { - if (cd->format == TCL_ZLIB_FORMAT_GZIP) { + if (chanDataPtr->format == TCL_ZLIB_FORMAT_GZIP) { return Tcl_BadChannelOption(interp, optionName, - (cd->mode == TCL_ZLIB_STREAM_DEFLATE) + (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) ? gzipChanOptions : gunzipChanOptions); } else { return Tcl_BadChannelOption(interp, optionName, - (cd->mode == TCL_ZLIB_STREAM_DEFLATE) + (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) ? compressChanOptions : decompressChanOptions); } } @@ -3449,8 +3468,8 @@ ZlibTransformSetOption( /* not used */ * channel. */ - return setOptionProc(Tcl_GetChannelInstanceData(cd->parent), interp, - optionName, value); + return setOptionProc(Tcl_GetChannelInstanceData(chanDataPtr->parent), + interp, optionName, value); } /* @@ -3470,9 +3489,9 @@ ZlibTransformGetOption( const char *optionName, Tcl_DString *dsPtr) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; Tcl_DriverGetOptionProc *getOptionProc = - Tcl_ChannelGetOptionProc(Tcl_GetChannelType(cd->parent)); + Tcl_ChannelGetOptionProc(Tcl_GetChannelType(chanDataPtr->parent)); static const char *compressChanOptions = "checksum dictionary"; static const char *gzipChanOptions = "checksum"; static const char *decompressChanOptions = "checksum dictionary limit"; @@ -3488,10 +3507,10 @@ ZlibTransformGetOption( uLong crc; char buf[12]; - if (cd->mode == TCL_ZLIB_STREAM_DEFLATE) { - crc = cd->outStream.adler; + if (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) { + crc = chanDataPtr->outStream.adler; } else { - crc = cd->inStream.adler; + crc = chanDataPtr->inStream.adler; } snprintf(buf, sizeof(buf), "%lu", crc); @@ -3499,12 +3518,12 @@ ZlibTransformGetOption( Tcl_DStringAppendElement(dsPtr, "-checksum"); Tcl_DStringAppendElement(dsPtr, buf); } else { - Tcl_DStringAppend(dsPtr, buf, -1); + Tcl_DStringAppend(dsPtr, buf, TCL_AUTO_LENGTH); return TCL_OK; } } - if ((cd->format != TCL_ZLIB_FORMAT_GZIP) && + if ((chanDataPtr->format != TCL_ZLIB_FORMAT_GZIP) && (optionName == NULL || strcmp(optionName, "-dictionary") == 0)) { /* * Embedded NUL bytes are ok; they'll be C080-encoded. @@ -3512,16 +3531,17 @@ ZlibTransformGetOption( if (optionName == NULL) { Tcl_DStringAppendElement(dsPtr, "-dictionary"); - if (cd->compDictObj) { + if (chanDataPtr->compDictObj) { Tcl_DStringAppendElement(dsPtr, - TclGetString(cd->compDictObj)); + TclGetString(chanDataPtr->compDictObj)); } else { Tcl_DStringAppendElement(dsPtr, ""); } } else { - if (cd->compDictObj) { + if (chanDataPtr->compDictObj) { Tcl_Size length; - const char *str = TclGetStringFromObj(cd->compDictObj, &length); + const char *str = TclGetStringFromObj(chanDataPtr->compDictObj, + &length); Tcl_DStringAppend(dsPtr, str, length); } @@ -3534,12 +3554,12 @@ ZlibTransformGetOption( * reports the header that has been read from the start of the stream. */ - if ((cd->flags & IN_HEADER) && ((optionName == NULL) || + if (HaveFlag(chanDataPtr, IN_HEADER) && ((optionName == NULL) || (strcmp(optionName, "-header") == 0))) { Tcl_Obj *tmpObj; TclNewObj(tmpObj); - ExtractHeader(&cd->inHeader.header, tmpObj); + ExtractHeader(&chanDataPtr->inHeader.header, tmpObj); if (optionName == NULL) { Tcl_DStringAppendElement(dsPtr, "-header"); Tcl_DStringAppendElement(dsPtr, TclGetString(tmpObj)); @@ -3556,19 +3576,19 @@ ZlibTransformGetOption( */ if (getOptionProc) { - return getOptionProc(Tcl_GetChannelInstanceData(cd->parent), + return getOptionProc(Tcl_GetChannelInstanceData(chanDataPtr->parent), interp, optionName, dsPtr); } if (optionName == NULL) { return TCL_OK; } - if (cd->format == TCL_ZLIB_FORMAT_GZIP) { + if (chanDataPtr->format == TCL_ZLIB_FORMAT_GZIP) { return Tcl_BadChannelOption(interp, optionName, - (cd->mode == TCL_ZLIB_STREAM_DEFLATE) + (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) ? gzipChanOptions : gunzipChanOptions); } else { return Tcl_BadChannelOption(interp, optionName, - (cd->mode == TCL_ZLIB_STREAM_DEFLATE) + (chanDataPtr->mode == TCL_ZLIB_STREAM_DEFLATE) ? compressChanOptions : decompressChanOptions); } } @@ -3589,21 +3609,21 @@ ZlibTransformWatch( void *instanceData, int mask) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; Tcl_DriverWatchProc *watchProc; /* * This code is based on the code in tclIORTrans.c */ - watchProc = Tcl_ChannelWatchProc(Tcl_GetChannelType(cd->parent)); - watchProc(Tcl_GetChannelInstanceData(cd->parent), mask); + watchProc = Tcl_ChannelWatchProc(Tcl_GetChannelType(chanDataPtr->parent)); + watchProc(Tcl_GetChannelInstanceData(chanDataPtr->parent), mask); - if (!(mask & TCL_READABLE) || !(cd->flags & STREAM_DECOMPRESS)) { - ZlibTransformEventTimerKill(cd); - } else if (cd->timer == NULL) { - cd->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME, - ZlibTransformTimerRun, cd); + if (!(mask & TCL_READABLE) || !HaveFlag(chanDataPtr, STREAM_DECOMPRESS)) { + ZlibTransformEventTimerKill(chanDataPtr); + } else if (chanDataPtr->timer == NULL) { + chanDataPtr->timer = Tcl_CreateTimerHandler(SYNTHETIC_EVENT_TIME, + ZlibTransformTimerRun, chanDataPtr); } } @@ -3612,19 +3632,19 @@ ZlibTransformEventHandler( void *instanceData, int interestMask) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; - ZlibTransformEventTimerKill(cd); + ZlibTransformEventTimerKill(chanDataPtr); return interestMask; } static inline void ZlibTransformEventTimerKill( - ZlibChannelData *cd) + ZlibChannelData *chanDataPtr) { - if (cd->timer != NULL) { - Tcl_DeleteTimerHandler(cd->timer); - cd->timer = NULL; + if (chanDataPtr->timer != NULL) { + Tcl_DeleteTimerHandler(chanDataPtr->timer); + chanDataPtr->timer = NULL; } } @@ -3632,10 +3652,10 @@ static void ZlibTransformTimerRun( void *clientData) { - ZlibChannelData *cd = (ZlibChannelData *)clientData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) clientData; - cd->timer = NULL; - Tcl_NotifyChannel(cd->chan, TCL_READABLE); + chanDataPtr->timer = NULL; + Tcl_NotifyChannel(chanDataPtr->chan, TCL_READABLE); } /* @@ -3655,9 +3675,9 @@ ZlibTransformGetHandle( int direction, void **handlePtr) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; - return Tcl_GetChannelHandle(cd->parent, direction, handlePtr); + return Tcl_GetChannelHandle(chanDataPtr->parent, direction, handlePtr); } /* @@ -3675,12 +3695,12 @@ ZlibTransformBlockMode( void *instanceData, int mode) { - ZlibChannelData *cd = (ZlibChannelData *)instanceData; + ZlibChannelData *chanDataPtr = (ZlibChannelData *) instanceData; if (mode == TCL_MODE_NONBLOCKING) { - cd->flags |= ASYNC; + chanDataPtr->flags |= ASYNC; } else { - cd->flags &= ~ASYNC; + chanDataPtr->flags &= ~ASYNC; } return TCL_OK; } @@ -3725,7 +3745,8 @@ ZlibStackChannelTransform( * dictionary (not dictObj!) to use if * necessary. */ { - ZlibChannelData *cd = (ZlibChannelData *)Tcl_Alloc(sizeof(ZlibChannelData)); + ZlibChannelData *chanDataPtr = (ZlibChannelData *) + Tcl_Alloc(sizeof(ZlibChannelData)); Tcl_Channel chan; int wbits = 0; @@ -3733,46 +3754,51 @@ ZlibStackChannelTransform( Tcl_Panic("unknown mode: %d", mode); } - memset(cd, 0, sizeof(ZlibChannelData)); - cd->mode = mode; - cd->format = format; - cd->readAheadLimit = limit; + memset(chanDataPtr, 0, sizeof(ZlibChannelData)); + chanDataPtr->mode = mode; + chanDataPtr->format = format; + chanDataPtr->readAheadLimit = limit; if (format == TCL_ZLIB_FORMAT_GZIP || format == TCL_ZLIB_FORMAT_AUTO) { if (mode == TCL_ZLIB_STREAM_DEFLATE) { if (gzipHeaderDictPtr) { - cd->flags |= OUT_HEADER; - if (GenerateHeader(interp, gzipHeaderDictPtr, &cd->outHeader, - NULL) != TCL_OK) { + chanDataPtr->flags |= OUT_HEADER; + if (GenerateHeader(interp, gzipHeaderDictPtr, + &chanDataPtr->outHeader, NULL) != TCL_OK) { goto error; } } } else { - cd->flags |= IN_HEADER; - cd->inHeader.header.name = (Bytef *) - &cd->inHeader.nativeFilenameBuf; - cd->inHeader.header.name_max = MAXPATHLEN - 1; - cd->inHeader.header.comment = (Bytef *) - &cd->inHeader.nativeCommentBuf; - cd->inHeader.header.comm_max = MAX_COMMENT_LEN - 1; + chanDataPtr->flags |= IN_HEADER; + chanDataPtr->inHeader.header.name = (Bytef *) + &chanDataPtr->inHeader.nativeFilenameBuf; + chanDataPtr->inHeader.header.name_max = MAXPATHLEN - 1; + chanDataPtr->inHeader.header.comment = (Bytef *) + &chanDataPtr->inHeader.nativeCommentBuf; + chanDataPtr->inHeader.header.comm_max = MAX_COMMENT_LEN - 1; } } if (compDictObj != NULL) { - cd->compDictObj = Tcl_DuplicateObj(compDictObj); - Tcl_IncrRefCount(cd->compDictObj); - Tcl_GetBytesFromObj(NULL, cd->compDictObj, (Tcl_Size *)NULL); + chanDataPtr->compDictObj = Tcl_DuplicateObj(compDictObj); + Tcl_IncrRefCount(chanDataPtr->compDictObj); + Tcl_GetBytesFromObj(NULL, chanDataPtr->compDictObj, (Tcl_Size *)NULL); } - if (format == TCL_ZLIB_FORMAT_RAW) { + switch (format) { + case TCL_ZLIB_FORMAT_RAW: wbits = WBITS_RAW; - } else if (format == TCL_ZLIB_FORMAT_ZLIB) { + break; + case TCL_ZLIB_FORMAT_ZLIB: wbits = WBITS_ZLIB; - } else if (format == TCL_ZLIB_FORMAT_GZIP) { + break; + case TCL_ZLIB_FORMAT_GZIP: wbits = WBITS_GZIP; - } else if (format == TCL_ZLIB_FORMAT_AUTO) { + break; + case TCL_ZLIB_FORMAT_AUTO: wbits = WBITS_AUTODETECT; - } else { + break; + default: Tcl_Panic("bad format: %d", format); } @@ -3781,66 +3807,72 @@ ZlibStackChannelTransform( */ if (mode == TCL_ZLIB_STREAM_INFLATE) { - if (inflateInit2(&cd->inStream, wbits) != Z_OK) { + if (inflateInit2(&chanDataPtr->inStream, wbits) != Z_OK) { goto error; } - cd->inAllocated = DEFAULT_BUFFER_SIZE; - if (cd->inAllocated < cd->readAheadLimit) { - cd->inAllocated = cd->readAheadLimit; + chanDataPtr->inAllocated = DEFAULT_BUFFER_SIZE; + if (chanDataPtr->inAllocated < chanDataPtr->readAheadLimit) { + chanDataPtr->inAllocated = chanDataPtr->readAheadLimit; } - cd->inBuffer = (char *)Tcl_Alloc(cd->inAllocated); - if (cd->flags & IN_HEADER) { - if (inflateGetHeader(&cd->inStream, &cd->inHeader.header) != Z_OK) { + chanDataPtr->inBuffer = (char *) Tcl_Alloc(chanDataPtr->inAllocated); + if (HaveFlag(chanDataPtr, IN_HEADER)) { + if (inflateGetHeader(&chanDataPtr->inStream, + &chanDataPtr->inHeader.header) != Z_OK) { goto error; } } - if (cd->format == TCL_ZLIB_FORMAT_RAW && cd->compDictObj) { - if (SetInflateDictionary(&cd->inStream, cd->compDictObj) != Z_OK) { + if (chanDataPtr->format == TCL_ZLIB_FORMAT_RAW + && chanDataPtr->compDictObj) { + if (SetInflateDictionary(&chanDataPtr->inStream, + chanDataPtr->compDictObj) != Z_OK) { goto error; } } } else { - if (deflateInit2(&cd->outStream, level, Z_DEFLATED, wbits, + if (deflateInit2(&chanDataPtr->outStream, level, Z_DEFLATED, wbits, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY) != Z_OK) { goto error; } - cd->outAllocated = DEFAULT_BUFFER_SIZE; - cd->outBuffer = (char *)Tcl_Alloc(cd->outAllocated); - if (cd->flags & OUT_HEADER) { - if (deflateSetHeader(&cd->outStream, &cd->outHeader.header) != Z_OK) { + chanDataPtr->outAllocated = DEFAULT_BUFFER_SIZE; + chanDataPtr->outBuffer = (char *) Tcl_Alloc(chanDataPtr->outAllocated); + if (HaveFlag(chanDataPtr, OUT_HEADER)) { + if (deflateSetHeader(&chanDataPtr->outStream, + &chanDataPtr->outHeader.header) != Z_OK) { goto error; } } - if (cd->compDictObj) { - if (SetDeflateDictionary(&cd->outStream, cd->compDictObj) != Z_OK) { + if (chanDataPtr->compDictObj) { + if (SetDeflateDictionary(&chanDataPtr->outStream, + chanDataPtr->compDictObj) != Z_OK) { goto error; } } } - chan = Tcl_StackChannel(interp, &zlibChannelType, cd, + chan = Tcl_StackChannel(interp, &zlibChannelType, chanDataPtr, Tcl_GetChannelMode(channel), channel); if (chan == NULL) { goto error; } - cd->chan = chan; - cd->parent = Tcl_GetStackedChannel(chan); - Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_GetChannelName(chan), -1)); + chanDataPtr->chan = chan; + chanDataPtr->parent = Tcl_GetStackedChannel(chan); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + Tcl_GetChannelName(chan), TCL_AUTO_LENGTH)); return chan; error: - if (cd->inBuffer) { - Tcl_Free(cd->inBuffer); - inflateEnd(&cd->inStream); + if (chanDataPtr->inBuffer) { + Tcl_Free(chanDataPtr->inBuffer); + inflateEnd(&chanDataPtr->inStream); } - if (cd->outBuffer) { - Tcl_Free(cd->outBuffer); - deflateEnd(&cd->outStream); + if (chanDataPtr->outBuffer) { + Tcl_Free(chanDataPtr->outBuffer); + deflateEnd(&chanDataPtr->outStream); } - if (cd->compDictObj) { - Tcl_DecrRefCount(cd->compDictObj); + if (chanDataPtr->compDictObj) { + Tcl_DecrRefCount(chanDataPtr->compDictObj); } - Tcl_Free(cd); + Tcl_Free(chanDataPtr); return NULL; } @@ -3853,18 +3885,19 @@ ZlibStackChannelTransform( * in our buffer (buf) up to toRead bytes. * * Result: - * Number of bytes decompressed or -1 if error (with *errorCodePtr updated with reason). + * Number of bytes decompressed or -1 if error (with *errorCodePtr updated + * with reason). * * Side effects: - * After execution it updates cd->inStream (next_in, avail_in) to reflect - * the data that has been decompressed. + * After execution it updates chanDataPtr->inStream (next_in, avail_in) to + * reflect the data that has been decompressed. * *---------------------------------------------------------------------- */ static int ResultDecompress( - ZlibChannelData *cd, + ZlibChannelData *chanDataPtr, char *buf, int toRead, int flush, @@ -3873,20 +3906,25 @@ ResultDecompress( int e, written, resBytes = 0; Tcl_Obj *errObj; + chanDataPtr->flags &= ~STREAM_DECOMPRESS; + chanDataPtr->inStream.next_out = (Bytef *) buf; + chanDataPtr->inStream.avail_out = toRead; + while (chanDataPtr->inStream.avail_out > 0) { + e = inflate(&chanDataPtr->inStream, flush); - cd->flags &= ~STREAM_DECOMPRESS; - cd->inStream.next_out = (Bytef *) buf; - cd->inStream.avail_out = toRead; - while (cd->inStream.avail_out > 0) { + /* + * Apply a compression dictionary if one is needed and we have one. + */ - e = inflate(&cd->inStream, flush); - if (e == Z_NEED_DICT && cd->compDictObj) { - e = SetInflateDictionary(&cd->inStream, cd->compDictObj); + if (e == Z_NEED_DICT && chanDataPtr->compDictObj) { + e = SetInflateDictionary(&chanDataPtr->inStream, + chanDataPtr->compDictObj); if (e == Z_OK) { /* - * A repetition of Z_NEED_DICT is just an error. + * A repetition of Z_NEED_DICT now is just an error. */ - e = inflate(&cd->inStream, flush); + + e = inflate(&chanDataPtr->inStream, flush); } } @@ -3895,14 +3933,14 @@ ResultDecompress( * "toRead - avail_out" is the amount of bytes generated. */ - written = toRead - cd->inStream.avail_out; + written = toRead - chanDataPtr->inStream.avail_out; /* * The cases where we're definitely done. */ if (e == Z_STREAM_END) { - cd->flags |= STREAM_DONE; + chanDataPtr->flags |= STREAM_DONE; resBytes += written; break; } @@ -3934,16 +3972,17 @@ ResultDecompress( * Check if the inflate stopped early. */ - if (cd->inStream.avail_in <= 0 && flush != Z_SYNC_FLUSH) { + if (chanDataPtr->inStream.avail_in <= 0 && flush != Z_SYNC_FLUSH) { break; } } - if (!(cd->flags & STREAM_DONE)) { + if (!HaveFlag(chanDataPtr, STREAM_DONE)) { /* if we have pending input data, but no available output buffer */ - if (cd->inStream.avail_in && !cd->inStream.avail_out) { + if (chanDataPtr->inStream.avail_in + && !chanDataPtr->inStream.avail_out) { /* next time try to decompress it got readable (new output buffer) */ - cd->flags |= STREAM_DECOMPRESS; + chanDataPtr->flags |= STREAM_DECOMPRESS; } } @@ -3951,12 +3990,13 @@ ResultDecompress( handleError: errObj = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(NULL, errObj, Tcl_NewStringObj("-errorcode",-1)); + Tcl_ListObjAppendElement(NULL, errObj, Tcl_NewStringObj( + "-errorcode", TCL_AUTO_LENGTH)); Tcl_ListObjAppendElement(NULL, errObj, - ConvertErrorToList(e, cd->inStream.adler)); + ConvertErrorToList(e, chanDataPtr->inStream.adler)); Tcl_ListObjAppendElement(NULL, errObj, - Tcl_NewStringObj(cd->inStream.msg, -1)); - Tcl_SetChannelError(cd->parent, errObj); + Tcl_NewStringObj(chanDataPtr->inStream.msg, TCL_AUTO_LENGTH)); + Tcl_SetChannelError(chanDataPtr->parent, errObj); *errorCodePtr = EINVAL; return -1; } @@ -3979,7 +4019,8 @@ TclZlibInit( * commands. */ - Tcl_EvalEx(interp, "namespace eval ::tcl::zlib {variable cmdcounter 0}", TCL_INDEX_NONE, 0); + Tcl_EvalEx(interp, "namespace eval ::tcl::zlib {variable cmdcounter 0}", + TCL_AUTO_LENGTH, 0); /* * Create the public scripted interface to this file's functionality. @@ -4030,7 +4071,8 @@ Tcl_ZlibStreamInit( Tcl_ZlibStream *zshandle) { if (interp) { - Tcl_SetObjResult(interp, Tcl_NewStringObj("unimplemented", -1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "unimplemented", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "UNIMPLEMENTED", (char *)NULL); } return TCL_ERROR; @@ -4098,7 +4140,8 @@ Tcl_ZlibDeflate( Tcl_Obj *gzipHeaderDictObj) { if (interp) { - Tcl_SetObjResult(interp, Tcl_NewStringObj("unimplemented", -1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "unimplemented", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "UNIMPLEMENTED", (char *)NULL); } return TCL_ERROR; @@ -4113,7 +4156,8 @@ Tcl_ZlibInflate( Tcl_Obj *gzipHeaderDictObj) { if (interp) { - Tcl_SetObjResult(interp, Tcl_NewStringObj("unimplemented", -1)); + Tcl_SetObjResult(interp, Tcl_NewStringObj( + "unimplemented", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "UNIMPLEMENTED", (char *)NULL); } return TCL_ERROR; |