From 55d1ff8e1bf3e60f9925b446f4b2d55e8d9c5b6d Mon Sep 17 00:00:00 2001 From: oharboe Date: Sun, 16 Aug 2009 11:31:42 +0000 Subject: 2009-08-16 Steve Bennett * jim.c: Make [format %c 0] work (embedded nulls) --- ChangeLog | 1 + jim.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb5b039..d9d7b4c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2009-08-16 Steve Bennett + * jim.c: Make [format %c 0] work (embedded nulls) * jim-array-1.0.tcl: array unset was broken * jim.c: Some recursion in unknown is OK, just not infinite recursion. * jimsh.c: $argv0 should be the name of the script 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++; -- cgit v1.1