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
 |