From e7b4e7012cc7d7ecdbf0874980fbd964a79574a4 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 30 Sep 2013 14:55:58 +0000 Subject: [PATCH] added experimental and incomplete xprintf function. --- qse/lib/cmn/Makefile.am | 2 + qse/lib/cmn/Makefile.in | 43 ++-- qse/lib/cmn/printf.c | 163 +++++++++++++++ qse/lib/cmn/printf.h | 447 ++++++++++++++++++++++++++++++++++++++++ qse/lib/cmn/stdio.c | 18 +- 5 files changed, 644 insertions(+), 29 deletions(-) create mode 100644 qse/lib/cmn/printf.c create mode 100644 qse/lib/cmn/printf.h diff --git a/qse/lib/cmn/Makefile.am b/qse/lib/cmn/Makefile.am index ea8b8c3b..adbef0d0 100644 --- a/qse/lib/cmn/Makefile.am +++ b/qse/lib/cmn/Makefile.am @@ -11,6 +11,7 @@ noinst_HEADERS = \ cp950.h \ fs.h \ mem.h \ + printf.h \ str-subst.h \ syscall.h \ syserr.h \ @@ -62,6 +63,7 @@ libqsecmn_la_SOURCES = \ pma.c \ rbt.c \ rex.c \ + printf.c \ sio.c \ sll.c \ slmb.c \ diff --git a/qse/lib/cmn/Makefile.in b/qse/lib/cmn/Makefile.in index 42ea1503..1f515e01 100644 --- a/qse/lib/cmn/Makefile.in +++ b/qse/lib/cmn/Makefile.in @@ -90,15 +90,16 @@ am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \ fma.c fmt.c fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c \ main.c mb8.c mbwc.c mbwc-str.c mem.c mux.c nwad.c nwad-skad.c \ nwif.c nwif-cfg.c nwio.c oht.c opt.c path-basename.c \ - path-canon.c pio.c pma.c rbt.c rex.c sio.c sll.c slmb.c \ - stdio.c str-beg.c str-cat.c str-chr.c str-cnv.c str-cmp.c \ - str-cpy.c str-del.c str-dup.c str-dynm.c str-dynw.c str-end.c \ - str-excl.c str-fcpy.c str-fnmat.c str-incl.c str-len.c \ - str-pac.c str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c \ - str-spl.c str-spn.c str-str.c str-subst.c str-tok.c str-trm.c \ - str-word.c task.c time.c tio.c tre.c tre-ast.c tre-compile.c \ - tre-match-backtrack.c tre-match-parallel.c tre-parse.c \ - tre-stack.c uri.c utf8.c xma.c uni.c cp949.c cp950.c + path-canon.c pio.c pma.c rbt.c rex.c printf.c sio.c sll.c \ + slmb.c stdio.c str-beg.c str-cat.c str-chr.c str-cnv.c \ + str-cmp.c str-cpy.c str-del.c str-dup.c str-dynm.c str-dynw.c \ + str-end.c str-excl.c str-fcpy.c str-fnmat.c str-incl.c \ + str-len.c str-pac.c str-pbrk.c str-put.c str-rev.c str-rot.c \ + str-set.c str-spl.c str-spn.c str-str.c str-subst.c str-tok.c \ + str-trm.c str-word.c task.c time.c tio.c tre.c tre-ast.c \ + tre-compile.c tre-match-backtrack.c tre-match-parallel.c \ + tre-parse.c tre-stack.c uri.c utf8.c xma.c uni.c cp949.c \ + cp950.c @ENABLE_BUNDLED_UNICODE_TRUE@am__objects_1 = uni.lo @ENABLE_XCMGRS_TRUE@am__objects_2 = cp949.lo cp950.lo am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \ @@ -107,14 +108,14 @@ am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \ hton.lo ipad.lo lda.lo main.lo mb8.lo mbwc.lo mbwc-str.lo \ mem.lo mux.lo nwad.lo nwad-skad.lo nwif.lo nwif-cfg.lo nwio.lo \ oht.lo opt.lo path-basename.lo path-canon.lo pio.lo pma.lo \ - rbt.lo rex.lo sio.lo sll.lo slmb.lo stdio.lo str-beg.lo \ - str-cat.lo str-chr.lo str-cnv.lo str-cmp.lo str-cpy.lo \ - str-del.lo str-dup.lo str-dynm.lo str-dynw.lo str-end.lo \ - str-excl.lo str-fcpy.lo str-fnmat.lo str-incl.lo str-len.lo \ - str-pac.lo str-pbrk.lo str-put.lo str-rev.lo str-rot.lo \ - str-set.lo str-spl.lo str-spn.lo str-str.lo str-subst.lo \ - str-tok.lo str-trm.lo str-word.lo task.lo time.lo tio.lo \ - tre.lo tre-ast.lo tre-compile.lo tre-match-backtrack.lo \ + rbt.lo rex.lo printf.lo sio.lo sll.lo slmb.lo stdio.lo \ + str-beg.lo str-cat.lo str-chr.lo str-cnv.lo str-cmp.lo \ + str-cpy.lo str-del.lo str-dup.lo str-dynm.lo str-dynw.lo \ + str-end.lo str-excl.lo str-fcpy.lo str-fnmat.lo str-incl.lo \ + str-len.lo str-pac.lo str-pbrk.lo str-put.lo str-rev.lo \ + str-rot.lo str-set.lo str-spl.lo str-spn.lo str-str.lo \ + str-subst.lo str-tok.lo str-trm.lo str-word.lo task.lo time.lo \ + tio.lo tre.lo tre-ast.lo tre-compile.lo tre-match-backtrack.lo \ tre-match-parallel.lo tre-parse.lo tre-stack.lo uri.lo utf8.lo \ xma.lo $(am__objects_1) $(am__objects_2) libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS) @@ -367,6 +368,7 @@ noinst_HEADERS = \ cp950.h \ fs.h \ mem.h \ + printf.h \ str-subst.h \ syscall.h \ syserr.h \ @@ -382,9 +384,9 @@ libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \ fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c main.c \ mb8.c mbwc.c mbwc-str.c mem.c mux.c nwad.c nwad-skad.c nwif.c \ nwif-cfg.c nwio.c oht.c opt.c path-basename.c path-canon.c \ - pio.c pma.c rbt.c rex.c sio.c sll.c slmb.c stdio.c str-beg.c \ - str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c str-del.c \ - str-dup.c str-dynm.c str-dynw.c str-end.c str-excl.c \ + pio.c pma.c rbt.c rex.c printf.c sio.c sll.c slmb.c stdio.c \ + str-beg.c str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c \ + str-del.c str-dup.c str-dynm.c str-dynw.c str-end.c str-excl.c \ str-fcpy.c str-fnmat.c str-incl.c str-len.c str-pac.c \ str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c str-spl.c \ str-spn.c str-str.c str-subst.c str-tok.c str-trm.c str-word.c \ @@ -516,6 +518,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path-canon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rbt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Plo@am__quote@ diff --git a/qse/lib/cmn/printf.c b/qse/lib/cmn/printf.c new file mode 100644 index 00000000..b4a3cba5 --- /dev/null +++ b/qse/lib/cmn/printf.c @@ -0,0 +1,163 @@ + +#include +#include +#include +#include + +/* number of bits in a byte */ +#define NBBY 8 + +/* Max number conversion buffer length: + * qse_intmax_t in base 2, plus NUL byte. */ +#define MAXNBUF (QSE_SIZEOF(qse_intmax_t) * NBBY + 1) + +enum +{ + LF_C = (1 << 0), + LF_H = (1 << 1), + LF_J = (1 << 2), + LF_L = (1 << 3), + LF_Q = (1 << 4), + LF_T = (1 << 5), + LF_Z = (1 << 6) +}; + +static struct +{ + qse_uint8_t flag; /* for single occurrence */ + qse_uint8_t dflag; /* for double occurrence */ +} lm_tab[26] = +{ + { 0, 0 }, /* a */ + { 0, 0 }, /* b */ + { 0, 0 }, /* c */ + { 0, 0 }, /* d */ + { 0, 0 }, /* e */ + { 0, 0 }, /* f */ + { 0, 0 }, /* g */ + { LF_H, LF_C }, /* h */ + { 0, 0 }, /* i */ + { LF_J, 0 }, /* j */ + { 0, 0 }, /* k */ + { LF_L, LF_Q }, /* l */ + { 0, 0 }, /* m */ + { 0, 0 }, /* n */ + { 0, 0 }, /* o */ + { 0, 0 }, /* p */ + { LF_Q, 0 }, /* q */ + { 0, 0 }, /* r */ + { 0, 0 }, /* s */ + { LF_T, 0 }, /* t */ + { 0, 0 }, /* u */ + { 0, 0 }, /* v */ + { 0, 0 }, /* w */ + { 0, 0 }, /* z */ + { 0, 0 }, /* y */ + { LF_Z, 0 }, /* z */ +}; + +#include /* TODO: remove dependency on this */ + +static void xputwchar (qse_wchar_t c, void *arg) +{ + qse_cmgr_t* cmgr; + qse_mchar_t mbsbuf[QSE_MBLEN_MAX + 1]; + qse_size_t n; + + cmgr = qse_getdflcmgr (); + n = cmgr->wctomb (c, mbsbuf, QSE_COUNTOF(mbsbuf)); + if (n <= 0 || n > QSE_COUNTOF(mbsbuf)) + { + putchar ('?'); + } + else + { + qse_size_t i; + for (i = 0; i < n; i++) putchar (mbsbuf[i]); + } +} + +static void xputmchar (qse_mchar_t c, void *arg) +{ + putchar (c); +} + +#undef char_t +#undef uchar_t +#undef ochar_t +#undef T +#undef OT +#undef toupper +#undef hex2ascii +#undef sprintn +#undef xprintf + +#define char_t qse_mchar_t +#define uchar_t qse_mchar_t +#define ochar_t qse_wchar_t +#define T(x) QSE_MT(x) +#define OT(x) QSE_WT(x) +#define toupper QSE_TOUPPER +#define sprintn m_sprintn +#define xprintf qse_mxprintf + +static const qse_mchar_t m_hex2ascii[] = QSE_MT("0123456789abcdefghijklmnopqrstuvwxyz"); +#define hex2ascii(hex) (m_hex2ascii[hex]) + +#include "printf.h" + +int qse_mprintf (const char_t *fmt, ...) +{ + va_list ap; + int n; + va_start (ap, fmt); + n = qse_mxprintf (fmt, xputmchar, xputwchar, QSE_NULL, ap); + va_end (ap); + return n; +} + +int qse_mvprintf (const char_t* fmt, va_list ap) +{ + return qse_mxprintf (fmt, xputmchar, xputwchar, QSE_NULL, ap); +} + +/* ------------------------------------------------------------------ */ + +#undef char_t +#undef uchar_t +#undef ochar_t +#undef T +#undef OT +#undef toupper +#undef hex2ascii +#undef sprintn +#undef xprintf + +#define char_t qse_wchar_t +#define uchar_t qse_wchar_t +#define ochar_t qse_mchar_t +#define T(x) QSE_WT(x) +#define OT(x) QSE_MT(x) +#define toupper QSE_TOWUPPER +#define sprintn w_sprintn +#define xprintf qse_wxprintf + +static const qse_wchar_t w_hex2ascii[] = QSE_WT("0123456789abcdefghijklmnopqrstuvwxyz"); +#define hex2ascii(hex) (w_hex2ascii[hex]) + +#include "printf.h" + +int qse_wprintf (const char_t *fmt, ...) +{ + va_list ap; + int n; + va_start (ap, fmt); + n = qse_wxprintf (fmt, xputwchar, xputmchar, QSE_NULL, ap); + va_end (ap); + return n; +} + +int qse_wvprintf (const char_t* fmt, va_list ap) +{ + return qse_wxprintf (fmt, xputwchar, xputmchar, QSE_NULL, ap); +} diff --git a/qse/lib/cmn/printf.h b/qse/lib/cmn/printf.h new file mode 100644 index 00000000..792eb746 --- /dev/null +++ b/qse/lib/cmn/printf.h @@ -0,0 +1,447 @@ +/*- + * Copyright (c) 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)subr_prf.c 8.3 (Berkeley) 1/21/94 + */ + +#define NBBY 8 /* number of bits in a byte */ + +/* Max number conversion buffer length: a u_quad_t in base 2, plus NUL byte. */ +#define MAXNBUF (QSE_SIZEOF(qse_intmax_t) * NBBY + 1) + +/* + * Put a NUL-terminated ASCII number (base <= 36) in a buffer in reverse + * order; return an optional length and a pointer to the last character + * written in the buffer (i.e., the first character of the string). + * The buffer pointed to by `nbuf' must have length >= MAXNBUF. + */ +static char_t* sprintn (char_t* nbuf, qse_uintmax_t num, int base, int *lenp, int upper) +{ + char_t *p, c; + + p = nbuf; + *p = T('\0'); + do + { + c = hex2ascii(num % base); + *++p = upper ? toupper(c) : c; + } + while (num /= base); + + if (lenp) *lenp = p - nbuf; + return (p); +} + +#define PCHAR(c) do { \ + func (c, arg); \ + retval++; \ +} while (0) + +#define OPCHAR(c) do { \ + ofunc (c, arg); \ + retval++; \ +} while (0) + +int xprintf (char_t const *fmt, void (*func)(char_t, void*), void (*ofunc) (ochar_t, void*), void *arg, va_list ap) +{ + char_t nbuf[MAXNBUF]; + const char_t* p, * percent; + uchar_t ch; + int n; + qse_uintmax_t num; + int base, tmp, width, ladjust, sharpflag, neg, sign, dot; + int dwidth, upper; + char_t padc, * sp; + ochar_t opadc, * osp; + int stop = 0, retval = 0; + int lm_flag, lm_dflag; + + num = 0; + + if (fmt == QSE_NULL) fmt = T("(fmt null)\n"); + + while (1) + { + padc = T(' '); + opadc = OT(' '); + + width = 0; + while ((ch = (uchar_t)*fmt++) != T('%') || stop) + { + if (ch == T('\0')) return (retval); + PCHAR(ch); + } + percent = fmt - 1; + ladjust = 0; sharpflag = 0; neg = 0; + sign = 0; dot = 0; dwidth = 0; upper = 0; + + lm_flag = 0; lm_dflag = 0; + +reswitch: + switch (ch = (uchar_t)*fmt++) + { + case T('%'): /* %% */ + PCHAR(ch); + break; + + case T('.'): + dot = 1; + goto reswitch; + case T('#'): + sharpflag = 1; + goto reswitch; + case T('+'): + sign = 1; + goto reswitch; + case T('-'): + ladjust = 1; + goto reswitch; + + case T('*'): + if (!dot) + { + width = va_arg(ap, int); + if (width < 0) + { + ladjust = !ladjust; + width = -width; + } + } + else + { + dwidth = va_arg(ap, int); + } + goto reswitch; + + case T('0'): + if (!dot) + { + padc = T('0'); + opadc = OT('0'); + goto reswitch; + } + case T('1'): case T('2'): case T('3'): case T('4'): + case T('5'): case T('6'): case T('7'): case T('8'): case T('9'): + for (n = 0;; ++fmt) + { + n = n * 10 + ch - T('0'); + ch = *fmt; + if (ch < T('0') || ch > T('9')) break; + } + if (dot) dwidth = n; + else width = n; + goto reswitch; + + case T('c'): + 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: + if (QSE_SIZEOF(char_t) < QSE_SIZEOF(int)) + PCHAR(va_arg(ap, int)); + else + PCHAR(va_arg(ap, char_t)); + break; + + case T('C'): + 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: + if (QSE_SIZEOF(ochar_t) < QSE_SIZEOF(int)) + OPCHAR(va_arg(ap, int)); + else + OPCHAR(va_arg(ap, ochar_t)); + break; + + +/* length modifiers */ + case T('h'): /* short int */ + case T('l'): /* long int */ + case T('q'): /* long long int */ + case T('j'): /* uintmax_t */ + case T('z'): /* size_t */ + case T('t'): /* ptrdiff_t */ + if (lm_dflag) + { + /* error */ + PCHAR (fmt[-4]); + PCHAR (fmt[-3]); + PCHAR (fmt[-2]); + PCHAR (fmt[-1]); + break; + } + else if (lm_flag) + { + if (lm_tab[ch - T('a')].dflag && lm_flag == lm_tab[ch - T('a')].flag) + { + lm_flag &= ~lm_tab[ch - T('a')].flag; + lm_flag |= lm_tab[ch - T('a')].dflag; + lm_dflag |= lm_flag; + goto reswitch; + } + else + { + /* error */ + PCHAR (fmt[-3]); + PCHAR (fmt[-2]); + PCHAR (fmt[-1]); + break; + } + } + else + { + lm_flag |= lm_tab[ch - T('a')].flag; + goto reswitch; + } + break; +/* end of length modifiers */ + + case T('n'): + if (lm_flag & LF_J) + *(va_arg(ap, qse_intmax_t *)) = retval; +#if (QSE_SIZEOF_LONG_LONG > 0) + else if (lm_flag & LF_Q) + *(va_arg(ap, long long int*)) = retval; +#endif + else if (lm_flag & LF_L) + *(va_arg(ap, long int*)) = retval; + else if (lm_flag & LF_Z) + *(va_arg(ap, qse_size_t*)) = retval; + else if (lm_flag & LF_H) + *(va_arg(ap, short int*)) = retval; + else if (lm_flag & LF_C) + *(va_arg(ap, char*)) = retval; + else + *(va_arg(ap, int*)) = retval; + break; + + case T('o'): + base = 8; + goto handle_nosign; + case T('d'): + case T('i'): + base = 10; + sign = 1; + goto handle_sign; + case T('u'): + base = 10; + goto handle_nosign; + case T('X'): + upper = 1; + case T('x'): + base = 16; + goto handle_nosign; + case T('y'): + base = 16; + sign = 1; + goto handle_sign; + + case T('p'): + base = 16; + sharpflag = (width == 0); + sign = 0; + num = (qse_uintptr_t)va_arg(ap, void *); + goto number; + + case T('s'): + { + 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)"); + if (!dot) + { + char_t* p = sp; + while (*p) p++; + n = p - sp; + } + else + { + for (n = 0; n < dwidth && sp[n]; n++) continue; + } + + width -= n; + + if (!ladjust && width > 0) + { + while (width--) PCHAR(padc); + } + while (n--) PCHAR(*sp++); + if (ladjust && width > 0) + { + while (width--) PCHAR(padc); + } + break; + } + + case T('S'): + { + 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 (!dot) + { + ochar_t* p = osp; + while (*p) p++; + n = p - osp; + } + else + { + for (n = 0; n < dwidth && osp[n]; n++) continue; + } + + width -= n; + + if (!ladjust && width > 0) + { + while (width--) OPCHAR (opadc); + } + while (n--) OPCHAR(*osp++); + if (ladjust && width > 0) + { + while (width--) OPCHAR (opadc); + } + break; + } + +handle_nosign: + sign = 0; + if (lm_flag & LF_J) + num = va_arg(ap, qse_uintmax_t); +#if (QSE_SIZEOF_LONG_LONG > 0) + else if (lm_flag & LF_Q) + num = va_arg(ap, unsigned long long int); +#endif + +#if 0 + else if (lm_flag & LF_T) + num = va_arg(ap, ptrdiff_t); +#endif + + else if (lm_flag & LF_L) + num = va_arg(ap, long int); + else if (lm_flag & LF_Z) + num = va_arg(ap, qse_size_t); + else if (lm_flag & LF_H) + num = (unsigned short int)va_arg(ap, int); + else if (lm_flag & LF_C) + num = (unsigned char)va_arg(ap, int); + else + num = va_arg(ap, unsigned int); + goto number; + +handle_sign: + if (lm_flag & LF_J) + num = va_arg(ap, qse_intmax_t); +#if (QSE_SIZEOF_LONG_LONG > 0) + else if (lm_flag & LF_Q) + num = va_arg(ap, long long int); +#endif +#if 0 + else if (lm_flag & LF_T) + num = va_arg(ap, ptrdiff_t); +#endif + else if (lm_flag & LF_L) + num = va_arg(ap, long int); + else if (lm_flag & LF_Z) + num = va_arg(ap, qse_ssize_t); + else if (lm_flag & LF_H) + num = (short int)va_arg(ap, int); + else if (lm_flag & LF_C) + num = (char)va_arg(ap, int); + else + num = va_arg(ap, int); + +number: + if (sign && (qse_intmax_t)num < 0) + { + neg = 1; + num = -(qse_intmax_t)num; + } + p = sprintn (nbuf, num, base, &tmp, upper); + if (sharpflag && num != 0) + { + if (base == 8) tmp++; + else if (base == 16) tmp += 2; + } + if (neg) tmp++; + + if (!ladjust && padc != T('0') && width && (width -= tmp) > 0) + { + while (width--) PCHAR(padc); + } + if (neg) PCHAR(T('-')); + + if (sharpflag && num != 0) + { + if (base == 8) { + PCHAR(T('0')); + } + else if (base == 16) + { + PCHAR(T('0')); + PCHAR(T('x')); + } + } + if (!ladjust && width && (width -= tmp) > 0) + { + while (width--) PCHAR(padc); + } + + while (*p) PCHAR(*p--); + + if (ladjust && width && (width -= tmp) > 0) + { + while (width--) PCHAR(padc); + } + + break; + + default: + while (percent < fmt) PCHAR(*percent++); + /* + * Since we ignore an formatting argument it is no + * longer safe to obey the remaining formatting + * arguments as the arguments will no longer match + * the format specs. + */ + stop = 1; + break; + } + } +} +#undef PCHAR +#undef OPCHAR + diff --git a/qse/lib/cmn/stdio.c b/qse/lib/cmn/stdio.c index 2619dff5..dbe8b6a2 100644 --- a/qse/lib/cmn/stdio.c +++ b/qse/lib/cmn/stdio.c @@ -57,7 +57,7 @@ int qse_vfprintf (QSE_FILE *stream, const qse_char_t* fmt, va_list ap) FILE* fp; nf = __adjust_format (fmt); - if (nf == NULL) return -1; + if (nf == QSE_NULL) return -1; fp = STREAM_TO_FILE (stream); @@ -76,7 +76,7 @@ int qse_vprintf (const qse_char_t* fmt, va_list ap) qse_char_t* nf; nf = __adjust_format (fmt); - if (nf == NULL) return -1; + if (nf == QSE_NULL) return -1; #if defined(QSE_CHAR_IS_MCHAR) n = vfprintf (stdout, nf, ap); @@ -96,7 +96,7 @@ int qse_fprintf (QSE_FILE* stream, const qse_char_t* fmt, ...) FILE* fp; nf = __adjust_format (fmt); - if (nf == NULL) return -1; + if (nf == QSE_NULL) return -1; fp = STREAM_TO_FILE (stream); @@ -119,7 +119,7 @@ int qse_printf (const qse_char_t* fmt, ...) qse_char_t* nf; nf = __adjust_format (fmt); - if (nf == NULL) return -1; + if (nf == QSE_NULL) return -1; va_start (ap, fmt); #if defined(QSE_CHAR_IS_MCHAR) @@ -140,7 +140,7 @@ int qse_dprintf (const qse_char_t* fmt, ...) qse_char_t* nf; nf = __adjust_format (fmt); - if (nf == NULL) return -1; + if (nf == QSE_NULL) return -1; va_start (ap, fmt); #if defined(QSE_CHAR_IS_MCHAR) @@ -158,7 +158,7 @@ int qse_vsprintf (qse_char_t* buf, qse_size_t size, const qse_char_t* fmt, va_li { int n; qse_char_t* nf = __adjust_format (fmt); - if (nf == NULL) return -1; + if (nf == QSE_NULL) return -1; #if defined(QSE_CHAR_IS_MCHAR) #if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) || defined(HAVE__VSNPRINTF) @@ -207,10 +207,10 @@ int qse_sprintf (qse_char_t* buf, qse_size_t size, const qse_char_t* fmt, ...) tmp = (qse_char_t*) QSE_MMGR_REALLOC ( \ QSE_MMGR_GETDFL(), buf.ptr, \ QSE_SIZEOF(qse_char_t) * (buf.cap+256+1)); \ - if (tmp == NULL) \ + if (tmp == QSE_NULL) \ { \ QSE_MMGR_FREE (QSE_MMGR_GETDFL(), buf.ptr); \ - return NULL; \ + return QSE_NULL; \ } \ buf.ptr = tmp; \ buf.cap = buf.cap + 256; \ @@ -236,7 +236,7 @@ static qse_char_t* __adjust_format (const qse_char_t* format) buf.ptr = (qse_char_t*) QSE_MMGR_ALLOC ( QSE_MMGR_GETDFL(), QSE_SIZEOF(qse_char_t) * (buf.cap+1)); - if (buf.ptr == NULL) return NULL; + if (buf.ptr == QSE_NULL) return QSE_NULL; while (*fp != QSE_T('\0')) {