summaryrefslogtreecommitdiffstats
path: root/generic/tclZlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclZlib.c')
-rw-r--r--generic/tclZlib.c88
1 files changed, 38 insertions, 50 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c
index 595ddf4..ff360d6 100644
--- a/generic/tclZlib.c
+++ b/generic/tclZlib.c
@@ -228,6 +228,26 @@ static const Tcl_ChannelType zlibChannelType = {
/*
*----------------------------------------------------------------------
*
+ * Latin1 --
+ * Helper to definitely get the ISO 8859-1 encoding. It's internally
+ * defined by Tcl so this operation should always succeed.
+ *
+ *----------------------------------------------------------------------
+ */
+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;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
* ConvertError --
*
* Utility function for converting a zlib error into a Tcl error.
@@ -388,7 +408,7 @@ ConvertErrorToList(
* GenerateHeader --
*
* Function for creating a gzip header from the contents of a dictionary
- * (as described in the documentation). GetValue is a helper function.
+ * (as described in the documentation).
*
* Results:
* A Tcl result code.
@@ -401,33 +421,6 @@ ConvertErrorToList(
*----------------------------------------------------------------------
*/
-static inline int
-GetValue(
- Tcl_Interp *interp,
- Tcl_Obj *dictObj,
- const char *nameStr,
- Tcl_Obj **valuePtrPtr)
-{
- 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. */
@@ -447,7 +440,7 @@ GenerateHeader(
"binary", "text"
};
- if (GetValue(interp, dictObj, "comment", &value) != TCL_OK) {
+ if (TclDictGet(interp, dictObj, "comment", &value) != TCL_OK) {
goto error;
} else if (value != NULL) {
Tcl_EncodingState state;
@@ -476,14 +469,14 @@ GenerateHeader(
}
}
- if (GetValue(interp, dictObj, "crc", &value) != TCL_OK) {
+ if (TclDictGet(interp, dictObj, "crc", &value) != TCL_OK) {
goto error;
} else if (value != NULL &&
Tcl_GetBooleanFromObj(interp, value, &headerPtr->header.hcrc)) {
goto error;
}
- if (GetValue(interp, dictObj, "filename", &value) != TCL_OK) {
+ if (TclDictGet(interp, dictObj, "filename", &value) != TCL_OK) {
goto error;
} else if (value != NULL) {
Tcl_EncodingState state;
@@ -512,7 +505,7 @@ GenerateHeader(
}
}
- if (GetValue(interp, dictObj, "os", &value) != TCL_OK) {
+ if (TclDictGet(interp, dictObj, "os", &value) != TCL_OK) {
goto error;
} else if (value != NULL && Tcl_GetIntFromObj(interp, value,
&headerPtr->header.os) != TCL_OK) {
@@ -524,7 +517,7 @@ GenerateHeader(
* input data.
*/
- if (GetValue(interp, dictObj, "time", &value) != TCL_OK) {
+ if (TclDictGet(interp, dictObj, "time", &value) != TCL_OK) {
goto error;
} else if (value != NULL && TclGetWideIntFromObj(interp, value,
&wideValue) != TCL_OK) {
@@ -532,7 +525,7 @@ GenerateHeader(
}
headerPtr->header.time = wideValue;
- if (GetValue(interp, dictObj, "type", &value) != TCL_OK) {
+ if (TclDictGet(interp, dictObj, "type", &value) != TCL_OK) {
goto error;
} else if (value != NULL && Tcl_GetIndexFromObj(interp, value, types,
"type", TCL_EXACT, &headerPtr->header.text) != TCL_OK) {
@@ -551,7 +544,6 @@ GenerateHeader(
* ExtractHeader --
*
* Take the values out of a gzip header and store them in a dictionary.
- * SetValue is a helper macro.
*
* Results:
* None.
@@ -562,28 +554,24 @@ GenerateHeader(
*----------------------------------------------------------------------
*/
-#define SetValue(dictObj, key, value) \
- Tcl_DictObjPut(NULL, (dictObj), Tcl_NewStringObj( \
- (key), TCL_AUTO_LENGTH), (value))
-
static void
ExtractHeader(
gz_header *headerPtr, /* The gzip header to extract from. */
Tcl_Obj *dictObj) /* The dictionary to store in. */
{
Tcl_Encoding latin1enc = NULL;
+ /* RFC 1952 says that header strings are in
+ * ISO 8859-1 (LATIN-1). */
Tcl_DString tmp;
if (headerPtr->comment != Z_NULL) {
- if (latin1enc == NULL) {
- latin1enc = Latin1();
- }
+ latin1enc = Latin1();
(void) Tcl_ExternalToUtfDString(latin1enc, (char *) headerPtr->comment,
TCL_AUTO_LENGTH, &tmp);
- SetValue(dictObj, "comment", Tcl_DStringToObj(&tmp));
+ TclDictPut(NULL, dictObj, "comment", Tcl_DStringToObj(&tmp));
}
- SetValue(dictObj, "crc", Tcl_NewBooleanObj(headerPtr->hcrc));
+ TclDictPut(NULL, dictObj, "crc", Tcl_NewBooleanObj(headerPtr->hcrc));
if (headerPtr->name != Z_NULL) {
if (latin1enc == NULL) {
latin1enc = Latin1();
@@ -591,17 +579,17 @@ ExtractHeader(
(void) Tcl_ExternalToUtfDString(latin1enc, (char *) headerPtr->name,
TCL_AUTO_LENGTH, &tmp);
- SetValue(dictObj, "filename", Tcl_DStringToObj(&tmp));
+ TclDictPut(NULL, dictObj, "filename", Tcl_DStringToObj(&tmp));
}
if (headerPtr->os != 255) {
- SetValue(dictObj, "os", Tcl_NewWideIntObj(headerPtr->os));
+ TclDictPut(NULL, dictObj, "os", Tcl_NewWideIntObj(headerPtr->os));
}
if (headerPtr->time != 0 /* magic - no time */) {
- SetValue(dictObj, "time", Tcl_NewWideIntObj(headerPtr->time));
+ TclDictPut(NULL, dictObj, "time", Tcl_NewWideIntObj(headerPtr->time));
}
if (headerPtr->text != Z_UNKNOWN) {
- SetValue(dictObj, "type", Tcl_NewStringObj(
- headerPtr->text ? "text" : "binary", TCL_AUTO_LENGTH));
+ TclDictPutString(NULL, dictObj, "type",
+ headerPtr->text ? "text" : "binary");
}
if (latin1enc != NULL) {
@@ -1917,7 +1905,7 @@ Tcl_ZlibInflate(
Tcl_SetByteArrayLength(obj, stream.total_out);
if (headerPtr != NULL) {
ExtractHeader(&header, gzipHeaderDictObj);
- SetValue(gzipHeaderDictObj, "size",
+ TclDictPut(NULL, gzipHeaderDictObj, "size",
Tcl_NewWideIntObj(stream.total_out));
Tcl_Free(nameBuf);
Tcl_Free(commentBuf);