| 
									
										
										
										
											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
										 |  |  | } |