From f58277f53dca019e60b070d87bed3bb620e7a08e Mon Sep 17 00:00:00 2001 From: Ruslan Kabatsayev Date: Sat, 30 Jun 2018 18:34:24 +0300 Subject: [PATCH] Implement %g format for printf --- config.c | 1 + file.c | 3 +++ qio.c | 21 +++++++++++++++++++++ zmath.h | 3 ++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/config.c b/config.c index 303f5ce..3ff0969 100644 --- a/config.c +++ b/config.c @@ -274,6 +274,7 @@ STATIC NAMETYPE modes[] = { {"oct", MODE_OCTAL}, {"binary", MODE_BINARY}, {"bin", MODE_BINARY}, + {"float-auto", MODE_REAL_AUTO}, {"off", MODE2_OFF}, {NULL, 0} }; diff --git a/file.c b/file.c index 8bc73bf..c8fd776 100644 --- a/file.c +++ b/file.c @@ -1027,6 +1027,9 @@ idprintf(FILEID id, char *fmt, int count, VALUE **vals) case 'e': newmode = MODE_EXP; break; + case 'g': + newmode = MODE_REAL_AUTO; + break; case 'r': newmode = MODE_FRAC; break; diff --git a/qio.c b/qio.c index 452aa58..5884f0f 100644 --- a/qio.c +++ b/qio.c @@ -233,6 +233,27 @@ qprintnum(NUMBER *q, int outmode) PRINTF1("e%ld", exp); break; + case MODE_REAL_AUTO: + { + const int P = conf->outdigits ? conf->outdigits : 1; + tmpval = *q; + tmpval.num.sign = 0; + exp = qilog10(&tmpval); + const long olddigits = conf->outdigits; + if(P > exp && exp >= -4) + { + conf->outdigits = P - 1 - exp; + qprintnum(q, MODE_REAL); + } + else + { + conf->outdigits = P - 1; + qprintnum(q, MODE_EXP); + } + conf->outdigits = olddigits; + break; + } + case MODE_HEX: qprintfx(q, 0L); break; diff --git a/zmath.h b/zmath.h index 989087c..76c1212 100644 --- a/zmath.h +++ b/zmath.h @@ -579,7 +579,8 @@ E_FUNC void zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res); #define MODE_HEX 5 #define MODE_OCTAL 6 #define MODE_BINARY 7 -#define MODE_MAX 7 +#define MODE_REAL_AUTO 8 +#define MODE_MAX 8 #define MODE2_OFF (MODE_MAX+1) #define MODE_INITIAL MODE_REAL