diff options
author | Kevin Ryde <user42@zip.com.au> | 2001-08-17 00:41:17 +0200 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2001-08-17 00:41:17 +0200 |
commit | 20d6e4f1b99dcbc98c908daf0f550b141848ccd1 (patch) | |
tree | 433f74d95f13587ca3ee909cc0b55b62d3f14fd6 /printf | |
parent | 78ab2e0185bd2bff32abc5d25173363368e6aacc (diff) | |
download | gmp-20d6e4f1b99dcbc98c908daf0f550b141848ccd1.tar.gz |
* printf/doprnt.c, printf/doprntf.c, gmp-impl.h: Use a single
__gmp_doprnt_mpf, rather than a separate ndigits calculation.
* printf/doprnt.c, printf/doprntf.c, gmp-impl.h, gmp.texi,
tests/printf/t-printf.c: Let empty or -1 prec mean all digits for mpf.
* printf/doprnt.c, tests/printf/t-printf.c: Accept h or l in %n; let
negative "*" style width mean left justify.
Diffstat (limited to 'printf')
-rw-r--r-- | printf/doprnt.c | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/printf/doprnt.c b/printf/doprnt.c index 8575cb663..739aad30d 100644 --- a/printf/doprnt.c +++ b/printf/doprnt.c @@ -252,12 +252,10 @@ __gmp_doprnt (const struct doprnt_funs_t *funs, void *data, break; case 'Q': { - mpq_srcptr q; - int ret; - char *s; + int ret; + char *s; FLUSH (); - q = va_arg (ap, mpq_srcptr); - s = mpq_get_str (NULL, param.base, q); + s = mpq_get_str (NULL, param.base, va_arg (ap, mpq_srcptr)); ret = __gmp_doprnt_integer (funs, data, ¶m, s); (*__gmp_free_func) (s, strlen(s)+1); DOPRNT_ACCUMULATE (ret); @@ -275,12 +273,10 @@ __gmp_doprnt (const struct doprnt_funs_t *funs, void *data, break; case 'Z': { - mpz_srcptr z; - int ret; - char *s; + int ret; + char *s; FLUSH (); - z = va_arg (ap, mpz_srcptr); - s = mpz_get_str (NULL, param.base, z); + s = mpz_get_str (NULL, param.base, va_arg (ap, mpz_srcptr)); ret = __gmp_doprnt_integer (funs, data, ¶m, s); (*__gmp_free_func) (s, strlen(s)+1); DOPRNT_ACCUMULATE (ret); @@ -303,20 +299,9 @@ __gmp_doprnt (const struct doprnt_funs_t *funs, void *data, floating: switch (type) { case 'F': - { - mpf_srcptr f; - char *s; - mp_exp_t exp; - int ndigits, ret; - FLUSH (); - f = va_arg (ap, mpf_srcptr); - ndigits = __gmp_doprnt_float_digits (¶m, f); - s = mpf_get_str (NULL, &exp, param.base, ndigits, f); - ASSERT_DOPRNT_NDIGITS (param, ndigits, exp); - ret = __gmp_doprnt_float (funs, data, ¶m, s, exp); - (*__gmp_free_func) (s, strlen(s)+1); - DOPRNT_ACCUMULATE (ret); - } + FLUSH (); + DOPRNT_ACCUMULATE (__gmp_doprnt_mpf (funs, data, ¶m, + va_arg (ap, mpf_srcptr))); break; case 'L': #if HAVE_LONG_DOUBLE @@ -367,11 +352,11 @@ __gmp_doprnt (const struct doprnt_funs_t *funs, void *data, goto next; case 'n': - { - int *p; - FLUSH (); - p = va_arg (ap, int *); - *p = retval; + FLUSH (); + switch (type) { + case 'h': { short *p = va_arg (ap, short *); *p = retval; } break; + case 'l': { long *p = va_arg (ap, long *); *p = retval; } break; + default: { int *p = va_arg (ap, int *); *p = retval; } break; } goto next; @@ -415,11 +400,26 @@ __gmp_doprnt (const struct doprnt_funs_t *funs, void *data, break; case '.': seen_precision = 1; + param.prec = -1; /* "." alone means all necessary digits */ value = ¶m.prec; break; case '*': - *value = va_arg (ap, int); + { + int n = va_arg (ap, int); + if (value == ¶m.width) + { + /* negative width means left justify */ + if (n < 0) + param.justify = DOPRNT_JUSTIFY_LEFT; + param.width = ABS (n); + } + else + { + /* don't allow negative precision, apart from -1 */ + param.prec = MAX (n, -1); + } + } break; case '0': |