started writing qse_strfmt()/qse_strxfmt() and the famaily

This commit is contained in:
2013-10-24 14:55:15 +00:00
parent 636967779d
commit 198bd714b0
14 changed files with 875 additions and 733 deletions

View File

@ -11,9 +11,11 @@ noinst_HEADERS = \
cp950.h \
fmt.h \
fmt-intmax.h \
fmt-print.h \
fmt-out.h \
fs.h \
mem.h \
str-fcpy.h \
str-fmt.h \
str-join.h \
str-subst.h \
syscall.h \
@ -40,7 +42,7 @@ libqsecmn_la_SOURCES = \
fio.c \
fma.c \
fmt-intmax.c \
fmt-print.c \
fmt-out.c \
fs.c \
fs-err.c \
fs-move.c \
@ -84,6 +86,7 @@ libqsecmn_la_SOURCES = \
str-end.c \
str-excl.c \
str-fcpy.c \
str-fmt.c \
str-fnmat.c \
str-incl.c \
str-join.c \

View File

@ -87,38 +87,38 @@ am__DEPENDENCIES_1 =
libqsecmn_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \
alg-sort.c assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c \
fma.c fmt-intmax.c fmt-print.c fs.c fs-err.c fs-move.c glob.c \
fma.c fmt-intmax.c fmt-out.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-join.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 \
str-end.c str-excl.c str-fcpy.c str-fmt.c str-fnmat.c \
str-incl.c str-join.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 \
alg-sort.lo assert.lo chr.lo dir.lo dll.lo env.lo gdl.lo \
htb.lo fio.lo fma.lo fmt-intmax.lo fmt-print.lo fs.lo \
fs-err.lo fs-move.lo glob.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 \
htb.lo fio.lo fma.lo fmt-intmax.lo fmt-out.lo fs.lo fs-err.lo \
fs-move.lo glob.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-join.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)
str-dynw.lo str-end.lo str-excl.lo str-fcpy.lo str-fmt.lo \
str-fnmat.lo str-incl.lo str-join.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)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@ -369,9 +369,11 @@ noinst_HEADERS = \
cp950.h \
fmt.h \
fmt-intmax.h \
fmt-print.h \
fmt-out.h \
fs.h \
mem.h \
str-fcpy.h \
str-fmt.h \
str-join.h \
str-subst.h \
syscall.h \
@ -385,17 +387,17 @@ noinst_HEADERS = \
libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \
assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c fma.c \
fmt-intmax.c fmt-print.c fs.c fs-err.c fs-move.c glob.c hton.c \
fmt-intmax.c fmt-out.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-join.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 \
str-end.c str-excl.c str-fcpy.c str-fmt.c str-fnmat.c \
str-incl.c str-join.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 $(am__append_1) $(am__append_2)
libqsecmn_la_LDFLAGS = -version-info 1:0:0 -no-undefined
@ -497,7 +499,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fio.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fma.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmt-intmax.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmt-print.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmt-out.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fs-err.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fs-move.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fs.Plo@am__quote@
@ -543,6 +545,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-end.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-excl.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-fcpy.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-fmt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-fnmat.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-incl.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str-join.Plo@am__quote@

View File

@ -24,6 +24,11 @@
#include <qse/cmn/mbwc.h>
#include <stdarg.h>
#include "mem.h"
#include "fmt.h"
#include <stdio.h> /* for snrintf() */
/* TODO: remove stdio.h once snprintf gets replaced by own
floting-point conversion implementation*/
/* number of bits in a byte */
#define NBBY 8
@ -106,44 +111,6 @@ static const qse_wchar_t* w_hex2ascii =
/* ------------------------------------------------------------------ */
#include <stdio.h> /* TODO: remove dependency on this */
#if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
# define snprintf _snprintf
# define vsnprintf _vsnprintf
#endif
/* ------------------------------------------------------------------ */
static int put_wchar (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))
{
return (putchar ('?') == EOF)? -1: 0;
}
else
{
qse_size_t i;
for (i = 0; i < n; i++)
{
if (putchar (mbsbuf[i]) == EOF) return -1;
}
return 0;
}
}
static int put_mchar (qse_mchar_t c, void *arg)
{
return (putchar (c) == EOF)? -1: 0;
}
/* ------------------------------------------------------------------ */
#undef char_t
#undef uchar_t
#undef ochar_t
@ -152,7 +119,9 @@ static int put_mchar (qse_mchar_t c, void *arg)
#undef toupper
#undef hex2ascii
#undef sprintn
#undef xprintf
#undef put_char
#undef put_ochar
#undef fmtout
#define char_t qse_mchar_t
#define uchar_t qse_mchar_t
@ -161,26 +130,13 @@ static int put_mchar (qse_mchar_t c, void *arg)
#define OT(x) QSE_WT(x)
#define toupper QSE_TOUPPER
#define sprintn m_sprintn
#define xprintf qse_mxprintf
#define put_char put_mchar
#define put_ochar put_wchar
#define fmtout qse_mfmtout
#define hex2ascii(hex) (m_hex2ascii[hex])
#include "fmt-print.h"
qse_ssize_t qse_mprintf (const char_t *fmt, ...)
{
va_list ap;
qse_ssize_t n;
va_start (ap, fmt);
n = qse_mxprintf (fmt, put_mchar, put_wchar, QSE_NULL, ap);
va_end (ap);
return n;
}
qse_ssize_t qse_mvprintf (const char_t* fmt, va_list ap)
{
return qse_mxprintf (fmt, put_mchar, put_wchar, QSE_NULL, ap);
}
#include "fmt-out.h"
/* ------------------------------------------------------------------ */
@ -192,7 +148,9 @@ qse_ssize_t qse_mvprintf (const char_t* fmt, va_list ap)
#undef toupper
#undef hex2ascii
#undef sprintn
#undef xprintf
#undef put_char
#undef put_ochar
#undef fmtout
#define char_t qse_wchar_t
#define uchar_t qse_wchar_t
@ -201,23 +159,11 @@ qse_ssize_t qse_mvprintf (const char_t* fmt, va_list ap)
#define OT(x) QSE_MT(x)
#define toupper QSE_TOWUPPER
#define sprintn w_sprintn
#define xprintf qse_wxprintf
#define put_char put_wchar
#define put_ochar put_mchar
#define fmtout qse_wfmtout
#define hex2ascii(hex) (w_hex2ascii[hex])
#include "fmt-print.h"
#include "fmt-out.h"
qse_ssize_t qse_wprintf (const char_t *fmt, ...)
{
va_list ap;
qse_ssize_t n;
va_start (ap, fmt);
n = qse_wxprintf (fmt, put_wchar, put_mchar, QSE_NULL, ap);
va_end (ap);
return n;
}
qse_ssize_t qse_wvprintf (const char_t* fmt, va_list ap)
{
return qse_wxprintf (fmt, put_wchar, put_mchar, QSE_NULL, ap);
}

View File

@ -84,18 +84,17 @@ static char_t* sprintn (char_t* nbuf, qse_uintmax_t num, int base, int *lenp, in
#undef PUT_CHAR
#undef PUT_OCHAR
/* TODO: error check */
#define PUT_CHAR(c) do { \
if (put_char (c, arg) <= -1) goto oops; \
outcnt++; \
if (data->put_char (c, data->ctx) <= -1) goto oops; \
data->count++; \
} while (0)
#define PUT_OCHAR(c) do { \
if (put_ochar (c, arg) <= -1) goto oops; \
outcnt++; \
if (data->put_ochar (c, data->ctx) <= -1) goto oops; \
data->count++; \
} while (0)
qse_ssize_t xprintf (const char_t* fmt, int (*put_char)(char_t, void*), int (*put_ochar) (ochar_t, void*), void *arg, va_list ap)
int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap)
{
char_t nbuf[MAXNBUF];
const char_t* p, * percent;
@ -106,7 +105,8 @@ qse_ssize_t xprintf (const char_t* fmt, int (*put_char)(char_t, void*), int (*pu
int lm_flag, lm_dflag, flagc, numlen;
qse_uintmax_t num = 0;
int stop = 0;
qse_ssize_t outcnt = 0;
data->count = 0;
struct
{
@ -133,7 +133,7 @@ qse_ssize_t xprintf (const char_t* fmt, int (*put_char)(char_t, void*), int (*pu
while ((ch = (uchar_t)*fmt++) != T('%') || stop)
{
if (ch == T('\0')) goto done;
PUT_CHAR(ch);
PUT_CHAR (ch);
}
percent = fmt - 1;
@ -308,21 +308,21 @@ reswitch:
case T('n'):
if (lm_flag & LF_J) /* j */
*(va_arg(ap, qse_intmax_t*)) = outcnt;
*(va_arg(ap, qse_intmax_t*)) = data->count;
else if (lm_flag & LF_Z) /* z */
*(va_arg(ap, qse_size_t*)) = outcnt;
*(va_arg(ap, qse_size_t*)) = data->count;
#if (QSE_SIZEOF_LONG_LONG > 0)
else if (lm_flag & LF_Q) /* ll */
*(va_arg(ap, long long int*)) = outcnt;
*(va_arg(ap, long long int*)) = data->count;
#endif
else if (lm_flag & LF_L) /* l */
*(va_arg(ap, long int*)) = outcnt;
*(va_arg(ap, long int*)) = data->count;
else if (lm_flag & LF_H) /* h */
*(va_arg(ap, short int*)) = outcnt;
*(va_arg(ap, short int*)) = data->count;
else if (lm_flag & LF_C) /* hh */
*(va_arg(ap, char*)) = outcnt;
*(va_arg(ap, char*)) = data->count;
else
*(va_arg(ap, int*)) = outcnt;
*(va_arg(ap, int*)) = data->count;
break;
@ -733,7 +733,7 @@ done:
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), fltfmt.ptr);
if (fltout.ptr != fltout.sbuf)
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), fltout.ptr);
return outcnt;
return 0;
oops:
if (fltfmt.ptr != fltfmt.sbuf)

View File

@ -24,36 +24,49 @@
#include <qse/cmn/fmt.h>
#include <stdarg.h>
typedef int (*qse_printf_mchar_t) (
typedef int (*qse_fmtout_mchar_t) (
qse_mchar_t c,
void* ctx
);
typedef int (*qse_printf_wchar_t) (
qse_mchar_t c,
typedef int (*qse_fmtout_wchar_t) (
qse_wchar_t c,
void* ctx
);
struct qse_fmtout_t
{
qse_size_t count; /* out */
qse_size_t limit; /* in */
void* ctx; /* in */
qse_fmtout_mchar_t put_mchar; /* in */
qse_fmtout_wchar_t put_wchar; /* in */
};
typedef struct qse_fmtout_t qse_fmtout_t;
#ifdef __cplusplus
extern {
extern "C" {
#endif
qse_ssize_t qse_mxprintf (
int qse_mfmtout (
const qse_mchar_t* fmt,
qse_printf_mchar_t put_mchar,
qse_printf_wchar_t put_wchar,
void* arg,
qse_fmtout_t* data,
va_list ap
);
qse_ssize_t qse_wxprintf (
int qse_wfmtout (
const qse_wchar_t* fmt,
qse_printf_wchar_t put_wchar,
qse_printf_mchar_t put_mchar,
void* arg,
qse_fmtout_t* data,
va_list ap
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_fmtout(fmt,fo,ap) qse_mfmtout(fmt,fo,ap)
#else
# define qse_fmtout(fmt,fo,ap) qse_wfmtout(fmt,fo,ap)
#endif
#ifdef __cplusplus
}
#endif

View File

@ -636,12 +636,12 @@ qse_ssize_t qse_sio_putwcsn (
return n;
}
static int put_wchar (qse_wchar_t c, void *arg)
static int put_wchar (qse_wchar_t c, void* arg)
{
return qse_sio_putwc ((qse_sio_t*)arg, c);
}
static int put_mchar (qse_mchar_t c, void *arg)
static int put_mchar (qse_mchar_t c, void* arg)
{
return qse_sio_putmb ((qse_sio_t*)arg, c);
}
@ -650,59 +650,90 @@ qse_ssize_t qse_sio_putmbsf (qse_sio_t* sio, const qse_mchar_t* fmt, ...)
{
va_list ap;
qse_ssize_t x;
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
va_start (ap, fmt);
x = qse_mxprintf (fmt, put_mchar, put_wchar, sio, ap);
x = qse_mfmtout (fmt, &fo, ap);
va_end (ap);
return x;
return (x <= -1)? -1: fo.count;
}
qse_ssize_t qse_sio_putwcsf (qse_sio_t* sio, const qse_wchar_t* fmt, ...)
{
va_list ap;
qse_ssize_t x;
int x;
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
va_start (ap, fmt);
x = qse_wxprintf (fmt, put_wchar, put_mchar, sio, ap);
x = qse_wfmtout (fmt, &fo, ap);
va_end (ap);
return x;
return (x <= -1)? -1: fo.count;
}
qse_ssize_t qse_sio_putstrf (qse_sio_t* sio, const qse_char_t* fmt, ...)
{
va_list ap;
qse_ssize_t x;
int x;
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
va_start (ap, fmt);
#if defined(QSE_CHAR_IS_MCHAR)
x = qse_mxprintf (fmt, put_mchar, put_wchar, sio, ap);
#else
x = qse_wxprintf (fmt, put_wchar, put_mchar, sio, ap);
#endif
x = qse_fmtout (fmt, &fo, ap);
va_end (ap);
return x;
return (x <= -1)? -1: fo.count;
}
qse_ssize_t qse_sio_putmbsvf (qse_sio_t* sio, const qse_mchar_t* fmt, va_list ap)
{
return qse_mxprintf (fmt, put_mchar, put_wchar, sio, ap);
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
return (qse_mfmtout (fmt, &fo, ap) <= -1)? -1: fo.count;
}
qse_ssize_t qse_sio_putwcsvf (qse_sio_t* sio, const qse_wchar_t* fmt, va_list ap)
{
return qse_wxprintf (fmt, put_wchar, put_mchar, sio, ap);
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
return (qse_wfmtout (fmt, &fo, ap) <= -1)? -1: fo.count;
}
qse_ssize_t qse_sio_putstrvf (qse_sio_t* sio, const qse_char_t* fmt, va_list ap)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_mxprintf (fmt, put_mchar, put_wchar, sio, ap);
#else
return qse_wxprintf (fmt, put_wchar, put_mchar, sio, ap);
#endif
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
return (qse_fmtout (fmt, &fo, ap) <= -1)? -1: fo.count;
}
int qse_sio_getpos (qse_sio_t* sio, qse_sio_pos_t* pos)
@ -843,58 +874,89 @@ qse_sio_t* qse_getstderr (void)
qse_ssize_t qse_putmbsf (const qse_mchar_t* fmt, ...)
{
va_list ap;
qse_ssize_t x;
int x;
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio_stdout;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
va_start (ap, fmt);
x = qse_mxprintf (fmt, put_mchar, put_wchar, sio_stdout, ap);
x = qse_mfmtout (fmt, &fo, ap);
va_end (ap);
return x;
return (x <= -1)? -1: fo.count;
}
qse_ssize_t qse_putwcsf (const qse_wchar_t* fmt, ...)
{
va_list ap;
qse_ssize_t x;
int x;
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio_stdout;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
va_start (ap, fmt);
x = qse_wxprintf (fmt, put_wchar, put_mchar, sio_stdout, ap);
x = qse_wfmtout (fmt, &fo, ap);
va_end (ap);
return x;
return (x <= -1)? -1: fo.count;
}
qse_ssize_t qse_putstrf (const qse_char_t* fmt, ...)
{
va_list ap;
qse_ssize_t x;
int x;
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio_stdout;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
va_start (ap, fmt);
#if defined(QSE_CHAR_IS_MCHAR)
x = qse_mxprintf (fmt, put_mchar, put_wchar, sio_stdout, ap);
#else
x = qse_wxprintf (fmt, put_wchar, put_mchar, sio_stdout, ap);
#endif
x = qse_fmtout (fmt, &fo, ap);
va_end (ap);
return x;
return (x <= -1)? -1: fo.count;
}
qse_ssize_t qse_putmbsvf (const qse_mchar_t* fmt, va_list ap)
{
return qse_mxprintf (fmt, put_mchar, put_wchar, sio_stdout, ap);
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio_stdout;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
return (qse_mfmtout (fmt, &fo, ap) <= -1)? -1: fo.count;
}
qse_ssize_t qse_putwcsvf (const qse_wchar_t* fmt, va_list ap)
{
return qse_wxprintf (fmt, put_wchar, put_mchar, sio_stdout, ap);
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio_stdout;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
return (qse_wfmtout (fmt, &fo, ap) <= -1)? -1: fo.count;
}
qse_ssize_t qse_putstrvf (const qse_char_t* fmt, va_list ap)
{
#if defined(QSE_CHAR_IS_MCHAR)
return qse_mxprintf (fmt, put_mchar, put_wchar, sio_stdout, ap);
#else
return qse_wxprintf (fmt, put_wchar, put_mchar, sio_stdout, ap);
#endif
qse_fmtout_t fo;
fo.limit = QSE_TYPE_MAX(qse_ssize_t);
fo.ctx = sio_stdout;
fo.put_mchar = put_mchar;
fo.put_wchar = put_wchar;
return (qse_fmtout (fmt, &fo, ap) <= -1)? -1: fo.count;
}

View File

@ -20,452 +20,39 @@
#include <qse/cmn/str.h>
qse_size_t qse_mbsfcpy (
qse_mchar_t* buf, const qse_mchar_t* fmt, const qse_mchar_t* str[])
{
qse_mchar_t* b = buf;
const qse_mchar_t* f = fmt;
#undef T
#undef char_t
#undef cstr_t
#undef strfcpy
#undef strfncpy
#undef strxfcpy
#undef strxfncpy
#define T(x) QSE_MT(x)
#define char_t qse_mchar_t
#define cstr_t qse_mcstr_t
#define strfcpy qse_mbsfcpy
#define strfncpy qse_mbsfncpy
#define strxfcpy qse_mbsxfcpy
#define strxfncpy qse_mbsxfncpy
#include "str-fcpy.h"
/* ----------------------------------- */
#undef T
#undef char_t
#undef cstr_t
#undef strfcpy
#undef strfncpy
#undef strxfcpy
#undef strxfncpy
#define T(x) QSE_WT(x)
#define char_t qse_wchar_t
#define cstr_t qse_wcstr_t
#define strfcpy qse_wcsfcpy
#define strfncpy qse_wcsfncpy
#define strxfcpy qse_wcsxfcpy
#define strxfncpy qse_wcsxfncpy
#include "str-fcpy.h"
while (*f != QSE_MT('\0'))
{
if (*f == QSE_MT('$'))
{
if (f[1] == QSE_MT('{') &&
(f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
{
const qse_mchar_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_MT('0'));
while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
if (*f != QSE_MT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != QSE_MT('\0')) *b++ = *tmp++;
continue;
}
else if (f[1] == QSE_MT('$')) f++;
}
normal:
*b++ = *f++;
}
*b = QSE_MT('\0');
return b - buf;
}
qse_size_t qse_mbsfncpy (
qse_mchar_t* buf, const qse_mchar_t* fmt, const qse_mcstr_t str[])
{
qse_mchar_t* b = buf;
const qse_mchar_t* f = fmt;
while (*f != QSE_MT('\0'))
{
if (*f == QSE_MT('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != QSE_MT('\0')) f++;
}
else if (*f == QSE_MT('$'))
{
if (f[1] == QSE_MT('{') &&
(f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
{
const qse_mchar_t* tmp, * tmpend;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_MT('0'));
while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
if (*f != QSE_MT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend) *b++ = *tmp++;
continue;
}
else if (f[1] == QSE_MT('$')) f++;
}
normal:
*b++ = *f++;
}
*b = QSE_MT('\0');
return b - buf;
}
qse_size_t qse_mbsxfcpy (
qse_mchar_t* buf, qse_size_t bsz,
const qse_mchar_t* fmt, const qse_mchar_t* str[])
{
qse_mchar_t* b = buf;
qse_mchar_t* end = buf + bsz - 1;
const qse_mchar_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != QSE_MT('\0'))
{
if (*f == QSE_MT('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != QSE_MT('\0')) f++;
}
else if (*f == QSE_MT('$'))
{
if (f[1] == QSE_MT('{') &&
(f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
{
const qse_mchar_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_MT('0'));
while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
if (*f != QSE_MT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != QSE_MT('\0'))
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == QSE_MT('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = QSE_MT('\0');
return b - buf;
}
qse_size_t qse_mbsxfncpy (
qse_mchar_t* buf, qse_size_t bsz,
const qse_mchar_t* fmt, const qse_mcstr_t str[])
{
qse_mchar_t* b = buf;
qse_mchar_t* end = buf + bsz - 1;
const qse_mchar_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != QSE_MT('\0'))
{
if (*f == QSE_MT('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != QSE_MT('\0')) f++;
}
else if (*f == QSE_MT('$'))
{
if (f[1] == QSE_MT('{') &&
(f[2] >= QSE_MT('0') && f[2] <= QSE_MT('9')))
{
const qse_mchar_t* tmp, * tmpend;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_MT('0'));
while (*f >= QSE_MT('0') && *f <= QSE_MT('9'));
if (*f != QSE_MT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend)
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == QSE_MT('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = QSE_MT('\0');
return b - buf;
}
qse_size_t qse_wcsfcpy (
qse_wchar_t* buf, const qse_wchar_t* fmt, const qse_wchar_t* str[])
{
qse_wchar_t* b = buf;
const qse_wchar_t* f = fmt;
while (*f != QSE_WT('\0'))
{
if (*f == QSE_WT('$'))
{
if (f[1] == QSE_WT('{') &&
(f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
{
const qse_wchar_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_WT('0'));
while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
if (*f != QSE_WT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != QSE_WT('\0')) *b++ = *tmp++;
continue;
}
else if (f[1] == QSE_WT('$')) f++;
}
normal:
*b++ = *f++;
}
*b = QSE_WT('\0');
return b - buf;
}
qse_size_t qse_wcsfncpy (
qse_wchar_t* buf, const qse_wchar_t* fmt, const qse_wcstr_t str[])
{
qse_wchar_t* b = buf;
const qse_wchar_t* f = fmt;
while (*f != QSE_WT('\0'))
{
if (*f == QSE_WT('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != QSE_WT('\0')) f++;
}
else if (*f == QSE_WT('$'))
{
if (f[1] == QSE_WT('{') &&
(f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
{
const qse_wchar_t* tmp, * tmpend;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_WT('0'));
while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
if (*f != QSE_WT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend) *b++ = *tmp++;
continue;
}
else if (f[1] == QSE_WT('$')) f++;
}
normal:
*b++ = *f++;
}
*b = QSE_WT('\0');
return b - buf;
}
qse_size_t qse_wcsxfcpy (
qse_wchar_t* buf, qse_size_t bsz,
const qse_wchar_t* fmt, const qse_wchar_t* str[])
{
qse_wchar_t* b = buf;
qse_wchar_t* end = buf + bsz - 1;
const qse_wchar_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != QSE_WT('\0'))
{
if (*f == QSE_WT('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != QSE_WT('\0')) f++;
}
else if (*f == QSE_WT('$'))
{
if (f[1] == QSE_WT('{') &&
(f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
{
const qse_wchar_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_WT('0'));
while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
if (*f != QSE_WT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != QSE_WT('\0'))
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == QSE_WT('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = QSE_WT('\0');
return b - buf;
}
qse_size_t qse_wcsxfncpy (
qse_wchar_t* buf, qse_size_t bsz,
const qse_wchar_t* fmt, const qse_wcstr_t str[])
{
qse_wchar_t* b = buf;
qse_wchar_t* end = buf + bsz - 1;
const qse_wchar_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != QSE_WT('\0'))
{
if (*f == QSE_WT('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != QSE_WT('\0')) f++;
}
else if (*f == QSE_WT('$'))
{
if (f[1] == QSE_WT('{') &&
(f[2] >= QSE_WT('0') && f[2] <= QSE_WT('9')))
{
const qse_wchar_t* tmp, * tmpend;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - QSE_WT('0'));
while (*f >= QSE_WT('0') && *f <= QSE_WT('9'));
if (*f != QSE_WT('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend)
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == QSE_WT('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = QSE_WT('\0');
return b - buf;
}

244
qse/lib/cmn/str-fcpy.h Normal file
View File

@ -0,0 +1,244 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
qse_size_t strfcpy (
char_t* buf, const char_t* fmt, const char_t* str[])
{
char_t* b = buf;
const char_t* f = fmt;
while (*f != T('\0'))
{
if (*f == T('$'))
{
if (f[1] == T('{') &&
(f[2] >= T('0') && f[2] <= T('9')))
{
const char_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - T('0'));
while (*f >= T('0') && *f <= T('9'));
if (*f != T('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != T('\0')) *b++ = *tmp++;
continue;
}
else if (f[1] == T('$')) f++;
}
normal:
*b++ = *f++;
}
*b = T('\0');
return b - buf;
}
qse_size_t strfncpy (
char_t* buf, const char_t* fmt, const cstr_t str[])
{
char_t* b = buf;
const char_t* f = fmt;
while (*f != T('\0'))
{
if (*f == T('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != T('\0')) f++;
}
else if (*f == T('$'))
{
if (f[1] == T('{') &&
(f[2] >= T('0') && f[2] <= T('9')))
{
const char_t* tmp, * tmpend;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - T('0'));
while (*f >= T('0') && *f <= T('9'));
if (*f != T('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend) *b++ = *tmp++;
continue;
}
else if (f[1] == T('$')) f++;
}
normal:
*b++ = *f++;
}
*b = T('\0');
return b - buf;
}
qse_size_t strxfcpy (
char_t* buf, qse_size_t bsz,
const char_t* fmt, const char_t* str[])
{
char_t* b = buf;
char_t* end = buf + bsz - 1;
const char_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != T('\0'))
{
if (*f == T('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != T('\0')) f++;
}
else if (*f == T('$'))
{
if (f[1] == T('{') &&
(f[2] >= T('0') && f[2] <= T('9')))
{
const char_t* tmp;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - T('0'));
while (*f >= T('0') && *f <= T('9'));
if (*f != T('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx];
while (*tmp != T('\0'))
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == T('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = T('\0');
return b - buf;
}
qse_size_t strxfncpy (
char_t* buf, qse_size_t bsz,
const char_t* fmt, const cstr_t str[])
{
char_t* b = buf;
char_t* end = buf + bsz - 1;
const char_t* f = fmt;
if (bsz <= 0) return 0;
while (*f != T('\0'))
{
if (*f == T('\\'))
{
/* get the escaped character and treat it normally.
* if the escaper is the last character, treat it
* normally also. */
if (f[1] != T('\0')) f++;
}
else if (*f == T('$'))
{
if (f[1] == T('{') &&
(f[2] >= T('0') && f[2] <= T('9')))
{
const char_t* tmp, * tmpend;
qse_size_t idx = 0;
tmp = f;
f += 2;
do idx = idx * 10 + (*f++ - T('0'));
while (*f >= T('0') && *f <= T('9'));
if (*f != T('}'))
{
f = tmp;
goto normal;
}
f++;
tmp = str[idx].ptr;
tmpend = tmp + str[idx].len;
while (tmp < tmpend)
{
if (b >= end) goto fini;
*b++ = *tmp++;
}
continue;
}
else if (f[1] == T('$')) f++;
}
normal:
if (b >= end) break;
*b++ = *f++;
}
fini:
*b = T('\0');
return b - buf;
}

136
qse/lib/cmn/str-fmt.c Normal file
View File

@ -0,0 +1,136 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
#include <qse/cmn/str.h>
#include "fmt.h"
struct wbuf_t
{
qse_wchar_t* ptr;
qse_size_t len;
qse_size_t capa;
};
struct mbuf_t
{
qse_mchar_t* ptr;
qse_size_t len;
qse_size_t capa;
};
typedef struct wbuf_t wbuf_t;
typedef struct mbuf_t mbuf_t;
static int put_wchar_to_wbuf (qse_wchar_t c, void* arg)
{
qse_fmtout_t* fo = (qse_fmtout_t*)arg;
wbuf_t* buf = (wbuf_t*)fo->ctx;
if (buf->len < buf->capa) buf->ptr[buf->len++] = c;
return 1;
}
static int put_mchar_to_mbuf (qse_mchar_t c, void* arg)
{
qse_fmtout_t* fo = (qse_fmtout_t*)arg;
mbuf_t* buf = (mbuf_t*)fo->ctx;
if (buf->len < buf->capa) buf->ptr[buf->len++] = c;
return 1;
}
static int put_wchar_to_mbuf (qse_wchar_t c, void* arg)
{
return 1;
}
static int put_mchar_to_wbuf (qse_mchar_t c, void* arg)
{
return 1;
}
/* ----------------------------------- */
#undef T
#undef char_t
#undef buf_t
#undef fmtout
#undef output_char
#undef output_ochar
#undef strfmt
#undef strxfmt
#define T(x) QSE_MT(x)
#define char_t qse_mchar_t
#define buf_t mbuf_t
#define fmtout qse_mfmtout
#define output_mchar put_mchar_to_mbuf
#define output_wchar put_wchar_to_mbuf
#define strfmt qse_mbsfmt
#define strxfmt qse_mbsxfmt
#include "str-fmt.h"
/* ----------------------------------- */
#undef T
#undef char_t
#undef buf_t
#undef fmtout
#undef output_mchar
#undef output_wchar
#undef strfmt
#undef strxfmt
#define T(x) QSE_WT(x)
#define char_t qse_wchar_t
#define buf_t wbuf_t
#define fmtout qse_wfmtout
#define output_mchar put_mchar_to_wbuf
#define output_wchar put_wchar_to_wbuf
#define strfmtx qse_wcsfmt
#define strxfmtx qse_wcsxfmt
#include "str-fmt.h"
/* ----------------------------------- */
#undef T
#undef char_t
#undef buf_t
#undef fmtout
#undef output_mchar
#undef output_wchar
#undef strfmt
#undef strxfmt
#define T(x) QSE_T(x)
#define char_t qse_char_t
#if defined(QSE_CHAR_IS_MCHAR)
# define buf_t mbuf_t
# define output_mchar put_mchar_to_mbuf
# define output_wchar put_wchar_to_mbuf
# define fmtout qse_mfmtout
#else
# define buf_t wbuf_t
# define output_mchar put_mchar_to_wbuf
# define output_wchar put_wchar_to_wbuf
# define fmtout qse_wfmtout
#endif
#define strfmt qse_strfmt
#define strxfmt qse_strxfmt
#include "str-fmt.h"

79
qse/lib/cmn/str-fmt.h Normal file
View File

@ -0,0 +1,79 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
qse_size_t strfmt (char_t* buf, const char_t* fmt, ...)
{
buf_t b;
va_list ap;
qse_fmtout_t fo;
b.ptr = buf;
b.len = 0;
b.capa = QSE_TYPE_MAX(qse_ssize_t);
fo.limit = QSE_TYPE_MAX(qse_size_t) - 1;
fo.ctx = &b;
fo.put_mchar = output_mchar;
fo.put_wchar = output_wchar;
/* no error must be returned by fmtout since
* the callback function never fails. */
va_start (ap, fmt);
fmtout (fmt, &fo, ap);
va_end (ap);
b.ptr[b.len] = T('\0');
return fo.count;
}
qse_size_t strxfmt (char_t* buf, qse_size_t len, const char_t* fmt, ...)
{
buf_t b;
va_list ap;
qse_fmtout_t fo;
b.ptr = buf;
b.len = 0;
if (len > QSE_TYPE_MAX(qse_ssize_t))
b.capa = QSE_TYPE_MAX(qse_ssize_t);
else if (len > 0)
b.capa = len - 1;
else
b.capa = 0;
fo.limit = QSE_TYPE_MAX(qse_size_t) - 1;
fo.ctx = &b;
fo.put_mchar = output_mchar;
fo.put_wchar = output_wchar;
/* no error must be returned by fmtout since
* the callback function never fails. */
va_start (ap, fmt);
fmtout (fmt, &fo, ap);
va_end (ap);
if (len > 0) b.ptr[b.len] = T('\0');
return fo.count;
}

View File

@ -668,6 +668,11 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
flag = 1;
setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void*)&flag, QSE_SIZEOF(flag));
#endif
#if defined(SO_REUSEPORT)
flag = 1;
setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (void*)&flag, QSE_SIZEOF(flag));
#endif
/* TODO: linux. use capset() to set required capabilities just in case */
#if defined(IP_TRANSPARENT)