Posted to tcl by apn at Mon Mar 20 06:06:36 GMT 2023view pretty
The sample below builds with 8.7 and 9.0 with no warnings. However it does not make full functionality of 9.0 as len is 32-bits.
int
Sandbox_Cmd(
ClientData dummy, /* Not used. */
Tcl_Interp *interp, /* Current interpreter */
int objc, /* Number of arguments */
Tcl_Obj *const objv[] /* Argument strings */
)
{
int len;
Tcl_Obj *parts;
parts = Tcl_FSSplitPath(objv[1], &len);
Tcl_DecrRefCount(parts); /* Assume non-null */
Tcl_SetObjResult(interp, Tcl_NewWideIntObj(len));
return TCL_OK;
}
To make full 64-bit support on 9.0, the len variable type needs to be size_t.
int
Sandbox_Cmd(
ClientData dummy, /* Not used. */
Tcl_Interp *interp, /* Current interpreter */
int objc, /* Number of arguments */
Tcl_Obj *const objv[] /* Argument strings */
)
{
size_t len;
Tcl_Obj *parts;
parts = Tcl_FSSplitPath(objv[1], &len);
Tcl_DecrRefCount(parts); /* Assume non-null */
Tcl_SetObjResult(interp, Tcl_NewWideIntObj(len));
return TCL_OK;
}
This now however results in compiler warnings with 8.7.
D:\src\sampleextension\win\..\generic\tclsample.c(343): warning C4133: 'function': incompatible types - from 'size_t *' to 'int *'
Moreover, if the warning is ignored, the function will fail miserably on bigendian machines.