Implement %g format for printf

This commit is contained in:
Ruslan Kabatsayev
2018-06-30 18:34:24 +03:00
parent e555a718c0
commit f58277f53d
4 changed files with 27 additions and 1 deletions

View File

@@ -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}
};

3
file.c
View File

@@ -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;

21
qio.c
View File

@@ -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;

View File

@@ -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