X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjim.c;h=be53233c16524a10ec9af069e4fc3027d8fbcbcb;hp=4cf4f3dea6abb88dad406756cacdd0d9533d7dfa;hb=a65255a06d7252614f0061823860568f4aefe1b7;hpb=dc796a209113c3fdc27de0211edcaa67faed7b5f diff --git a/src/jim.c b/src/jim.c index 4cf4f3dea6..be53233c16 100644 --- a/src/jim.c +++ b/src/jim.c @@ -38,6 +38,8 @@ #include #include +#include "replacements.h" + /* Include the platform dependent libraries for * dynamic loading of libraries. */ #ifdef JIM_DYNLIB @@ -45,7 +47,9 @@ #ifndef WIN32 #define WIN32 1 #endif +#ifndef STRICT #define STRICT +#endif #define WIN32_LEAN_AND_MEAN #include #if _MSC_VER >= 1000 @@ -2176,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--; @@ -2190,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; @@ -2233,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': @@ -2243,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 */ @@ -2260,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; @@ -2309,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 */ @@ -8203,10 +8245,10 @@ int Jim_EvalObjVector(Jim_Interp *interp, int objc, Jim_Obj *const *objv) retcode = cmdPtr->cmdProc(interp, objc, objv); } else { retcode = JimCallProcedure(interp, cmdPtr, objc, objv); - if (retcode == JIM_ERR) { - JimAppendStackTrace(interp, - Jim_GetString(objv[0], NULL), "?", 1); - } + if (retcode == JIM_ERR) { + JimAppendStackTrace(interp, + Jim_GetString(objv[0], NULL), "?", 1); + } } } /* Decr refcount of arguments and return the retcode */ @@ -8498,6 +8540,11 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr) } else { /* Call [unknown] */ retcode = JimUnknown(interp, argc, argv); + if (retcode == JIM_ERR) { + JimAppendStackTrace(interp, + Jim_GetString(argv[0], NULL), script->fileName, + token[i-argc*2].linenr); + } } if (retcode != JIM_OK) { i -= argc*2; /* point to the command name. */ @@ -9991,7 +10038,10 @@ static int Jim_IfCoreCommand(Jim_Interp *interp, int argc, if (boolean) return Jim_EvalObj(interp, argv[current]); /* Ok: no else-clause follows */ - if (++current >= argc) return JIM_OK; + if (++current >= argc) { + Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); + return JIM_OK; + } falsebody = current++; if (Jim_CompareStringImmediate(interp, argv[falsebody], "else")) { @@ -12027,8 +12077,7 @@ out: * Jim's idea of STDIO.. * ---------------------------------------------------------------------------*/ -int -Jim_fprintf( Jim_Interp *interp, void *cookie, const char *fmt, ... ) +int Jim_fprintf( Jim_Interp *interp, void *cookie, const char *fmt, ... ) { int r; @@ -12038,10 +12087,8 @@ Jim_fprintf( Jim_Interp *interp, void *cookie, const char *fmt, ... ) va_end(ap); return r; } - -int -Jim_vfprintf( Jim_Interp *interp, void *cookie, const char *fmt, va_list ap ) +int Jim_vfprintf( Jim_Interp *interp, void *cookie, const char *fmt, va_list ap ) { if( (interp == NULL) || (interp->cb_vfprintf == NULL) ){ errno = ENOTSUP; @@ -12050,8 +12097,7 @@ Jim_vfprintf( Jim_Interp *interp, void *cookie, const char *fmt, va_list ap ) return (*(interp->cb_vfprintf))( cookie, fmt, ap ); } -size_t -Jim_fwrite( Jim_Interp *interp, const void *ptr, size_t size, size_t n, void *cookie ) +size_t Jim_fwrite( Jim_Interp *interp, const void *ptr, size_t size, size_t n, void *cookie ) { if( (interp == NULL) || (interp->cb_fwrite == NULL) ){ errno = ENOTSUP; @@ -12060,8 +12106,7 @@ Jim_fwrite( Jim_Interp *interp, const void *ptr, size_t size, size_t n, void *co return (*(interp->cb_fwrite))( ptr, size, n, cookie); } -size_t -Jim_fread( Jim_Interp *interp, void *ptr, size_t size, size_t n, void *cookie ) +size_t Jim_fread( Jim_Interp *interp, void *ptr, size_t size, size_t n, void *cookie ) { if( (interp == NULL) || (interp->cb_fread == NULL) ){ errno = ENOTSUP; @@ -12070,8 +12115,7 @@ Jim_fread( Jim_Interp *interp, void *ptr, size_t size, size_t n, void *cookie ) return (*(interp->cb_fread))( ptr, size, n, cookie); } -int -Jim_fflush( Jim_Interp *interp, void *cookie ) +int Jim_fflush( Jim_Interp *interp, void *cookie ) { if( (interp == NULL) || (interp->cb_fflush == NULL) ){ /* pretend all is well */ @@ -12080,8 +12124,7 @@ Jim_fflush( Jim_Interp *interp, void *cookie ) return (*(interp->cb_fflush))( cookie ); } -char * -Jim_fgets( Jim_Interp *interp, char *s, int size, void *cookie ) +char* Jim_fgets( Jim_Interp *interp, char *s, int size, void *cookie ) { if( (interp == NULL) || (interp->cb_fgets == NULL) ){ errno = ENOTSUP; @@ -12089,16 +12132,3 @@ Jim_fgets( Jim_Interp *interp, char *s, int size, void *cookie ) } return (*(interp->cb_fgets))( s, size, cookie ); } - - - - - - -/* - * Local Variables: ** - * tab-width: 4 ** - * c-basic-offset: 4 ** - * End: ** - */ -