summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroehhar <harald.oehlmann@elmicron.de>2022-03-14 15:46:35 (GMT)
committeroehhar <harald.oehlmann@elmicron.de>2022-03-14 15:46:35 (GMT)
commit9fdb32b8e254da15698c28d65e281ee946a57eb5 (patch)
tree451e1a9b21a8de668f65395a68d937a2970ea581
parent6ec7e10a1634a0a9c10ed2cf90072ba723d701ce (diff)
downloadtcl-tip601-encoding-failindex.zip
tcl-tip601-encoding-failindex.tar.gz
tcl-tip601-encoding-failindex.tar.bz2
TIP607 encoding failindex: start implementationtip601-encoding-failindex
-rw-r--r--generic/tclCmdAH.c66
1 files changed, 48 insertions, 18 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c
index 60a2c42..96bac4e 100644
--- a/generic/tclCmdAH.c
+++ b/generic/tclCmdAH.c
@@ -556,28 +556,59 @@ EncodingConvertfromObjCmd(
int flags = TCL_ENCODING_NOCOMPLAIN;
#endif
size_t result;
+ Tcl_Obj *failVarObj = NULL;
+ int i, encodingSeen = 0;
+ /*
+ * Decode parameters:
+ * Possible combinations:
+ * 1) data -> objc = 2
+ * 2) encoding data -> objc = 3
+ * 3) -nocomplain data -> objc = 3 (8.7)
+ * 4) -nocomplain encoding data -> objc = 4 (8.7)
+ * 5) -failindex val data -> objc = 4
+ * 6) -failindex val encoding data -> objc = 5
+ * 7a) -nocomplain -failindex val data -> objc = 5
+ * 7b) -failindex val -nocomplain data -> objc = 5
+ * 8a) -nocomplain -failindex val encoding data -> objc = 6
+ * 8b) -failindex val -nocomplain encoding data -> objc = 6
+ */
- if (objc == 2) {
- encoding = Tcl_GetEncoding(interp, NULL);
- data = objv[1];
- } else if ((unsigned)(objc - 2) < 3) {
+ if (objc > 1 && objc < 7) {
+ int noComplaintSeen = 0;
+ int encodingSeen = 0;
data = objv[objc - 1];
- bytesPtr = Tcl_GetString(objv[1]);
- if (bytesPtr[0] == '-' && bytesPtr[1] == 'n'
- && !strncmp(bytesPtr, "-nocomplain", strlen(bytesPtr))) {
- flags = TCL_ENCODING_NOCOMPLAIN;
- } else if (objc < 4) {
- if (Tcl_GetEncodingFromObj(interp, objv[objc - 2], &encoding) != TCL_OK) {
- return TCL_ERROR;
+ for(i = 1; i < objc-1 ; i++ ) {
+ bytesPtr = Tcl_GetString(objv[i]);
+ if (bytesPtr[0] == '-' && bytesPtr[1] == 'n'
+ && !strncmp(bytesPtr, "-nocomplain", strlen(bytesPtr))) {
+ if (noComplaintSeen) {
+ goto encConvFromError;
+ }
+ flags = TCL_ENCODING_NOCOMPLAIN;
+ noComplaintSeen = 1;
+ } else if (bytesPtr[0] == '-' && bytesPtr[1] == 'f'
+ && !strncmp(bytesPtr, "-failindex", strlen(bytesPtr))) {
+ /* at least two additional arguments needed */
+ if (objc < i + 3) {
+ goto encConvFromError;
+ }
+ if (failVarObj != NULL) {
+ goto encConvFromError;
+ }
+ i++;
+ failVarObj = objv[i];
+ flags = TCL_ENCODING_NOCOMPLAIN;
+ } else if (i == objc - 2) {
+ if (Tcl_GetEncodingFromObj(interp, objv[i], &encoding) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ encodingSeen = 1;
+ } else {
+ goto encConvFromError;
}
- goto encConvFromOK;
- } else {
- goto encConvFromError;
}
- if (objc < 4) {
+ if (!encodingSeen) {
encoding = Tcl_GetEncoding(interp, NULL);
- } else if (Tcl_GetEncodingFromObj(interp, objv[objc - 2], &encoding) != TCL_OK) {
- return TCL_ERROR;
}
} else {
encConvFromError:
@@ -585,7 +616,6 @@ EncodingConvertfromObjCmd(
return TCL_ERROR;
}
-encConvFromOK:
/*
* Convert the string into a byte array in 'ds'
*/