aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authoroharboe <oharboe>2009-08-16 11:31:42 +0000
committeroharboe <oharboe>2009-08-16 11:31:42 +0000
commit55d1ff8e1bf3e60f9925b446f4b2d55e8d9c5b6d (patch)
tree372b53dbe7a687a466f0f551b80bcdc6b794aaff /jim.c
parent5ca83d9686ee78b5132da878838effefab5da7b7 (diff)
downloadjimtcl-55d1ff8e1bf3e60f9925b446f4b2d55e8d9c5b6d.zip
jimtcl-55d1ff8e1bf3e60f9925b446f4b2d55e8d9c5b6d.tar.gz
jimtcl-55d1ff8e1bf3e60f9925b446f4b2d55e8d9c5b6d.tar.bz2
2009-08-16 Steve Bennett <steveb@workware.net.au>
* jim.c: Make [format %c 0] work (embedded nulls)
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/jim.c b/jim.c
index 06db29f..4708054 100644
--- a/jim.c
+++ b/jim.c
@@ -2261,6 +2261,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--;
@@ -2437,7 +2438,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';
@@ -2447,7 +2448,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':
@@ -2461,7 +2462,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, doubleValue );
+ buflen = snprintf( sprintf_buf, JIM_MAX_FMT, fmt_str, doubleValue );
break;
case 'b':
case 'd':
@@ -2483,7 +2484,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] = '%';
@@ -2504,8 +2505,7 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
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++;