408 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			408 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								    Copyright (c) 2016-2018 Chung, Hyung-Hwan. All rights reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 AUTHOR 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.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef _HAK_FMT_H_
							 | 
						||
| 
								 | 
							
								#define _HAK_FMT_H_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <hak-cmn.h>
							 | 
						||
| 
								 | 
							
								#include <stdarg.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** \file
							 | 
						||
| 
								 | 
							
								 * This file defines various formatting functions.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The hak_fmt_intmax_flag_t type defines enumerators to change the
							 | 
						||
| 
								 | 
							
								 * behavior of hak_fmt_intmax() and hak_fmt_uintmax().
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								enum hak_fmt_intmax_flag_t
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									/* Use lower 6 bits to represent base between 2 and 36 inclusive.
							 | 
						||
| 
								 | 
							
									 * Upper bits are used for these flag options */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Don't truncate if the buffer is not large enough */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_NOTRUNC = (0x40 << 0),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_NOTRUNC             HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_NOTRUNC            HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_NOTRUNC    HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_NOTRUNC   HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_NOTRUNC    HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_NOTRUNC   HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_NOTRUNC   HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_NOTRUNC  HAK_FMT_INTMAX_NOTRUNC
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Don't append a terminating null */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_NONULL = (0x40 << 1),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_NONULL             HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_NONULL            HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_NONULL    HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_NONULL   HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_NONULL    HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_NONULL   HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_NONULL   HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_NONULL  HAK_FMT_INTMAX_NONULL
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Produce no digit for a value of zero  */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_NOZERO = (0x40 << 2),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_NOZERO             HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_NOZERO            HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_NOZERO    HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_NOZERO   HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_NOZERO    HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_NOZERO   HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_NOZERO   HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_NOZERO  HAK_FMT_INTMAX_NOZERO
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Produce a leading zero for a non-zero value */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_ZEROLEAD = (0x40 << 3),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_ZEROLEAD             HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_ZEROLEAD            HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_ZEROLEAD    HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_ZEROLEAD   HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_ZEROLEAD    HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_ZEROLEAD   HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_ZEROLEAD   HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_ZEROLEAD  HAK_FMT_INTMAX_ZEROLEAD
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Use uppercase letters for alphabetic digits */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_UPPERCASE = (0x40 << 4),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_UPPERCASE             HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_UPPERCASE            HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_UPPERCASE    HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_UPPERCASE   HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_UPPERCASE    HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_UPPERCASE   HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_UPPERCASE   HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_UPPERCASE  HAK_FMT_INTMAX_UPPERCASE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Insert a plus sign for a positive integer including 0 */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_PLUSSIGN = (0x40 << 5),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_PLUSSIGN             HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_PLUSSIGN            HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_PLUSSIGN    HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_PLUSSIGN   HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_PLUSSIGN    HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_PLUSSIGN   HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_PLUSSIGN   HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_PLUSSIGN  HAK_FMT_INTMAX_PLUSSIGN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Insert a space for a positive integer including 0 */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_EMPTYSIGN = (0x40 << 6),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_EMPTYSIGN             HAK_FMT_INTMAX_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_EMPTYSIGN            HAK_FMT_INTMAX_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_EMPTYSIGN    HAK_FMT_INTMAX_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_EMPTYSIGN   HAK_FMT_INTMAX_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_EMPTYSIGN    HAK_FMT_INTMAX_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_EMPTYSIGN   HAK_FMT_INTMAX_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Fill the right part of the string */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_FILLRIGHT = (0x40 << 7),
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_FILLRIGHT             HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_FILLRIGHT            HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_FILLRIGHT    HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_FILLRIGHT   HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_FILLRIGHT    HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_FILLRIGHT   HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_FILLRIGHT   HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_FILLRIGHT  HAK_FMT_INTMAX_FILLRIGHT
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Fill between the sign chacter and the digit part */
							 | 
						||
| 
								 | 
							
									HAK_FMT_INTMAX_FILLCENTER = (0x40 << 8)
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_FILLCENTER             HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_FILLCENTER            HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_BCSTR_FILLCENTER    HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_BCSTR_FILLCENTER   HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_UCSTR_FILLCENTER    HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_UCSTR_FILLCENTER   HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_INTMAX_TO_OOCSTR_FILLCENTER   HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								#define HAK_FMT_UINTMAX_TO_OOCSTR_FILLCENTER  HAK_FMT_INTMAX_FILLCENTER
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* =========================================================================
							 | 
						||
| 
								 | 
							
								 * FORMATTED OUTPUT
							 | 
						||
| 
								 | 
							
								 * ========================================================================= */
							 | 
						||
| 
								 | 
							
								typedef struct hak_fmtout_t hak_fmtout_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef int (*hak_fmtout_putbchars_t) (
							 | 
						||
| 
								 | 
							
									hak_t*            hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*     fmtout,
							 | 
						||
| 
								 | 
							
									const hak_bch_t*  ptr,
							 | 
						||
| 
								 | 
							
									hak_oow_t         len
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef int (*hak_fmtout_putuchars_t) (
							 | 
						||
| 
								 | 
							
									hak_t*            hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*     fmtout,
							 | 
						||
| 
								 | 
							
									const hak_uch_t*  ptr,
							 | 
						||
| 
								 | 
							
									hak_oow_t         len
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef int (*hak_fmtout_putobj_t) (
							 | 
						||
| 
								 | 
							
									hak_t*            hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*     fmtout,
							 | 
						||
| 
								 | 
							
									hak_oop_t         obj
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum hak_fmtout_fmt_type_t
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									HAK_FMTOUT_FMT_TYPE_BCH = 0,
							 | 
						||
| 
								 | 
							
									HAK_FMTOUT_FMT_TYPE_UCH
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								typedef enum hak_fmtout_fmt_type_t hak_fmtout_fmt_type_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct hak_fmtout_t
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									hak_oow_t              count; /* out */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									hak_mmgr_t*            mmgr; /* in */
							 | 
						||
| 
								 | 
							
									hak_fmtout_putbchars_t putbchars; /* in */
							 | 
						||
| 
								 | 
							
									hak_fmtout_putuchars_t putuchars; /* in */
							 | 
						||
| 
								 | 
							
									hak_fmtout_putobj_t    putobj; /* in - %O is not handled if it's not set. */
							 | 
						||
| 
								 | 
							
									hak_bitmask_t          mask;   /* in */
							 | 
						||
| 
								 | 
							
									void*                  ctx;    /* in */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* internally set as input */
							 | 
						||
| 
								 | 
							
									hak_fmtout_fmt_type_t  fmt_type;
							 | 
						||
| 
								 | 
							
									const void*            fmt_str;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* =========================================================================
							 | 
						||
| 
								 | 
							
								 * FORMATTED INPUT
							 | 
						||
| 
								 | 
							
								 * ========================================================================= */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct hak_fmtin_t hak_fmtin_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct hak_fmtin_t
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
									hak_fmtin_getbchars_t getbchars; /* in */
							 | 
						||
| 
								 | 
							
									hak_fmtin_getuchars_t getuchars; /* in */
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
									void*                 ctx; /* in */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__cplusplus)
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The hak_fmt_intmax_to_bcstr() function formats an integer \a value to a
							 | 
						||
| 
								 | 
							
								 * multibyte string according to the given base and writes it to a buffer
							 | 
						||
| 
								 | 
							
								 * pointed to by \a buf. It writes to the buffer at most \a size characters
							 | 
						||
| 
								 | 
							
								 * including the terminating null. The base must be between 2 and 36 inclusive
							 | 
						||
| 
								 | 
							
								 * and can be ORed with zero or more #hak_fmt_intmax_to_bcstr_flag_t enumerators.
							 | 
						||
| 
								 | 
							
								 * This ORed value is passed to the function via the \a base_and_flags
							 | 
						||
| 
								 | 
							
								 * parameter. If the formatted string is shorter than \a bufsize, the redundant
							 | 
						||
| 
								 | 
							
								 * slots are filled with the fill character \a fillchar if it is not a null
							 | 
						||
| 
								 | 
							
								 * character. The filling behavior is determined by the flags shown below:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * - If #HAK_FMT_INTMAX_TO_BCSTR_FILLRIGHT is set in \a base_and_flags, slots
							 | 
						||
| 
								 | 
							
								 *   after the formatting string are filled.
							 | 
						||
| 
								 | 
							
								 * - If #HAK_FMT_INTMAX_TO_BCSTR_FILLCENTER is set in \a base_and_flags, slots
							 | 
						||
| 
								 | 
							
								 *   before the formatting string are filled. However, if it contains the
							 | 
						||
| 
								 | 
							
								 *   sign character, the slots between the sign character and the digit part
							 | 
						||
| 
								 | 
							
								 *   are filled.
							 | 
						||
| 
								 | 
							
								 * - If neither #HAK_FMT_INTMAX_TO_BCSTR_FILLRIGHT nor #HAK_FMT_INTMAX_TO_BCSTR_FILLCENTER
							 | 
						||
| 
								 | 
							
								 *   , slots before the formatting string are filled.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The \a precision parameter specified the minimum number of digits to
							 | 
						||
| 
								 | 
							
								 * produce from the \a value. If \a value produces fewer digits than
							 | 
						||
| 
								 | 
							
								 * \a precision, the actual digits are padded with '0' to meet the precision
							 | 
						||
| 
								 | 
							
								 * requirement. You can pass a negative number if you don't wish to specify
							 | 
						||
| 
								 | 
							
								 * precision.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The terminating null is not added if #HAK_FMT_INTMAX_TO_BCSTR_NONULL is set;
							 | 
						||
| 
								 | 
							
								 * The #HAK_FMT_INTMAX_TO_BCSTR_UPPERCASE flag indicates that the function should
							 | 
						||
| 
								 | 
							
								 * use the uppercase letter for a alphabetic digit;
							 | 
						||
| 
								 | 
							
								 * You can set #HAK_FMT_INTMAX_TO_BCSTR_NOTRUNC if you require lossless formatting.
							 | 
						||
| 
								 | 
							
								 * The #HAK_FMT_INTMAX_TO_BCSTR_PLUSSIGN flag and #HAK_FMT_INTMAX_TO_BCSTR_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								 * ensures that the plus sign and a space is added for a positive integer
							 | 
						||
| 
								 | 
							
								 * including 0 respectively.
							 | 
						||
| 
								 | 
							
								 * The #HAK_FMT_INTMAX_TO_BCSTR_ZEROLEAD flag ensures that the numeric string
							 | 
						||
| 
								 | 
							
								 * begins with '0' before applying the prefix.
							 | 
						||
| 
								 | 
							
								 * You can set the #HAK_FMT_INTMAX_TO_BCSTR_NOZERO flag if you want the value of
							 | 
						||
| 
								 | 
							
								 * 0 to produce nothing. If both #HAK_FMT_INTMAX_TO_BCSTR_NOZERO and
							 | 
						||
| 
								 | 
							
								 * #HAK_FMT_INTMAX_TO_BCSTR_ZEROLEAD are specified, '0' is still produced.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * If \a prefix is not #HAK_NULL, it is inserted before the digits.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * \return
							 | 
						||
| 
								 | 
							
								 *  - -1 if the base is not between 2 and 36 inclusive.
							 | 
						||
| 
								 | 
							
								 *  - negated number of characters required for lossless formatting
							 | 
						||
| 
								 | 
							
								 *   - if \a bufsize is 0.
							 | 
						||
| 
								 | 
							
								 *   - if #HAK_FMT_INTMAX_TO_BCSTR_NOTRUNC is set and \a bufsize is less than
							 | 
						||
| 
								 | 
							
								 *     the minimum required for lossless formatting.
							 | 
						||
| 
								 | 
							
								 *  - number of characters written to the buffer excluding a terminating
							 | 
						||
| 
								 | 
							
								 *    null in all other cases.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_fmt_intmax_to_bcstr (
							 | 
						||
| 
								 | 
							
									hak_bch_t*       buf,             /**< buffer pointer */
							 | 
						||
| 
								 | 
							
									int              bufsize,         /**< buffer size */
							 | 
						||
| 
								 | 
							
									hak_intmax_t     value,           /**< integer to format */
							 | 
						||
| 
								 | 
							
									int              base_and_flags,  /**< base ORed with flags */
							 | 
						||
| 
								 | 
							
									int              precision,       /**< precision */
							 | 
						||
| 
								 | 
							
									hak_bch_t        fillchar,        /**< fill character */
							 | 
						||
| 
								 | 
							
									const hak_bch_t* prefix           /**< prefix */
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The hak_fmt_intmax_to_ucstr() function formats an integer \a value to a
							 | 
						||
| 
								 | 
							
								 * wide-character string according to the given base and writes it to a buffer
							 | 
						||
| 
								 | 
							
								 * pointed to by \a buf. It writes to the buffer at most \a size characters
							 | 
						||
| 
								 | 
							
								 * including the terminating null. The base must be between 2 and 36 inclusive
							 | 
						||
| 
								 | 
							
								 * and can be ORed with zero or more #hak_fmt_intmax_to_ucstr_flag_t enumerators.
							 | 
						||
| 
								 | 
							
								 * This ORed value is passed to the function via the \a base_and_flags
							 | 
						||
| 
								 | 
							
								 * parameter. If the formatted string is shorter than \a bufsize, the redundant
							 | 
						||
| 
								 | 
							
								 * slots are filled with the fill character \a fillchar if it is not a null
							 | 
						||
| 
								 | 
							
								 * character. The filling behavior is determined by the flags shown below:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * - If #HAK_FMT_INTMAX_TO_UCSTR_FILLRIGHT is set in \a base_and_flags, slots
							 | 
						||
| 
								 | 
							
								 *   after the formatting string are filled.
							 | 
						||
| 
								 | 
							
								 * - If #HAK_FMT_INTMAX_TO_UCSTR_FILLCENTER is set in \a base_and_flags, slots
							 | 
						||
| 
								 | 
							
								 *   before the formatting string are filled. However, if it contains the
							 | 
						||
| 
								 | 
							
								 *   sign character, the slots between the sign character and the digit part
							 | 
						||
| 
								 | 
							
								 *   are filled.
							 | 
						||
| 
								 | 
							
								 * - If neither #HAK_FMT_INTMAX_TO_UCSTR_FILLRIGHT nor #HAK_FMT_INTMAX_TO_UCSTR_FILLCENTER
							 | 
						||
| 
								 | 
							
								 *   , slots before the formatting string are filled.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The \a precision parameter specified the minimum number of digits to
							 | 
						||
| 
								 | 
							
								 * produce from the \ value. If \a value produces fewer digits than
							 | 
						||
| 
								 | 
							
								 * \a precision, the actual digits are padded with '0' to meet the precision
							 | 
						||
| 
								 | 
							
								 * requirement. You can pass a negative number if don't wish to specify
							 | 
						||
| 
								 | 
							
								 * precision.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The terminating null is not added if #HAK_FMT_INTMAX_TO_UCSTR_NONULL is set;
							 | 
						||
| 
								 | 
							
								 * The #HAK_FMT_INTMAX_TO_UCSTR_UPPERCASE flag indicates that the function should
							 | 
						||
| 
								 | 
							
								 * use the uppercase letter for a alphabetic digit;
							 | 
						||
| 
								 | 
							
								 * You can set #HAK_FMT_INTMAX_TO_UCSTR_NOTRUNC if you require lossless formatting.
							 | 
						||
| 
								 | 
							
								 * The #HAK_FMT_INTMAX_TO_UCSTR_PLUSSIGN flag and #HAK_FMT_INTMAX_TO_UCSTR_EMPTYSIGN
							 | 
						||
| 
								 | 
							
								 * ensures that the plus sign and a space is added for a positive integer
							 | 
						||
| 
								 | 
							
								 * including 0 respectively.
							 | 
						||
| 
								 | 
							
								 * The #HAK_FMT_INTMAX_TO_UCSTR_ZEROLEAD flag ensures that the numeric string
							 | 
						||
| 
								 | 
							
								 * begins with 0 before applying the prefix.
							 | 
						||
| 
								 | 
							
								 * You can set the #HAK_FMT_INTMAX_TO_UCSTR_NOZERO flag if you want the value of
							 | 
						||
| 
								 | 
							
								 * 0 to produce nothing. If both #HAK_FMT_INTMAX_TO_UCSTR_NOZERO and
							 | 
						||
| 
								 | 
							
								 * #HAK_FMT_INTMAX_TO_UCSTR_ZEROLEAD are specified, '0' is still produced.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * If \a prefix is not #HAK_NULL, it is inserted before the digits.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * \return
							 | 
						||
| 
								 | 
							
								 *  - -1 if the base is not between 2 and 36 inclusive.
							 | 
						||
| 
								 | 
							
								 *  - negated number of characters required for lossless formatting
							 | 
						||
| 
								 | 
							
								 *   - if \a bufsize is 0.
							 | 
						||
| 
								 | 
							
								 *   - if #HAK_FMT_INTMAX_TO_UCSTR_NOTRUNC is set and \a bufsize is less than
							 | 
						||
| 
								 | 
							
								 *     the minimum required for lossless formatting.
							 | 
						||
| 
								 | 
							
								 *  - number of characters written to the buffer excluding a terminating
							 | 
						||
| 
								 | 
							
								 *    null in all other cases.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_fmt_intmax_to_ucstr (
							 | 
						||
| 
								 | 
							
									hak_uch_t*       buf,             /**< buffer pointer */
							 | 
						||
| 
								 | 
							
									int              bufsize,         /**< buffer size */
							 | 
						||
| 
								 | 
							
									hak_intmax_t     value,           /**< integer to format */
							 | 
						||
| 
								 | 
							
									int              base_and_flags,  /**< base ORed with flags */
							 | 
						||
| 
								 | 
							
									int              precision,       /**< precision */
							 | 
						||
| 
								 | 
							
									hak_uch_t        fillchar,        /**< fill character */
							 | 
						||
| 
								 | 
							
									const hak_uch_t* prefix           /**< prefix */
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The hak_fmt_uintmax_to_bcstr() function formats an unsigned integer \a value
							 | 
						||
| 
								 | 
							
								 * to a multibyte string buffer. It behaves the same as hak_fmt_intmax_to_bcstr()
							 | 
						||
| 
								 | 
							
								 * except that it handles an unsigned integer.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_fmt_uintmax_to_bcstr (
							 | 
						||
| 
								 | 
							
									hak_bch_t*       buf,             /**< buffer pointer */
							 | 
						||
| 
								 | 
							
									int              bufsize,         /**< buffer size */
							 | 
						||
| 
								 | 
							
									hak_uintmax_t    value,           /**< integer to format */
							 | 
						||
| 
								 | 
							
									int              base_and_flags,  /**< base ORed with flags */
							 | 
						||
| 
								 | 
							
									int              precision,       /**< precision */
							 | 
						||
| 
								 | 
							
									hak_bch_t        fillchar,        /**< fill character */
							 | 
						||
| 
								 | 
							
									const hak_bch_t* prefix           /**< prefix */
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The hak_fmt_uintmax_to_ucstr() function formats an unsigned integer \a value
							 | 
						||
| 
								 | 
							
								 * to a multibyte string buffer. It behaves the same as hak_fmt_intmax_to_ucstr()
							 | 
						||
| 
								 | 
							
								 * except that it handles an unsigned integer.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_fmt_uintmax_to_ucstr (
							 | 
						||
| 
								 | 
							
									hak_uch_t*       buf,             /**< buffer pointer */
							 | 
						||
| 
								 | 
							
									int              bufsize,         /**< buffer size */
							 | 
						||
| 
								 | 
							
									hak_uintmax_t    value,           /**< integer to format */
							 | 
						||
| 
								 | 
							
									int              base_and_flags,  /**< base ORed with flags */
							 | 
						||
| 
								 | 
							
									int              precision,       /**< precision */
							 | 
						||
| 
								 | 
							
									hak_uch_t        fillchar,        /**< fill character */
							 | 
						||
| 
								 | 
							
									const hak_uch_t* prefix           /**< prefix */
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(HAK_OOCH_IS_BCH)
							 | 
						||
| 
								 | 
							
								#	define hak_fmt_intmax_to_oocstr hak_fmt_intmax_to_bcstr
							 | 
						||
| 
								 | 
							
								#	define hak_fmt_uintmax_to_oocstr hak_fmt_uintmax_to_bcstr
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#	define hak_fmt_intmax_to_oocstr hak_fmt_intmax_to_ucstr
							 | 
						||
| 
								 | 
							
								#	define hak_fmt_uintmax_to_oocstr hak_fmt_uintmax_to_ucstr
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* TODO: hak_fmt_fltmax_to_bcstr()... hak_fmt_fltmax_to_ucstr() */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* =========================================================================
							 | 
						||
| 
								 | 
							
								 * FORMATTED OUTPUT
							 | 
						||
| 
								 | 
							
								 * ========================================================================= */
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_bfmt_outv (
							 | 
						||
| 
								 | 
							
									hak_t*           hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*    fmtout,
							 | 
						||
| 
								 | 
							
									const hak_bch_t* fmt,
							 | 
						||
| 
								 | 
							
									va_list          ap
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_ufmt_outv (
							 | 
						||
| 
								 | 
							
									hak_t*           hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*    fmtout,
							 | 
						||
| 
								 | 
							
									const hak_uch_t* fmt,
							 | 
						||
| 
								 | 
							
									va_list          ap
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_bfmt_out (
							 | 
						||
| 
								 | 
							
									hak_t*           hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*    fmtout,
							 | 
						||
| 
								 | 
							
									const hak_bch_t* fmt,
							 | 
						||
| 
								 | 
							
									...
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HAK_EXPORT int hak_ufmt_out (
							 | 
						||
| 
								 | 
							
									hak_t*           hak,
							 | 
						||
| 
								 | 
							
									hak_fmtout_t*    fmtout,
							 | 
						||
| 
								 | 
							
									const hak_uch_t* fmt,
							 | 
						||
| 
								 | 
							
									...
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(__cplusplus)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |