aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authoroharboe <oharboe>2009-08-16 11:31:42 +0000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:00:36 +1000
commit967a750049569029258f3e792b52ebf86b56ae4e (patch)
treecd871eaa0177a3abf9e3a01b497bcfcb0acd547a /jim.c
parentdcf49cf4b785ba585711ecbd3b0f1e97b80e733b (diff)
downloadjimtcl-967a750049569029258f3e792b52ebf86b56ae4e.zip
jimtcl-967a750049569029258f3e792b52ebf86b56ae4e.tar.gz
jimtcl-967a750049569029258f3e792b52ebf86b56ae4e.tar.bz2
Make [format %c 0] work (embedded nulls)
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/jim.c b/jim.c
index 809ac1b..03ed0ec 100644
--- a/jim.c
+++ b/jim.c
@@ -2286,6 +2286,7 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
int inprec;
int haveprec;
int accum;
+ int buflen = 0;
while (*fmt != '%' && fmtLen) {
fmt++; fmtLen--;
@@ -2461,7 +2462,7 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
*cp++ = 's';
*cp = 0;
/* BUG: we do not handled embeded NULLs */
- snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, Jim_GetString( objv[0], NULL ));
+ buflen = snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, Jim_GetString( objv[0], NULL ));
break;
case 'c':
*cp++ = 'c';
@@ -2471,7 +2472,7 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
return NULL;
}
c = (char) wideValue;
- snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, c );
+ buflen = snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, c );
break;
case 'f':
case 'F':
@@ -2485,8 +2486,8 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
Jim_FreeNewObj( interp, resObjPtr );
return NULL;
}
+ buflen = snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, doubleValue );
snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, doubleValue );
- break;
case 'b':
case 'd':
case 'o':
@@ -2507,7 +2508,7 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
Jim_FreeNewObj(interp, resObjPtr);
return NULL;
}
- snprintf(sprintf_buf, JIM_MAX_FMT, fmt_str, wideValue );
+ buflen = snprintf(sprintf_buf, JIM_MAX_FMT, fmt_str, wideValue );
break;
case '%':
sprintf_buf[0] = '%';
@@ -2527,9 +2528,8 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
printf("FMT was: %s\n", fmt_str );
printf("RES was: |%s|\n", sprintf_buf );
#endif
-
- sprintf_buf[ JIM_MAX_FMT - 1] = 0;
- Jim_AppendString( interp, resObjPtr, sprintf_buf, strlen(sprintf_buf) );
+
+ Jim_AppendString( interp, resObjPtr, sprintf_buf, buflen <= JIM_MAX_FMT ? buflen : JIM_MAX_FMT);
/* next obj */
objv++;
fmt++;