fixed wrong return values of qse_fmtout
This commit is contained in:
		| @ -43,7 +43,6 @@ | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> /* getenv */ | ||||
| #include <qse/cmn/stdio.h> /* qse_sprintf */ | ||||
|  | ||||
| static int fnc_fork (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) | ||||
| { | ||||
| @ -552,7 +551,7 @@ static int fnc_getnwifcfg (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) | ||||
| 				md[4].key.ptr = QSE_T("ethw"); | ||||
| 				md[4].key.len = 4; | ||||
| 				md[4].type = QSE_AWK_VAL_MAP_DATA_STR; | ||||
| 				qse_sprintf (ethw, QSE_COUNTOF(ethw), QSE_T("%02X:%02X:%02X:%02X:%02X:%02X"),  | ||||
| 				qse_strxfmt (ethw, QSE_COUNTOF(ethw), QSE_T("%02X:%02X:%02X:%02X:%02X:%02X"),  | ||||
| 					cfg.ethw[0], cfg.ethw[1], cfg.ethw[2], cfg.ethw[3], cfg.ethw[4], cfg.ethw[5]); | ||||
| 				md[4].vptr = ethw; | ||||
|  | ||||
|  | ||||
| @ -22,7 +22,7 @@ | ||||
| #include <qse/cmn/fmt.h> | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| #include <qse/cmn/stdio.h> | ||||
| #include <qse/cmn/sio.h> | ||||
| #endif | ||||
|  | ||||
| #define PRINT_IOERR -99 | ||||
| @ -1889,7 +1889,7 @@ static int run_block0 (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) | ||||
| 	nlcls = nde->nlcls; | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf ( | ||||
| 	qse_errputstrf ( | ||||
| 		QSE_T("securing space for local variables nlcls = %d\n"),  | ||||
| 		(int)nlcls); | ||||
| #endif | ||||
| @ -1911,7 +1911,7 @@ static int run_block0 (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) | ||||
| 	} | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("executing block statements\n")); | ||||
| 	qse_errputstrf (QSE_T("executing block statements\n")); | ||||
| #endif | ||||
|  | ||||
| 	while (p != QSE_NULL && rtx->exit_level == EXIT_NONE) | ||||
| @ -1926,7 +1926,7 @@ static int run_block0 (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) | ||||
|  | ||||
| 	/* pop off local variables */ | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("popping off local variables\n")); | ||||
| 	qse_errputstrf (QSE_T("popping off local variables\n")); | ||||
| #endif | ||||
| 	nlcls = nde->nlcls; | ||||
| 	while (nlcls > 0) | ||||
| @ -3759,7 +3759,7 @@ retry: | ||||
| 	if (str == QSE_NULL) return QSE_NULL; | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("**** index str=>%s, map->ref=%d, map->type=%d\n"),  | ||||
| 	qse_errputstrf (QSE_T("**** index str=>%s, map->ref=%d, map->type=%d\n"),  | ||||
| 		str, (int)map->ref, (int)map->type); | ||||
| #endif | ||||
|  | ||||
| @ -5708,7 +5708,7 @@ static qse_awk_val_t* __eval_call ( | ||||
| 	saved_stack_top = run->stack_top; | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("setting up function stack frame top=%ld base=%ld\n"),  | ||||
| 	qse_errputstrf (QSE_T("setting up function stack frame top=%ld base=%ld\n"),  | ||||
| 		(long)run->stack_top, (long)run->stack_base); | ||||
| #endif | ||||
| 	if (__raw_push(run,(void*)run->stack_base) == -1)  | ||||
| @ -5775,7 +5775,7 @@ static qse_awk_val_t* __eval_call ( | ||||
| 	RTX_STACK_NARGS(run) = (void*)nargs; | ||||
| 	 | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("running function body\n")); | ||||
| 	qse_errputstrf (QSE_T("running function body\n")); | ||||
| #endif | ||||
|  | ||||
| 	if (fun != QSE_NULL) | ||||
| @ -5825,7 +5825,7 @@ static qse_awk_val_t* __eval_call ( | ||||
| 	/* refdown args in the run.stack */ | ||||
| 	nargs = (qse_size_t)RTX_STACK_NARGS(run); | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("block run complete nargs = %d\n"), (int)nargs);  | ||||
| 	qse_errputstrf (QSE_T("block run complete nargs = %d\n"), (int)nargs);  | ||||
| #endif | ||||
|  | ||||
| 	for (i = 0; i < nargs; i++) | ||||
| @ -5834,7 +5834,7 @@ static qse_awk_val_t* __eval_call ( | ||||
| 	} | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("got return value\n")); | ||||
| 	qse_errputstrf (QSE_T("got return value\n")); | ||||
| #endif | ||||
|  | ||||
| 	v = RTX_STACK_RETVAL(run); | ||||
| @ -5889,7 +5889,7 @@ static qse_awk_val_t* __eval_call ( | ||||
| 	if (run->exit_level == EXIT_FUNCTION) run->exit_level = EXIT_NONE; | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("returning from function top=%ld, base=%ld\n"), | ||||
| 	qse_errputstrf (QSE_T("returning from function top=%ld, base=%ld\n"), | ||||
| 		(long)run->stack_top, (long)run->stack_base);  | ||||
| #endif | ||||
| 	return (n == -1)? QSE_NULL: v; | ||||
| @ -6583,7 +6583,7 @@ read_again: | ||||
| 	} | ||||
|  | ||||
| #ifdef DEBUG_RUN | ||||
| 	qse_dprintf (QSE_T("record len = %d str=[%.*s]\n"),  | ||||
| 	qse_errputstrf (QSE_T("record len = %d str=[%.*s]\n"),  | ||||
| 		(int)QSE_STR_LEN(buf), (int)QSE_STR_LEN(buf), QSE_STR_PTR(buf)); | ||||
| #endif | ||||
| 	if (n == 0)  | ||||
|  | ||||
| @ -22,7 +22,7 @@ | ||||
| #include <qse/cmn/mbwc.h> | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| #include <qse/cmn/stdio.h> | ||||
| #include <qse/cmn/sio.h> | ||||
| #endif | ||||
|  | ||||
| #define CHUNKSIZE QSE_AWK_VAL_CHUNK_SIZE | ||||
| @ -140,7 +140,7 @@ qse_awk_val_t* qse_awk_rtx_makeintval (qse_awk_rtx_t* rtx, qse_long_t v) | ||||
| 	val->nde = QSE_NULL; | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("makeintval => %ld [%p]\n"), (long)v, val); | ||||
| 	qse_errputstrf (QSE_T("makeintval => %ld [%p]\n"), (long)v, val); | ||||
| #endif | ||||
| 	return (qse_awk_val_t*)val; | ||||
| } | ||||
| @ -196,7 +196,7 @@ qse_awk_val_t* qse_awk_rtx_makefltval (qse_awk_rtx_t* rtx, qse_flt_t v) | ||||
| 	val->nde = QSE_NULL; | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("makefltval => %Lf [%p]\n"), (double)v, val); | ||||
| 	qse_errputstrf (QSE_T("makefltval => %Lf [%p]\n"), (double)v, val); | ||||
| #endif | ||||
| 	return (qse_awk_val_t*)val; | ||||
| } | ||||
| @ -342,7 +342,7 @@ init: | ||||
| 	qse_strncpy (val->val.ptr, str->ptr, str->len); | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("makestrval => %p\n"), val); | ||||
| 	qse_errputstrf (QSE_T("makestrval => %p\n"), val); | ||||
| #endif | ||||
| 	return (qse_awk_val_t*)val; | ||||
| } | ||||
| @ -402,7 +402,7 @@ init: | ||||
| 	qse_strncpy (&val->val.ptr[len1], str2, len2); | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("makestrval2 => %p\n"), val); | ||||
| 	qse_errputstrf (QSE_T("makestrval2 => %p\n"), val); | ||||
| #endif | ||||
| 	return (qse_awk_val_t*)val; | ||||
| } | ||||
| @ -477,9 +477,9 @@ static void free_mapval (qse_htb_t* map, void* dptr, qse_size_t dlen) | ||||
| 	qse_awk_rtx_t* rtx = *(qse_awk_rtx_t**)QSE_XTN(map); | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("refdown in map free...")); | ||||
| 	qse_errputstrf (QSE_T("refdown in map free...")); | ||||
| 	qse_awk_dprintval (rtx, dptr); | ||||
| 	qse_dprintf (QSE_T("\n")); | ||||
| 	qse_errputstrf (QSE_T("\n")); | ||||
| #endif | ||||
|  | ||||
| 	qse_awk_rtx_refdownval (rtx, dptr); | ||||
| @ -489,9 +489,9 @@ static void same_mapval (qse_htb_t* map, void* dptr, qse_size_t dlen) | ||||
| { | ||||
| 	qse_awk_rtx_t* run = *(qse_awk_rtx_t**)QSE_XTN(map); | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("refdown nofree in map free...")); | ||||
| 	qse_errputstrf (QSE_T("refdown nofree in map free...")); | ||||
| 	qse_awk_dprintval (run, dptr); | ||||
| 	qse_dprintf (QSE_T("\n")); | ||||
| 	qse_errputstrf (QSE_T("\n")); | ||||
| #endif | ||||
| 	qse_awk_rtx_refdownval_nofree (run, dptr); | ||||
| } | ||||
| @ -765,9 +765,9 @@ void qse_awk_rtx_freeval ( | ||||
| 	if (IS_STATICVAL(val)) return; | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("freeing [cache=%d] ... "), cache); | ||||
| 	qse_errputstrf (QSE_T("freeing [cache=%d] ... "), cache); | ||||
| 	qse_awk_dprintval (rtx, val); | ||||
| 	qse_dprintf (QSE_T("\n")); | ||||
| 	qse_errputstrf (QSE_T("\n")); | ||||
| #endif | ||||
|  | ||||
| 	switch (val->type) | ||||
| @ -857,9 +857,9 @@ void qse_awk_rtx_refupval (qse_awk_rtx_t* rtx, qse_awk_val_t* val) | ||||
| 	if (IS_STATICVAL(val)) return; | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("ref up [ptr=%p] [count=%d] "), val, (int)val->ref); | ||||
| 	qse_errputstrf (QSE_T("ref up [ptr=%p] [count=%d] "), val, (int)val->ref); | ||||
| 	qse_awk_dprintval (rtx, val); | ||||
| 	qse_dprintf (QSE_T("\n")); | ||||
| 	qse_errputstrf (QSE_T("\n")); | ||||
| #endif | ||||
|  | ||||
| 	val->ref++; | ||||
| @ -870,9 +870,9 @@ void qse_awk_rtx_refdownval (qse_awk_rtx_t* rtx, qse_awk_val_t* val) | ||||
| 	if (IS_STATICVAL(val)) return; | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf (QSE_T("ref down [ptr=%p] [count=%d]\n"), val, (int)val->ref); | ||||
| 	qse_errputstrf (QSE_T("ref down [ptr=%p] [count=%d]\n"), val, (int)val->ref); | ||||
| 	qse_awk_dprintval (rtx, val); | ||||
| 	qse_dprintf (QSE_T("\n")); | ||||
| 	qse_errputstrf (QSE_T("\n")); | ||||
| #endif | ||||
|  | ||||
| 	QSE_ASSERTX (val->ref > 0,  | ||||
| @ -1402,7 +1402,7 @@ int qse_awk_rtx_valtostr ( | ||||
|  | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf ( | ||||
| 	qse_errputstrf ( | ||||
| 		QSE_T(">>WRONG VALUE TYPE [%d] in qse_awk_rtx_valtostr\n"),  | ||||
| 		v->type | ||||
| 	); | ||||
| @ -1569,7 +1569,7 @@ int qse_awk_rtx_valtonum ( | ||||
| 	} | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 	qse_dprintf ( | ||||
| 	qse_errputstrf ( | ||||
| 		QSE_T(">>WRONG VALUE TYPE [%d] in qse_awk_rtx_valtonum()\n"), | ||||
| 		v->type | ||||
| 	); | ||||
| @ -1669,7 +1669,7 @@ qse_long_t qse_awk_rtx_hashval (qse_awk_rtx_t* rtx, qse_awk_val_t* v) | ||||
| 		default: | ||||
|  | ||||
| #ifdef DEBUG_VAL | ||||
| 			qse_dprintf ( | ||||
| 			qse_errputstrf ( | ||||
| 				QSE_T(">>WRONG VALUE TYPE [%d] in qse_awk_rtx_hashval()\n"),  | ||||
| 				v->type | ||||
| 			); | ||||
|  | ||||
| @ -116,11 +116,11 @@ static const qse_wchar_t* w_hex2ascii = | ||||
| #undef ochar_t | ||||
| #undef T | ||||
| #undef OT | ||||
| #undef CONV_MAX | ||||
| #undef toupper | ||||
| #undef hex2ascii | ||||
| #undef sprintn | ||||
| #undef put_char | ||||
| #undef put_ochar | ||||
| #undef fmtout_t | ||||
| #undef fmtout | ||||
|  | ||||
| #define char_t qse_mchar_t | ||||
| @ -128,10 +128,10 @@ static const qse_wchar_t* w_hex2ascii = | ||||
| #define ochar_t qse_wchar_t | ||||
| #define T(x) QSE_MT(x) | ||||
| #define OT(x) QSE_WT(x) | ||||
| #define CONV_MAX QSE_MBLEN_MAX | ||||
| #define toupper QSE_TOUPPER | ||||
| #define sprintn m_sprintn | ||||
| #define put_char put_mchar | ||||
| #define put_ochar put_wchar | ||||
| #define fmtout_t qse_mfmtout_t | ||||
| #define fmtout qse_mfmtout | ||||
|  | ||||
| #define hex2ascii(hex)  (m_hex2ascii[hex]) | ||||
| @ -145,11 +145,11 @@ static const qse_wchar_t* w_hex2ascii = | ||||
| #undef ochar_t | ||||
| #undef T | ||||
| #undef OT | ||||
| #undef CONV_MAX | ||||
| #undef toupper | ||||
| #undef hex2ascii | ||||
| #undef sprintn | ||||
| #undef put_char | ||||
| #undef put_ochar | ||||
| #undef fmtout_t | ||||
| #undef fmtout | ||||
|  | ||||
| #define char_t qse_wchar_t | ||||
| @ -157,10 +157,10 @@ static const qse_wchar_t* w_hex2ascii = | ||||
| #define ochar_t qse_mchar_t | ||||
| #define T(x) QSE_WT(x) | ||||
| #define OT(x) QSE_MT(x) | ||||
| #define CONV_MAX 1 | ||||
| #define toupper QSE_TOWUPPER | ||||
| #define sprintn w_sprintn | ||||
| #define put_char put_wchar | ||||
| #define put_ochar put_mchar | ||||
| #define fmtout_t qse_wfmtout_t | ||||
| #define fmtout qse_wfmtout | ||||
|  | ||||
| #define hex2ascii(hex)  (w_hex2ascii[hex]) | ||||
|  | ||||
| @ -84,21 +84,17 @@ static char_t* sprintn (char_t* nbuf, qse_uintmax_t num, int base, int *lenp, in | ||||
| /* NOTE: data output is aborted if the data limit is reached or  | ||||
|  *       I/O error occurs  */ | ||||
|  | ||||
| #undef PUT_CHAR | ||||
|  | ||||
| #define PUT_CHAR(c) do { \ | ||||
| 	int xx; \ | ||||
| 	if (data->count >= data->limit) goto done; \ | ||||
| 	if ((xx = data->put_char (c, data->ctx)) <= -1) goto oops; \ | ||||
| 	if ((xx = data->put (c, data->ctx)) <= -1) goto oops; \ | ||||
| 	if (xx == 0) goto done; \ | ||||
| 	data->count += xx; \ | ||||
| } while (0) | ||||
|  | ||||
| #define PUT_OCHAR(c) do { \ | ||||
| 	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) | ||||
| int fmtout (const char_t* fmt, fmtout_t* data, va_list ap) | ||||
| { | ||||
| 	char_t nbuf[MAXNBUF]; | ||||
| 	const char_t* p, * percent; | ||||
| @ -106,12 +102,11 @@ int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap) | ||||
| 	uchar_t ch;  | ||||
| 	char_t ach, padc, * sp; | ||||
| 	ochar_t oach, * osp; | ||||
| 	qse_size_t oslen, slen; | ||||
| 	int lm_flag, lm_dflag, flagc, numlen; | ||||
| 	qse_uintmax_t num = 0; | ||||
| 	int stop = 0; | ||||
|  | ||||
| 	data->count = 0; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		qse_mchar_t  sbuf[32];	 | ||||
| @ -126,6 +121,8 @@ int fmtout (const char_t* fmt, qse_fmtout_t* data, va_list ap) | ||||
| 		qse_size_t   capa; | ||||
| 	} fltout; | ||||
|  | ||||
| 	data->count = 0; | ||||
|  | ||||
| 	fltfmt.ptr  = fltfmt.sbuf; | ||||
| 	fltfmt.capa = QSE_COUNTOF(fltfmt.sbuf) - 1; | ||||
|  | ||||
| @ -389,13 +386,36 @@ reswitch: | ||||
| 		uppercase_c: | ||||
| 			oach = QSE_SIZEOF(ochar_t) < QSE_SIZEOF(int)? va_arg(ap, int): va_arg(ap, ochar_t); | ||||
|  | ||||
| 			oslen = 1; | ||||
| 			if (data->conv (&oach, &oslen, QSE_NULL, &slen, data->ctx) <= -1) | ||||
| 			{ | ||||
| 				/* conversion error */ | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| 			/* precision 0 doesn't kill the letter */ | ||||
| 			width--; | ||||
| 			width -= slen; | ||||
| 			if (!(flagc & FLAGC_LEFTADJ) && width > 0) | ||||
| 			{ | ||||
| 				while (width--) PUT_CHAR (padc); | ||||
| 			} | ||||
| 			PUT_OCHAR (oach); | ||||
|  | ||||
| 			{ | ||||
| 				char_t conv_buf[CONV_MAX];  | ||||
| 				qse_size_t i, conv_len; | ||||
|  | ||||
| 				oslen = 1; | ||||
| 				conv_len = QSE_COUNTOF(conv_buf); | ||||
|  | ||||
| 				/* this must not fail since the dry-run above was successful */ | ||||
| 				data->conv (&oach, &oslen, conv_buf, &conv_len, data->ctx); | ||||
|  | ||||
| 				for (i = 0; i < conv_len; i++) | ||||
| 				{ | ||||
| 					PUT_CHAR (conv_buf[i]); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if ((flagc & FLAGC_LEFTADJ) && width > 0) | ||||
| 			{ | ||||
| 				while (width--) PUT_CHAR (padc); | ||||
| @ -414,13 +434,11 @@ reswitch: | ||||
| 		print_lowercase_s: | ||||
| 			if (flagc & FLAGC_DOT) | ||||
| 			{ | ||||
| 				for (n = 0; n < precision && sp[n]; n++) continue; | ||||
| 				for (n = 0; n < precision && sp[n]; n++); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				char_t* p = sp; | ||||
| 				while (*p) p++; | ||||
| 				n = p - sp; | ||||
| 				for (n = 0; sp[n]; n++); | ||||
| 			} | ||||
|  | ||||
| 			width -= n; | ||||
| @ -445,24 +463,57 @@ reswitch: | ||||
|  | ||||
| 			osp = va_arg (ap, ochar_t*); | ||||
| 			if (osp == QSE_NULL) osp = OT("(null)"); | ||||
| 			if (flagc & FLAGC_DOT)  | ||||
|  | ||||
| 			/* get the length */ | ||||
| 			for (oslen = 0; osp[oslen]; oslen++); | ||||
|  | ||||
| 			if (data->conv (osp, &oslen, QSE_NULL, &slen, data->ctx) <= -1) | ||||
| 			{ | ||||
| 				for (n = 0; n < precision && osp[n]; n++) continue; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				ochar_t* p = osp; | ||||
| 				while (*p) p++; | ||||
| 				n = p - osp; | ||||
| 				/* conversion error */ | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| 			/* slen hold the length after conversion */ | ||||
| 			n = slen; | ||||
| 			if ((flagc & FLAGC_DOT) && precision < slen) n = precision; | ||||
| 			width -= n; | ||||
|  | ||||
| 			if (!(flagc & FLAGC_LEFTADJ) && width > 0) | ||||
| 			{ | ||||
| 				while (width--) PUT_CHAR (padc); | ||||
| 			} | ||||
| 			while (n--) PUT_OCHAR(*osp++); | ||||
|  | ||||
| 			{ | ||||
| 				char_t conv_buf[CONV_MAX];  | ||||
| 				qse_size_t i, conv_len, src_len, tot_len = 0; | ||||
| 				while (n > 0) | ||||
| 				{ | ||||
| 					QSE_ASSERT (oslen > tot_len); | ||||
|  | ||||
| 				#if CONV_MAX == 1 | ||||
| 					src_len = oslen - tot_len; | ||||
| 				#else | ||||
| 					src_len = 1; | ||||
| 				#endif | ||||
| 					conv_len = QSE_COUNTOF(conv_buf); | ||||
|  | ||||
| 					/* this must not fail since the dry-run above was successful */ | ||||
| 					data->conv (&osp[tot_len], &src_len, conv_buf, &conv_len, data->ctx); | ||||
| 					tot_len += src_len; | ||||
|  | ||||
| 					/* stop outputting if a converted character can't be printed  | ||||
| 					 * in its entirety (limited by precision). but this is not an error */ | ||||
| 					if (n < conv_len) break;  | ||||
|  | ||||
| 					for (i = 0; i < conv_len; i++) | ||||
| 					{ | ||||
| 						PUT_CHAR (conv_buf[i]); | ||||
| 					} | ||||
|  | ||||
| 					n -= conv_len; | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
| 			if ((flagc & FLAGC_LEFTADJ) && width > 0) | ||||
| 			{ | ||||
| 				while (width--) PUT_CHAR (padc); | ||||
| @ -754,5 +805,4 @@ oops: | ||||
| 	return (qse_ssize_t)-1; | ||||
| } | ||||
| #undef PUT_CHAR | ||||
| #undef PUT_OCHAR | ||||
|  | ||||
|  | ||||
| @ -45,19 +45,72 @@ struct qse_fmtout_t | ||||
|  | ||||
| typedef struct qse_fmtout_t qse_fmtout_t; | ||||
|  | ||||
|  | ||||
|  | ||||
| typedef int (*qse_mfmtout_put_t) ( | ||||
| 	qse_mchar_t c, | ||||
| 	void*       ctx | ||||
| ); | ||||
|  | ||||
| /* convert a wide string to a multi-byte string */ | ||||
| typedef int (*qse_mfmtout_conv_t) ( | ||||
| 	const qse_wchar_t* wcs, | ||||
| 	qse_size_t*        wcslen, | ||||
| 	qse_mchar_t*       mbs, | ||||
| 	qse_size_t*        mbslen, | ||||
| 	void*              ctx | ||||
| ); | ||||
|  | ||||
| struct qse_mfmtout_t | ||||
| { | ||||
| 	qse_size_t         count;     /* out */ | ||||
| 	qse_size_t         limit;     /* in */ | ||||
| 	void*              ctx;       /* in */ | ||||
| 	qse_mfmtout_put_t  put;       /* in */ | ||||
| 	qse_mfmtout_conv_t conv;      /* in */ | ||||
| }; | ||||
|  | ||||
| typedef struct qse_mfmtout_t qse_mfmtout_t; | ||||
|  | ||||
| typedef int (*qse_wfmtout_put_t) ( | ||||
| 	qse_wchar_t c, | ||||
| 	void*       ctx | ||||
| ); | ||||
|  | ||||
| /* convert a multi-byte string to a wide string */ | ||||
| typedef int (*qse_wfmtout_conv_t) ( | ||||
| 	const qse_mchar_t* mbs, | ||||
| 	qse_size_t*        mbslen, | ||||
| 	qse_wchar_t*       wcs, | ||||
| 	qse_size_t*        wcslen, | ||||
| 	void*              ctx | ||||
| ); | ||||
|  | ||||
| struct qse_wfmtout_t | ||||
| { | ||||
| 	qse_size_t         count;     /* out */ | ||||
| 	qse_size_t         limit;     /* in */ | ||||
| 	void*              ctx;       /* in */ | ||||
| 	qse_wfmtout_put_t  put;       /* in */ | ||||
| 	qse_wfmtout_conv_t conv;      /* in */ | ||||
| }; | ||||
|  | ||||
|  | ||||
| typedef struct qse_wfmtout_t qse_wfmtout_t; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| int qse_mfmtout ( | ||||
| 	const qse_mchar_t* fmt, | ||||
| 	qse_fmtout_t*      data, | ||||
| 	qse_mfmtout_t*     data, | ||||
| 	va_list            ap | ||||
| ); | ||||
|  | ||||
| int qse_wfmtout ( | ||||
| 	const qse_wchar_t* fmt, | ||||
| 	qse_fmtout_t*      data, | ||||
| 	qse_wfmtout_t*     data, | ||||
| 	va_list            ap | ||||
| ); | ||||
|  | ||||
|  | ||||
| @ -19,6 +19,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include <qse/cmn/sio.h> | ||||
| #include <qse/cmn/mbwc.h> | ||||
| #include "mem.h" | ||||
| #include "fmt.h" | ||||
|  | ||||
| @ -636,26 +637,40 @@ 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* ctx) | ||||
| { | ||||
| 	return qse_sio_putwc ((qse_sio_t*)arg, c); | ||||
| 	return qse_sio_putwc ((qse_sio_t*)ctx, c); | ||||
| } | ||||
|  | ||||
| static int put_mchar (qse_mchar_t c, void* arg) | ||||
| static int put_mchar (qse_mchar_t c, void* ctx) | ||||
| { | ||||
| 	return qse_sio_putmb ((qse_sio_t*)arg, c); | ||||
| 	return qse_sio_putmb ((qse_sio_t*)ctx, c); | ||||
| } | ||||
|  | ||||
| static int wcs_to_mbs ( | ||||
| 	const qse_wchar_t* wcs, qse_size_t* wcslen, | ||||
| 	qse_mchar_t* mbs, qse_size_t* mbslen, void* ctx) | ||||
| { | ||||
| 	return qse_wcsntombsnwithcmgr (wcs, wcslen,  mbs, mbslen, qse_sio_getcmgr ((qse_sio_t*)ctx)); | ||||
| } | ||||
|  | ||||
| static int mbs_to_wcs ( | ||||
| 	const qse_mchar_t* mbs, qse_size_t* mbslen,  | ||||
| 	qse_wchar_t* wcs, qse_size_t* wcslen, void* ctx) | ||||
| { | ||||
| 	return qse_mbsntowcsnwithcmgr (mbs, mbslen, wcs, wcslen, qse_sio_getcmgr ((qse_sio_t*)ctx)); | ||||
| } | ||||
|  | ||||
| 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; | ||||
| 	qse_mfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_mchar; | ||||
| 	fo.conv = wcs_to_mbs; | ||||
|  | ||||
| 	va_start (ap, fmt); | ||||
| 	x = qse_mfmtout (fmt, &fo, ap); | ||||
| @ -668,12 +683,12 @@ qse_ssize_t qse_sio_putwcsf (qse_sio_t* sio, const qse_wchar_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int x; | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_wfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_wchar; | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	va_start (ap, fmt); | ||||
| 	x = qse_wfmtout (fmt, &fo, ap); | ||||
| @ -682,60 +697,30 @@ qse_ssize_t qse_sio_putwcsf (qse_sio_t* sio, const qse_wchar_t* fmt, ...) | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_sio_putstrf (qse_sio_t* sio, const qse_char_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	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_fmtout (fmt, &fo, ap); | ||||
| 	va_end (ap); | ||||
|  | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_sio_putmbsvf (qse_sio_t* sio, const qse_mchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_mfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_mchar; | ||||
| 	fo.conv = wcs_to_mbs; | ||||
|  | ||||
| 	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) | ||||
| { | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_wfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_wchar; | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	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) | ||||
| { | ||||
| 	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) | ||||
| { | ||||
| 	qse_fio_off_t off; | ||||
| @ -875,12 +860,12 @@ qse_ssize_t qse_putmbsf (const qse_mchar_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int x; | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_mfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stdout; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_mchar; | ||||
| 	fo.conv = wcs_to_mbs; | ||||
|  | ||||
| 	va_start (ap, fmt); | ||||
| 	x = qse_mfmtout (fmt, &fo, ap); | ||||
| @ -893,12 +878,12 @@ qse_ssize_t qse_putwcsf (const qse_wchar_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int x; | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_wfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stdout; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_wchar; | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	va_start (ap, fmt); | ||||
| 	x = qse_wfmtout (fmt, &fo, ap); | ||||
| @ -907,56 +892,86 @@ qse_ssize_t qse_putwcsf (const qse_wchar_t* fmt, ...) | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_putstrf (const qse_char_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	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_fmtout (fmt, &fo, ap); | ||||
| 	va_end (ap); | ||||
|  | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_putmbsvf (const qse_mchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_mfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stdout; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_mchar; | ||||
| 	fo.conv = wcs_to_mbs; | ||||
|  | ||||
| 	return (qse_mfmtout (fmt, &fo, ap) <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_putwcsvf (const qse_wchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	qse_fmtout_t fo; | ||||
| 	qse_wfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stdout; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.put = put_wchar; | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	return (qse_wfmtout (fmt, &fo, ap) <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_putstrvf (const qse_char_t* fmt, va_list ap) | ||||
| qse_ssize_t qse_errputmbsf (const qse_mchar_t* fmt, ...) | ||||
| { | ||||
| 	qse_fmtout_t fo; | ||||
| 	va_list ap; | ||||
| 	int x; | ||||
| 	qse_mfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stdout; | ||||
| 	fo.put_mchar = put_mchar; | ||||
| 	fo.put_wchar = put_wchar; | ||||
| 	fo.ctx = sio_stderr; | ||||
| 	fo.put = put_mchar; | ||||
| 	fo.conv = wcs_to_mbs; | ||||
|  | ||||
| 	return (qse_fmtout (fmt, &fo, ap) <= -1)? -1: fo.count; | ||||
| 	va_start (ap, fmt); | ||||
| 	x = qse_mfmtout (fmt, &fo, ap); | ||||
| 	va_end (ap); | ||||
|  | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_errputwcsf (const qse_wchar_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	int x; | ||||
| 	qse_wfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stderr; | ||||
| 	fo.put = put_wchar; | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	va_start (ap, fmt); | ||||
| 	x = qse_wfmtout (fmt, &fo, ap); | ||||
| 	va_end (ap); | ||||
|  | ||||
| 	return (x <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_errputmbsvf (const qse_mchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	qse_mfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stderr; | ||||
| 	fo.put = put_mchar; | ||||
| 	fo.conv = wcs_to_mbs; | ||||
|  | ||||
| 	return (qse_mfmtout (fmt, &fo, ap) <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| qse_ssize_t qse_errputwcsvf (const qse_wchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	qse_wfmtout_t fo; | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_ssize_t); | ||||
| 	fo.ctx = sio_stderr; | ||||
| 	fo.put = put_wchar; | ||||
| 	fo.conv = mbs_to_wcs; | ||||
|  | ||||
| 	return (qse_wfmtout (fmt, &fo, ap) <= -1)? -1: fo.count; | ||||
| } | ||||
|  | ||||
| @ -19,49 +19,62 @@ | ||||
|  */ | ||||
|  | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/mbwc.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) | ||||
| struct wbuf_t | ||||
| { | ||||
| 	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; | ||||
| 	qse_wchar_t* ptr; | ||||
| 	qse_size_t   len; | ||||
| 	qse_size_t   capa; | ||||
| }; | ||||
| typedef struct wbuf_t wbuf_t; | ||||
|  | ||||
|  | ||||
| static int put_mchar (qse_mchar_t c, void* ctx) | ||||
| { | ||||
| 	mbuf_t* buf = (mbuf_t*)ctx; | ||||
| 	if (buf->len < buf->capa)  | ||||
| 	{ | ||||
| 		buf->ptr[buf->len++] = c; | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	return 0; /* stop. but no error */ | ||||
| } | ||||
|  | ||||
| static int put_mchar_to_mbuf (qse_mchar_t c, void* arg) | ||||
| static int put_wchar (qse_wchar_t c, void* ctx) | ||||
| { | ||||
| 	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; | ||||
| 	wbuf_t* buf = (wbuf_t*)ctx; | ||||
| 	if (buf->len < buf->capa)  | ||||
| 	{ | ||||
| 		buf->ptr[buf->len++] = c; | ||||
| 		return 1; | ||||
| 	} | ||||
|  | ||||
| 	return 0; /* stop. but no error */ | ||||
| } | ||||
|  | ||||
| static int put_wchar_to_mbuf (qse_wchar_t c, void* arg) | ||||
| static int wcs_to_mbs ( | ||||
| 	const qse_wchar_t* wcs, qse_size_t* wcslen, | ||||
| 	qse_mchar_t* mbs, qse_size_t* mbslen, void* ctx) | ||||
| { | ||||
| 	return 1; | ||||
| 	return qse_wcsntombsnwithcmgr (wcs, wcslen, mbs, mbslen, qse_getdflcmgr()); | ||||
| } | ||||
|  | ||||
| static int put_mchar_to_wbuf (qse_mchar_t c, void* arg) | ||||
| static int mbs_to_wcs ( | ||||
| 	const qse_mchar_t* mbs, qse_size_t* mbslen,  | ||||
| 	qse_wchar_t* wcs, qse_size_t* wcslen, void* ctx) | ||||
| { | ||||
| 	return 1; | ||||
| 	return qse_mbsntowcsnwithcmgr (mbs, mbslen, wcs, wcslen, qse_getdflcmgr()); | ||||
| } | ||||
|  | ||||
| /* ----------------------------------- */ | ||||
| @ -69,18 +82,20 @@ static int put_mchar_to_wbuf (qse_mchar_t c, void* arg) | ||||
| #undef T | ||||
| #undef char_t | ||||
| #undef buf_t | ||||
| #undef fmtout_t | ||||
| #undef fmtout | ||||
| #undef output_char | ||||
| #undef output_ochar | ||||
| #undef put_char | ||||
| #undef conv_char | ||||
| #undef strfmt | ||||
| #undef strxfmt | ||||
|  | ||||
| #define T(x) QSE_MT(x) | ||||
| #define char_t qse_mchar_t | ||||
| #define buf_t mbuf_t | ||||
| #define fmtout_t qse_mfmtout_t | ||||
| #define fmtout qse_mfmtout | ||||
| #define output_mchar put_mchar_to_mbuf | ||||
| #define output_wchar put_wchar_to_mbuf | ||||
| #define put_char put_mchar | ||||
| #define conv_char wcs_to_mbs | ||||
| #define strfmt qse_mbsfmt | ||||
| #define strxfmt qse_mbsxfmt | ||||
| #include "str-fmt.h" | ||||
| @ -90,47 +105,21 @@ static int put_mchar_to_wbuf (qse_mchar_t c, void* arg) | ||||
| #undef T | ||||
| #undef char_t | ||||
| #undef buf_t | ||||
| #undef fmtout_t | ||||
| #undef fmtout | ||||
| #undef output_mchar | ||||
| #undef output_wchar | ||||
| #undef put_char | ||||
| #undef conv_char | ||||
| #undef strfmt | ||||
| #undef strxfmt | ||||
|  | ||||
| #define T(x) QSE_WT(x) | ||||
| #define char_t qse_wchar_t | ||||
| #define buf_t wbuf_t | ||||
| #define fmtout_t qse_wfmtout_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 | ||||
| #define put_char put_wchar | ||||
| #define conv_char mbs_to_wcs | ||||
| #define strfmt qse_wcsfmt | ||||
| #define strxfmt 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" | ||||
|  | ||||
| @ -23,7 +23,7 @@ qse_size_t strfmt (char_t* buf, const char_t* fmt, ...) | ||||
| { | ||||
| 	buf_t b; | ||||
| 	va_list ap; | ||||
| 	qse_fmtout_t fo; | ||||
| 	fmtout_t fo; | ||||
|  | ||||
| 	b.ptr = buf; | ||||
| 	b.len = 0; | ||||
| @ -31,8 +31,8 @@ qse_size_t strfmt (char_t* buf, const char_t* fmt, ...) | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_size_t) - 1; | ||||
| 	fo.ctx = &b; | ||||
| 	fo.put_mchar = output_mchar; | ||||
| 	fo.put_wchar = output_wchar; | ||||
| 	fo.put = put_char; | ||||
| 	fo.conv = conv_char; | ||||
|  | ||||
| 	/* no error must be returned by fmtout since | ||||
| 	 * the callback function never fails. */ | ||||
| @ -42,14 +42,15 @@ qse_size_t strfmt (char_t* buf, const char_t* fmt, ...) | ||||
|  | ||||
| 	b.ptr[b.len] = T('\0'); | ||||
|  | ||||
| 	return fo.count; | ||||
| 	/*return fo.count;*/ | ||||
| 	return b.len; | ||||
| } | ||||
|  | ||||
| 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; | ||||
| 	fmtout_t fo; | ||||
|  | ||||
| 	b.ptr = buf; | ||||
| 	b.len = 0; | ||||
| @ -63,8 +64,8 @@ qse_size_t strxfmt (char_t* buf, qse_size_t len, const char_t* fmt, ...) | ||||
|  | ||||
| 	fo.limit = QSE_TYPE_MAX(qse_size_t) - 1; | ||||
| 	fo.ctx = &b; | ||||
| 	fo.put_mchar = output_mchar; | ||||
| 	fo.put_wchar = output_wchar; | ||||
| 	fo.put = put_char; | ||||
| 	fo.conv = conv_char; | ||||
|  | ||||
| 	/* no error must be returned by fmtout since | ||||
| 	 * the callback function never fails. */ | ||||
| @ -74,6 +75,7 @@ qse_size_t strxfmt (char_t* buf, qse_size_t len, const char_t* fmt, ...) | ||||
|  | ||||
| 	if (len > 0) b.ptr[b.len] = T('\0'); | ||||
|  | ||||
| 	return fo.count; | ||||
| 	/*return fo.count;*/ | ||||
| 	return b.len; | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user