166 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.4 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.
 | 
						|
 */
 | 
						|
 | 
						|
#include <hak-cmgr.h>
 | 
						|
#include <hak-chr.h>
 | 
						|
#include <hak-str.h>
 | 
						|
 | 
						|
static hak_cmgr_t builtin_cmgr[] =
 | 
						|
{
 | 
						|
	/* keep the order aligned with hak_cmgr_id_t values in <hak-utl.h> */
 | 
						|
	{ hak_utf8_to_uc,  hak_uc_to_utf8 },
 | 
						|
	{ hak_utf16_to_uc, hak_uc_to_utf16 },
 | 
						|
	{ hak_mb8_to_uc,   hak_uc_to_mb8 }
 | 
						|
};
 | 
						|
 | 
						|
hak_cmgr_t* hak_get_cmgr_by_id (hak_cmgr_id_t id)
 | 
						|
{
 | 
						|
	return &builtin_cmgr[id];
 | 
						|
}
 | 
						|
 | 
						|
static struct
 | 
						|
{
 | 
						|
	const hak_bch_t* name;
 | 
						|
	hak_cmgr_id_t     id;
 | 
						|
} builtin_cmgr_tab[] =
 | 
						|
{
 | 
						|
	{ "utf8",    HAK_CMGR_UTF8 },
 | 
						|
	{ "utf16",   HAK_CMGR_UTF16 },
 | 
						|
	{ "mb8",     HAK_CMGR_MB8 }
 | 
						|
};
 | 
						|
 | 
						|
hak_cmgr_t* hak_get_cmgr_by_bcstr (const hak_bch_t* name)
 | 
						|
{
 | 
						|
	if (name)
 | 
						|
	{
 | 
						|
		hak_oow_t i;
 | 
						|
 | 
						|
		for (i = 0; i < HAK_COUNTOF(builtin_cmgr_tab); i++)
 | 
						|
		{
 | 
						|
			if (hak_comp_bcstr(name, builtin_cmgr_tab[i].name) == 0)
 | 
						|
			{
 | 
						|
				return &builtin_cmgr[builtin_cmgr_tab[i].id];
 | 
						|
			}
 | 
						|
		 }
 | 
						|
	}
 | 
						|
 | 
						|
	return HAK_NULL;
 | 
						|
}
 | 
						|
 | 
						|
hak_cmgr_t* hak_get_cmgr_by_ucstr (const hak_uch_t* name)
 | 
						|
{
 | 
						|
	if (name)
 | 
						|
	{
 | 
						|
		hak_oow_t i;
 | 
						|
 | 
						|
		for (i = 0; i < HAK_COUNTOF(builtin_cmgr_tab); i++)
 | 
						|
		{
 | 
						|
			if (hak_comp_ucstr_bcstr(name, builtin_cmgr_tab[i].name) == 0)
 | 
						|
			{
 | 
						|
				return &builtin_cmgr[builtin_cmgr_tab[i].id];
 | 
						|
			}
 | 
						|
		 }
 | 
						|
	}
 | 
						|
 | 
						|
	return HAK_NULL;
 | 
						|
}
 | 
						|
 | 
						|
/* ----------------------------------------------------------------------- */
 | 
						|
 | 
						|
int hak_conv_utf8_to_uchars (const hak_bch_t* bcs, hak_oow_t* bcslen, hak_uch_t* ucs, hak_oow_t* ucslen)
 | 
						|
{
 | 
						|
	/* the source is length bound */
 | 
						|
	return hak_conv_bchars_to_uchars_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAK_CMGR_UTF8], 0);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_uchars_to_utf8 (const hak_uch_t* ucs, hak_oow_t* ucslen, hak_bch_t* bcs, hak_oow_t* bcslen)
 | 
						|
{
 | 
						|
	/* length bound */
 | 
						|
	return hak_conv_uchars_to_bchars_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAK_CMGR_UTF8]);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_utf8_to_ucstr (const hak_bch_t* bcs, hak_oow_t* bcslen, hak_uch_t* ucs, hak_oow_t* ucslen)
 | 
						|
{
 | 
						|
	/* null-terminated. */
 | 
						|
	return hak_conv_bcstr_to_ucstr_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAK_CMGR_UTF8], 0);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_ucstr_to_utf8 (const hak_uch_t* ucs, hak_oow_t* ucslen, hak_bch_t* bcs, hak_oow_t* bcslen)
 | 
						|
{
 | 
						|
	/* null-terminated */
 | 
						|
	return hak_conv_ucstr_to_bcstr_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAK_CMGR_UTF8]);
 | 
						|
}
 | 
						|
 | 
						|
/* ----------------------------------------------------------------------- */
 | 
						|
 | 
						|
int hak_conv_utf16_to_uchars (const hak_bch_t* bcs, hak_oow_t* bcslen, hak_uch_t* ucs, hak_oow_t* ucslen)
 | 
						|
{
 | 
						|
	/* the source is length bound */
 | 
						|
	return hak_conv_bchars_to_uchars_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAK_CMGR_UTF16], 0);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_uchars_to_utf16 (const hak_uch_t* ucs, hak_oow_t* ucslen, hak_bch_t* bcs, hak_oow_t* bcslen)
 | 
						|
{
 | 
						|
	/* length bound */
 | 
						|
	return hak_conv_uchars_to_bchars_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAK_CMGR_UTF16]);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_utf16_to_ucstr (const hak_bch_t* bcs, hak_oow_t* bcslen, hak_uch_t* ucs, hak_oow_t* ucslen)
 | 
						|
{
 | 
						|
	/* null-terminated. */
 | 
						|
	return hak_conv_bcstr_to_ucstr_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAK_CMGR_UTF16], 0);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_ucstr_to_utf16 (const hak_uch_t* ucs, hak_oow_t* ucslen, hak_bch_t* bcs, hak_oow_t* bcslen)
 | 
						|
{
 | 
						|
	/* null-terminated */
 | 
						|
	return hak_conv_ucstr_to_bcstr_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAK_CMGR_UTF16]);
 | 
						|
}
 | 
						|
 | 
						|
/* ----------------------------------------------------------------------- */
 | 
						|
 | 
						|
int hak_conv_mb8_to_uchars (const hak_bch_t* bcs, hak_oow_t* bcslen, hak_uch_t* ucs, hak_oow_t* ucslen)
 | 
						|
{
 | 
						|
	/* the source is length bound */
 | 
						|
	return hak_conv_bchars_to_uchars_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAK_CMGR_MB8], 0);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_uchars_to_mb8 (const hak_uch_t* ucs, hak_oow_t* ucslen, hak_bch_t* bcs, hak_oow_t* bcslen)
 | 
						|
{
 | 
						|
	/* length bound */
 | 
						|
	return hak_conv_uchars_to_bchars_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAK_CMGR_MB8]);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_mb8_to_ucstr (const hak_bch_t* bcs, hak_oow_t* bcslen, hak_uch_t* ucs, hak_oow_t* ucslen)
 | 
						|
{
 | 
						|
	/* null-terminated. */
 | 
						|
	return hak_conv_bcstr_to_ucstr_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAK_CMGR_MB8], 0);
 | 
						|
}
 | 
						|
 | 
						|
int hak_conv_ucstr_to_mb8 (const hak_uch_t* ucs, hak_oow_t* ucslen, hak_bch_t* bcs, hak_oow_t* bcslen)
 | 
						|
{
 | 
						|
	/* null-terminated */
 | 
						|
	return hak_conv_ucstr_to_bcstr_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAK_CMGR_MB8]);
 | 
						|
}
 |