From cfba2f4a79d6914f7baa6986684b1143c0744a44 Mon Sep 17 00:00:00 2001
From: oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Mon, 7 Jul 2008 18:57:27 +0000
Subject: [PATCH] Duane Ellis <openocd@duaneellis.com>: This simple patch adds
 precision support to JIM's format command.

git-svn-id: svn://svn.berlios.de/openocd/trunk@767 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/jim.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 45 insertions(+), 7 deletions(-)

diff --git a/src/jim.c b/src/jim.c
index e9eb58822..88893b0da 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 */
-- 
GitLab