2020-04-17 11:10:47 +00:00
|
|
|
#include <hawk-fmt.h>
|
2019-12-13 04:29:58 +00:00
|
|
|
#include <hawk-utl.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <wchar.h>
|
|
|
|
#include <locale.h>
|
2022-04-06 02:21:46 +00:00
|
|
|
#include "tap.h"
|
2019-12-13 04:29:58 +00:00
|
|
|
|
2020-04-17 11:10:47 +00:00
|
|
|
static int put_bchars (hawk_fmtout_t* fmtout, const hawk_bch_t* c, hawk_oow_t len)
|
2019-12-13 04:29:58 +00:00
|
|
|
{
|
|
|
|
while (len > 0)
|
|
|
|
{
|
|
|
|
putchar (*c);
|
|
|
|
c++;
|
|
|
|
len--;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2020-04-17 11:10:47 +00:00
|
|
|
static int put_uchars (hawk_fmtout_t* fmtout, const hawk_uch_t* c, hawk_oow_t len)
|
2019-12-13 04:29:58 +00:00
|
|
|
{
|
|
|
|
hawk_cmgr_t* cmgr = hawk_get_utf8_cmgr();
|
|
|
|
hawk_bch_t bcs[HAWK_BCSIZE_MAX];
|
|
|
|
hawk_oow_t bcslen, i;
|
|
|
|
|
|
|
|
while (len > 0)
|
|
|
|
{
|
|
|
|
bcslen = cmgr->uctobc(*c, bcs, HAWK_COUNTOF(bcs));
|
|
|
|
/*putwchar (*c);*/
|
|
|
|
for (i = 0; i < bcslen; i++) putchar(bcs[i]);
|
|
|
|
c++;
|
|
|
|
len--;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static hawk_ooi_t bfmt_out (const hawk_bch_t* fmt, ...)
|
|
|
|
{
|
|
|
|
hawk_fmtout_t fmtout;
|
|
|
|
va_list ap;
|
|
|
|
int n;
|
|
|
|
|
|
|
|
memset (&fmtout, 0, HAWK_SIZEOF(fmtout));
|
2020-04-17 11:10:47 +00:00
|
|
|
fmtout.putbchars = put_bchars;
|
|
|
|
fmtout.putuchars = put_uchars;
|
2019-12-13 04:29:58 +00:00
|
|
|
|
|
|
|
va_start (ap, fmt);
|
|
|
|
n = hawk_bfmt_outv (&fmtout, fmt, ap);
|
|
|
|
va_end (ap);
|
|
|
|
|
|
|
|
return (n <= -1)? -1: fmtout.count;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main ()
|
|
|
|
{
|
|
|
|
hawk_uch_t x[] = { 'A', L'\uBB33', L'\uBB34', L'\uBB35', 'Q', '\0' };
|
|
|
|
hawk_ooi_t cnt;
|
|
|
|
|
2022-04-06 02:21:46 +00:00
|
|
|
no_plan ();
|
|
|
|
|
2019-12-13 04:29:58 +00:00
|
|
|
setlocale (LC_ALL, NULL);
|
|
|
|
cnt = bfmt_out ("[%s %d %020X %ls %s %w %.*lk]\n", "test", 10, 0x1232, x, "code", x, HAWK_SIZEOF_UCH_T * 3, x);
|
|
|
|
|
|
|
|
/* this unit is the number of characters written. but some are written as bch and some other as uch.
|
|
|
|
* if uch and bch data are mixed, the count returned doesn't really tell how many bytes or characters written */
|
|
|
|
bfmt_out ("wrote [%ld] units\n", cnt);
|
|
|
|
#if (HAWK_SIZEOF_UCH_T == 2)
|
|
|
|
# define EXPECTED_LEN 98
|
|
|
|
#elif (HAWK_SIZEOF_UCH_T == 4)
|
|
|
|
# define EXPECTED_LEN 122
|
|
|
|
#else
|
|
|
|
# error UNSUPPORTED UCH SIZE
|
|
|
|
#endif
|
2022-04-06 02:21:46 +00:00
|
|
|
OK (cnt == EXPECTED_LEN, "bfmt_out test #1");
|
2019-12-13 04:29:58 +00:00
|
|
|
|
2022-04-06 02:21:46 +00:00
|
|
|
return exit_status();
|
2019-12-13 04:29:58 +00:00
|
|
|
}
|