summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jim.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/jim.c b/src/jim.c
index e9eb5882..88893b0d 100644
--- a/src/jim.c
+++ b/src/jim.c
@@ -2180,6 +2180,10 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
int spad;
int altfm;
int forceplus;
+ int prec;
+ int inprec;
+ int haveprec;
+ int accum;
while (*fmt != '%' && fmtLen) {
fmt++; fmtLen--;
@@ -2194,6 +2198,9 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
ljust = 0;
altfm = 0;
forceplus = 0;
+ inprec = 0;
+ haveprec = 0;
+ prec = -1; /* not found yet */
next_fmt:
if( fmtLen <= 0 ){
break;
@@ -2237,7 +2244,12 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
altfm = 1;
*fmt++; fmtLen--;
goto next_fmt;
-
+
+ case '.':
+ inprec = 1;
+ *fmt++; fmtLen--;
+ goto next_fmt;
+ break;
case '1':
case '2':
case '3':
@@ -2247,11 +2259,17 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
case '7':
case '8':
case '9':
- width = 0;
+ accum = 0;
while( isdigit(*fmt) && (fmtLen > 0) ){
- width = (width * 10) + (*fmt - '0');
+ accum = (accum * 10) + (*fmt - '0');
fmt++; fmtLen--;
}
+ if( inprec ){
+ haveprec = 1;
+ prec = accum;
+ } else {
+ width = accum;
+ }
goto next_fmt;
case '*':
/* suck up the next item as an integer */
@@ -2264,10 +2282,20 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
Jim_FreeNewObj(interp, resObjPtr );
return NULL;
}
- width = wideValue;
- if( width < 0 ){
- ljust = 1;
- width = -width;
+ if( inprec ){
+ haveprec = 1;
+ prec = wideValue;
+ if( prec < 0 ){
+ /* man 3 printf says */
+ /* if prec is negative, it is zero */
+ prec = 0;
+ }
+ } else {
+ width = wideValue;
+ if( width < 0 ){
+ ljust = 1;
+ width = -width;
+ }
}
objv++;
goto next_fmt;
@@ -2313,6 +2341,16 @@ Jim_Obj *Jim_FormatString(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
/* skip ahead */
cp = strchr(cp,0);
}
+ /* did we find a period? */
+ if( inprec ){
+ /* then add it */
+ *cp++ = '.';
+ /* did something occur after the period? */
+ if( haveprec ){
+ sprintf( cp, "%d", prec );
+ }
+ cp = strchr(cp,0);
+ }
*cp = 0;
/* here we do the work */