169 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|     Copyright (c) 2006-2020 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 <hawk-utl.h>
 | |
| #include <hawk-chr.h>
 | |
| 
 | |
| /* ------------------------------------------------------------------------ */
 | |
| 
 | |
| static hawk_cmgr_t builtin_cmgr[] =
 | |
| {
 | |
| 	/* keep the order aligned with hawk_cmgr_id_t values in <hawk-utl.h> */
 | |
| 	{ hawk_utf8_to_uc,  hawk_uc_to_utf8 },
 | |
| 	{ hawk_utf16_to_uc, hawk_uc_to_utf16 },
 | |
| 	{ hawk_mb8_to_uc,   hawk_uc_to_mb8 }
 | |
| };
 | |
| 
 | |
| hawk_cmgr_t* hawk_get_cmgr_by_id (hawk_cmgr_id_t id)
 | |
| {
 | |
| 	return &builtin_cmgr[id];
 | |
| }
 | |
| 
 | |
| static struct
 | |
| {
 | |
| 	const hawk_bch_t* name;
 | |
| 	hawk_cmgr_id_t     id;
 | |
| } builtin_cmgr_tab[] =
 | |
| {
 | |
| 	{ "utf8",    HAWK_CMGR_UTF8 },
 | |
| 	{ "utf16",   HAWK_CMGR_UTF16 },
 | |
| 	{ "mb8",     HAWK_CMGR_MB8 }
 | |
| };
 | |
| 
 | |
| hawk_cmgr_t* hawk_get_cmgr_by_bcstr (const hawk_bch_t* name)
 | |
| {
 | |
| 	if (name)
 | |
| 	{
 | |
| 		hawk_oow_t i;
 | |
| 
 | |
| 		for (i = 0; i < HAWK_COUNTOF(builtin_cmgr_tab); i++)
 | |
| 		{
 | |
| 			if (hawk_comp_bcstr(name, builtin_cmgr_tab[i].name, 0) == 0)
 | |
| 			{
 | |
| 				return &builtin_cmgr[builtin_cmgr_tab[i].id];
 | |
| 			}
 | |
| 		 }
 | |
| 	}
 | |
| 
 | |
| 	return HAWK_NULL;
 | |
| }
 | |
| 
 | |
| hawk_cmgr_t* hawk_get_cmgr_by_ucstr (const hawk_uch_t* name)
 | |
| {
 | |
| 	if (name)
 | |
| 	{
 | |
| 		hawk_oow_t i;
 | |
| 
 | |
| 		for (i = 0; i < HAWK_COUNTOF(builtin_cmgr_tab); i++)
 | |
| 		{
 | |
| 			if (hawk_comp_ucstr_bcstr(name, builtin_cmgr_tab[i].name, 0) == 0)
 | |
| 			{
 | |
| 				return &builtin_cmgr[builtin_cmgr_tab[i].id];
 | |
| 			}
 | |
| 		 }
 | |
| 	}
 | |
| 
 | |
| 	return HAWK_NULL;
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------ */
 | |
| 
 | |
| int hawk_conv_utf8_to_uchars (const hawk_bch_t* bcs, hawk_oow_t* bcslen, hawk_uch_t* ucs, hawk_oow_t* ucslen)
 | |
| {
 | |
| 	/* the source is length bound */
 | |
| 	return hawk_conv_bchars_to_uchars_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAWK_CMGR_UTF8], 0);
 | |
| }
 | |
| 
 | |
| int hawk_conv_uchars_to_utf8 (const hawk_uch_t* ucs, hawk_oow_t* ucslen, hawk_bch_t* bcs, hawk_oow_t* bcslen)
 | |
| {
 | |
| 	/* length bound */
 | |
| 	return hawk_conv_uchars_to_bchars_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAWK_CMGR_UTF8]);
 | |
| }
 | |
| 
 | |
| int hawk_conv_utf8_to_ucstr (const hawk_bch_t* bcs, hawk_oow_t* bcslen, hawk_uch_t* ucs, hawk_oow_t* ucslen)
 | |
| {
 | |
| 	/* null-terminated. */
 | |
| 	return hawk_conv_bcstr_to_ucstr_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAWK_CMGR_UTF8], 0);
 | |
| }
 | |
| 
 | |
| int hawk_conv_ucstr_to_utf8 (const hawk_uch_t* ucs, hawk_oow_t* ucslen, hawk_bch_t* bcs, hawk_oow_t* bcslen)
 | |
| {
 | |
| 	/* null-terminated */
 | |
| 	return hawk_conv_ucstr_to_bcstr_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAWK_CMGR_UTF8]);
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------ */
 | |
| 
 | |
| int hawk_conv_utf16_to_uchars (const hawk_bch_t* bcs, hawk_oow_t* bcslen, hawk_uch_t* ucs, hawk_oow_t* ucslen)
 | |
| {
 | |
| 	/* the source is length bound */
 | |
| 	return hawk_conv_bchars_to_uchars_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAWK_CMGR_UTF16], 0);
 | |
| }
 | |
| 
 | |
| int hawk_conv_uchars_to_utf16 (const hawk_uch_t* ucs, hawk_oow_t* ucslen, hawk_bch_t* bcs, hawk_oow_t* bcslen)
 | |
| {
 | |
| 	/* length bound */
 | |
| 	return hawk_conv_uchars_to_bchars_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAWK_CMGR_UTF16]);
 | |
| }
 | |
| 
 | |
| int hawk_conv_utf16_to_ucstr (const hawk_bch_t* bcs, hawk_oow_t* bcslen, hawk_uch_t* ucs, hawk_oow_t* ucslen)
 | |
| {
 | |
| 	/* null-terminated. */
 | |
| 	return hawk_conv_bcstr_to_ucstr_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAWK_CMGR_UTF16], 0);
 | |
| }
 | |
| 
 | |
| int hawk_conv_ucstr_to_utf16 (const hawk_uch_t* ucs, hawk_oow_t* ucslen, hawk_bch_t* bcs, hawk_oow_t* bcslen)
 | |
| {
 | |
| 	/* null-terminated */
 | |
| 	return hawk_conv_ucstr_to_bcstr_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAWK_CMGR_UTF16]);
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------ */
 | |
| 
 | |
| int hawk_conv_mb8_to_uchars (const hawk_bch_t* bcs, hawk_oow_t* bcslen, hawk_uch_t* ucs, hawk_oow_t* ucslen)
 | |
| {
 | |
| 	/* the source is length bound */
 | |
| 	return hawk_conv_bchars_to_uchars_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAWK_CMGR_MB8], 0);
 | |
| }
 | |
| 
 | |
| int hawk_conv_uchars_to_mb8 (const hawk_uch_t* ucs, hawk_oow_t* ucslen, hawk_bch_t* bcs, hawk_oow_t* bcslen)
 | |
| {
 | |
| 	/* length bound */
 | |
| 	return hawk_conv_uchars_to_bchars_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAWK_CMGR_MB8]);
 | |
| }
 | |
| 
 | |
| int hawk_conv_mb8_to_ucstr (const hawk_bch_t* bcs, hawk_oow_t* bcslen, hawk_uch_t* ucs, hawk_oow_t* ucslen)
 | |
| {
 | |
| 	/* null-terminated. */
 | |
| 	return hawk_conv_bcstr_to_ucstr_with_cmgr(bcs, bcslen, ucs, ucslen, &builtin_cmgr[HAWK_CMGR_MB8], 0);
 | |
| }
 | |
| 
 | |
| int hawk_conv_ucstr_to_mb8 (const hawk_uch_t* ucs, hawk_oow_t* ucslen, hawk_bch_t* bcs, hawk_oow_t* bcslen)
 | |
| {
 | |
| 	/* null-terminated */
 | |
| 	return hawk_conv_ucstr_to_bcstr_with_cmgr(ucs, ucslen, bcs, bcslen, &builtin_cmgr[HAWK_CMGR_MB8]);
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------ */
 |