Hello,
I found another bug in owtcl.
Tcl does UTF mangling on the result of Tcl_GetStringFromObj. This is
very disturbing for the value of a "put" operation as there is no way to
output binary data to owfs as it is possible with owfs/fuse itself (and
the other language bindings, I guess).
As far as I see there is no use case for such a mangling. The onewire
devices expect mostly numbers or binary data, the only device expecting
text is the LCD, and this is *not* UTF but another encoding.
Comments welcome.
Index: module/owtcl/ow.c
===================================================================
RCS file: /cvsroot/owfs/owfs/module/owtcl/ow.c,v
retrieving revision 1.5
diff -u -r1.5 ow.c
--- module/owtcl/ow.c 23 Sep 2010 03:17:16 -0000 1.5
+++ module/owtcl/ow.c 23 Jun 2013 20:38:12 -0000
@@ -259,8 +259,9 @@
owtcl_ObjCmdProc(Owtcl_Put)
{
OwtclStateType *OwtclStatePtr = (OwtclStateType *) clientData;
- char *path, *value;
- int path_len, value_len, r;
+ char *path, *value=NULL;
+ Tcl_UniChar *uvalue;
+ int path_len, value_len, r, v;
int tcl_return = TCL_OK;
owtcl_ArgObjIncr;
@@ -270,11 +271,19 @@
tcl_return = TCL_ERROR;
goto common_exit;
}
- if (objc == 3)
- value = Tcl_GetStringFromObj(objv[2], &value_len);
+ if (objc == 3) {
+ uvalue = Tcl_GetUnicodeFromObj(objv[2], &value_len);
+ value = malloc(value_len);
+ if (value != NULL)
+ for (v=0 ; v < value_len ; v++)
+ value[v]=(char)uvalue[v];
+ }
else {
- value = "\n";
- value_len = 1;
+ value=malloc(1);
+ if (value != NULL) {
+ value[0] = '\n';
+ value_len = 1;
+ }
}
/* Check we are connected to onewire host(s). */
@@ -293,6 +302,7 @@
}
common_exit:
+ free(value);
owtcl_ArgObjDecr;
return tcl_return;
}
Kind regards
Jan
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Owfs-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/owfs-developers