From 1a0dc68fa3efcac24117da36cc3310cd33f06c02 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sun, 27 Oct 2013 17:14:19 +0000 Subject: [PATCH] changed not to use the opposite type when outputting the padding character --- qse/lib/cmn/fmt-out.h | 43 +++++++++++++++++++++++++++---------------- qse/lib/cmn/tio.c | 2 +- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/qse/lib/cmn/fmt-out.h b/qse/lib/cmn/fmt-out.h index 139ad823..a1c91822 100644 --- a/qse/lib/cmn/fmt-out.h +++ b/qse/lib/cmn/fmt-out.h @@ -81,17 +81,21 @@ static char_t* sprintn (char_t* nbuf, qse_uintmax_t num, int base, int *lenp, in return p; } -#undef PUT_CHAR -#undef PUT_OCHAR +/* NOTE: data output is aborted if the data limit is reached or + * I/O error occurs */ #define PUT_CHAR(c) do { \ - if (data->put_char (c, data->ctx) <= -1) goto oops; \ - data->count++; \ + int xx; \ + if (data->count >= data->limit) goto done; \ + if ((xx = data->put_char (c, data->ctx)) <= -1) goto oops; \ + data->count += xx; \ } while (0) #define PUT_OCHAR(c) do { \ - if (data->put_ochar (c, data->ctx) <= -1) goto oops; \ - data->count++; \ + int xx; \ + if (data->count >= data->limit) goto done; \ + if ((xx = data->put_ochar (c, data->ctx)) <= -1) goto oops; \ + data->count += xx; \ } while (0) int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap) @@ -101,7 +105,7 @@ int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap) int n, base, tmp, width, neg, sign, precision, upper; uchar_t ch; char_t ach, padc, * sp; - ochar_t oach, opadc, * osp; + ochar_t oach, * osp; int lm_flag, lm_dflag, flagc, numlen; qse_uintmax_t num = 0; int stop = 0; @@ -137,7 +141,7 @@ int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap) } percent = fmt - 1; - padc = T(' '); opadc = OT(' '); + padc = T(' '); width = 0; precision = 0; neg = 0; sign = 0; upper = 0; @@ -184,7 +188,6 @@ reswitch: if (flagc & FLAGC_ZEROPAD) { padc = T(' '); - opadc = OT(' '); flagc &= ~FLAGC_ZEROPAD; } } @@ -230,7 +233,6 @@ reswitch: if (!(flagc & (FLAGC_DOT | FLAGC_LEFTADJ))) { padc = T('0'); - opadc = OT('0'); flagc |= FLAGC_ZEROPAD; goto reswitch; } @@ -358,6 +360,8 @@ reswitch: goto number; case T('c'): + /* zerpad must not take effect for 'c' */ + if (flagc & FLAGC_ZEROPAD) padc = QSE_T(' '); if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t))) || ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_c; lowercase_c: @@ -378,6 +382,8 @@ reswitch: break; case T('C'): + /* zerpad must not take effect for 'C' */ + if (flagc & FLAGC_ZEROPAD) padc = QSE_T(' '); if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t))) || ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_c; uppercase_c: @@ -387,22 +393,24 @@ reswitch: width--; if (!(flagc & FLAGC_LEFTADJ) && width > 0) { - while (width--) PUT_OCHAR (opadc); + while (width--) PUT_CHAR (padc); } PUT_OCHAR (oach); if ((flagc & FLAGC_LEFTADJ) && width > 0) { - while (width--) PUT_OCHAR (opadc); + while (width--) PUT_CHAR (padc); } break; case T('s'): + /* zerpad must not take effect for 's' */ + if (flagc & FLAGC_ZEROPAD) padc = QSE_T(' '); if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t))) || ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_s; lowercase_s: sp = va_arg (ap, char_t*); if (sp == QSE_NULL) p = T("(null)"); - + print_lowercase_s: if (flagc & FLAGC_DOT) { @@ -416,7 +424,7 @@ reswitch: } width -= n; - + if (!(flagc & FLAGC_LEFTADJ) && width > 0) { while (width--) PUT_CHAR(padc); @@ -429,9 +437,12 @@ reswitch: break; case T('S'): + /* zerpad must not take effect for 'S' */ + if (flagc & FLAGC_ZEROPAD) padc = QSE_T(' '); if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t))) || ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_s; uppercase_s: + osp = va_arg (ap, ochar_t*); if (osp == QSE_NULL) osp = OT("(null)"); if (flagc & FLAGC_DOT) @@ -449,12 +460,12 @@ reswitch: if (!(flagc & FLAGC_LEFTADJ) && width > 0) { - while (width--) PUT_OCHAR (opadc); + while (width--) PUT_CHAR (padc); } while (n--) PUT_OCHAR(*osp++); if ((flagc & FLAGC_LEFTADJ) && width > 0) { - while (width--) PUT_OCHAR (opadc); + while (width--) PUT_CHAR (padc); } break; diff --git a/qse/lib/cmn/tio.c b/qse/lib/cmn/tio.c index 12f772ea..e3939e07 100644 --- a/qse/lib/cmn/tio.c +++ b/qse/lib/cmn/tio.c @@ -653,7 +653,7 @@ qse_ssize_t qse_tio_writembs ( * buffer. note that this flushes characters after nl also.*/ if (nl && qse_tio_flush (tio) <= -1) return -1; - /* returns the number multi-bytes characters handled */ + /* returns the number multi-byte characters handled */ return xptr - mptr; } }