changed not to use the opposite type when outputting the padding character

This commit is contained in:
hyung-hwan 2013-10-27 17:14:19 +00:00
parent 198bd714b0
commit 1a0dc68fa3
2 changed files with 28 additions and 17 deletions

View File

@ -81,17 +81,21 @@ static char_t* sprintn (char_t* nbuf, qse_uintmax_t num, int base, int *lenp, in
return p; return p;
} }
#undef PUT_CHAR /* NOTE: data output is aborted if the data limit is reached or
#undef PUT_OCHAR * I/O error occurs */
#define PUT_CHAR(c) do { \ #define PUT_CHAR(c) do { \
if (data->put_char (c, data->ctx) <= -1) goto oops; \ int xx; \
data->count++; \ if (data->count >= data->limit) goto done; \
if ((xx = data->put_char (c, data->ctx)) <= -1) goto oops; \
data->count += xx; \
} while (0) } while (0)
#define PUT_OCHAR(c) do { \ #define PUT_OCHAR(c) do { \
if (data->put_ochar (c, data->ctx) <= -1) goto oops; \ int xx; \
data->count++; \ if (data->count >= data->limit) goto done; \
if ((xx = data->put_ochar (c, data->ctx)) <= -1) goto oops; \
data->count += xx; \
} while (0) } while (0)
int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap) 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; int n, base, tmp, width, neg, sign, precision, upper;
uchar_t ch; uchar_t ch;
char_t ach, padc, * sp; char_t ach, padc, * sp;
ochar_t oach, opadc, * osp; ochar_t oach, * osp;
int lm_flag, lm_dflag, flagc, numlen; int lm_flag, lm_dflag, flagc, numlen;
qse_uintmax_t num = 0; qse_uintmax_t num = 0;
int stop = 0; int stop = 0;
@ -137,7 +141,7 @@ int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap)
} }
percent = fmt - 1; percent = fmt - 1;
padc = T(' '); opadc = OT(' '); padc = T(' ');
width = 0; precision = 0; width = 0; precision = 0;
neg = 0; sign = 0; upper = 0; neg = 0; sign = 0; upper = 0;
@ -184,7 +188,6 @@ reswitch:
if (flagc & FLAGC_ZEROPAD) if (flagc & FLAGC_ZEROPAD)
{ {
padc = T(' '); padc = T(' ');
opadc = OT(' ');
flagc &= ~FLAGC_ZEROPAD; flagc &= ~FLAGC_ZEROPAD;
} }
} }
@ -230,7 +233,6 @@ reswitch:
if (!(flagc & (FLAGC_DOT | FLAGC_LEFTADJ))) if (!(flagc & (FLAGC_DOT | FLAGC_LEFTADJ)))
{ {
padc = T('0'); padc = T('0');
opadc = OT('0');
flagc |= FLAGC_ZEROPAD; flagc |= FLAGC_ZEROPAD;
goto reswitch; goto reswitch;
} }
@ -358,6 +360,8 @@ reswitch:
goto number; goto number;
case T('c'): 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))) || 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; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_c;
lowercase_c: lowercase_c:
@ -378,6 +382,8 @@ reswitch:
break; break;
case T('C'): 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))) || 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; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_c;
uppercase_c: uppercase_c:
@ -387,16 +393,18 @@ reswitch:
width--; width--;
if (!(flagc & FLAGC_LEFTADJ) && width > 0) if (!(flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_OCHAR (opadc); while (width--) PUT_CHAR (padc);
} }
PUT_OCHAR (oach); PUT_OCHAR (oach);
if ((flagc & FLAGC_LEFTADJ) && width > 0) if ((flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_OCHAR (opadc); while (width--) PUT_CHAR (padc);
} }
break; break;
case T('s'): 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))) || 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; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_s;
lowercase_s: lowercase_s:
@ -429,9 +437,12 @@ reswitch:
break; break;
case T('S'): 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))) || 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; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_s;
uppercase_s: uppercase_s:
osp = va_arg (ap, ochar_t*); osp = va_arg (ap, ochar_t*);
if (osp == QSE_NULL) osp = OT("(null)"); if (osp == QSE_NULL) osp = OT("(null)");
if (flagc & FLAGC_DOT) if (flagc & FLAGC_DOT)
@ -449,12 +460,12 @@ reswitch:
if (!(flagc & FLAGC_LEFTADJ) && width > 0) if (!(flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_OCHAR (opadc); while (width--) PUT_CHAR (padc);
} }
while (n--) PUT_OCHAR(*osp++); while (n--) PUT_OCHAR(*osp++);
if ((flagc & FLAGC_LEFTADJ) && width > 0) if ((flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_OCHAR (opadc); while (width--) PUT_CHAR (padc);
} }
break; break;

View File

@ -653,7 +653,7 @@ qse_ssize_t qse_tio_writembs (
* buffer. note that this flushes characters after nl also.*/ * buffer. note that this flushes characters after nl also.*/
if (nl && qse_tio_flush (tio) <= -1) return -1; 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; return xptr - mptr;
} }
} }