added qse_utf8cmgr and qse_loccmgr
This commit is contained in:
		| @ -42,6 +42,9 @@ struct qse_mbstate_t | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | extern qse_cmgr_t* qse_utf8cmgr; | ||||||
|  | extern qse_cmgr_t* qse_loccmgr; | ||||||
|  |  | ||||||
| qse_cmgr_t* qse_getdflcmgr ( | qse_cmgr_t* qse_getdflcmgr ( | ||||||
| 	void | 	void | ||||||
| ); | ); | ||||||
|  | |||||||
| @ -716,7 +716,6 @@ struct qse_mmgr_t | |||||||
| }; | }; | ||||||
| typedef struct qse_mmgr_t qse_mmgr_t; | typedef struct qse_mmgr_t qse_mmgr_t; | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef qse_size_t (*qse_cmgr_mbtowc_t) ( | typedef qse_size_t (*qse_cmgr_mbtowc_t) ( | ||||||
| 	const qse_mchar_t* mb,  | 	const qse_mchar_t* mb,  | ||||||
| 	qse_size_t         size, | 	qse_size_t         size, | ||||||
| @ -730,7 +729,8 @@ typedef qse_size_t (*qse_cmgr_wctomb_t) ( | |||||||
| ); | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_cmgr_t type defines the interface to various character handling. |  * The qse_cmgr_t type defines the character-level interface to  | ||||||
|  |  * multibyte/wide-character string conversion. | ||||||
|  */ |  */ | ||||||
| struct qse_cmgr_t | struct qse_cmgr_t | ||||||
| { | { | ||||||
|  | |||||||
| @ -21,20 +21,23 @@ | |||||||
| #include <qse/cmn/mbwc.h> | #include <qse/cmn/mbwc.h> | ||||||
| #include <qse/cmn/utf8.h> | #include <qse/cmn/utf8.h> | ||||||
|  |  | ||||||
|  | static qse_cmgr_t builtin_cmgr[] = | ||||||
| static qse_cmgr_t utf8_cmgr = |  | ||||||
| { | { | ||||||
| 	qse_utf8touc, |  | ||||||
| 	qse_uctoutf8 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| static qse_cmgr_t locale_cmgr = |  | ||||||
| 	{ | 	{ | ||||||
| 		qse_mbtowc, | 		qse_mbtowc, | ||||||
| 		qse_wctomb | 		qse_wctomb | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	{ | ||||||
|  | 		qse_utf8touc, | ||||||
|  | 		qse_uctoutf8 | ||||||
|  | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static qse_cmgr_t* dfl_cmgr = &locale_cmgr; | qse_cmgr_t* qse_loccmgr = &builtin_cmgr[0]; | ||||||
|  | qse_cmgr_t* qse_utf8cmgr = &builtin_cmgr[1]; | ||||||
|  |  | ||||||
|  | static qse_cmgr_t* dfl_cmgr = &builtin_cmgr[0]; | ||||||
|  |  | ||||||
| qse_cmgr_t* qse_getdflcmgr (void) | qse_cmgr_t* qse_getdflcmgr (void) | ||||||
| { | { | ||||||
| @ -43,7 +46,7 @@ qse_cmgr_t* qse_getdflcmgr (void) | |||||||
|  |  | ||||||
| void qse_setdflcmgr (qse_cmgr_t* cmgr) | void qse_setdflcmgr (qse_cmgr_t* cmgr) | ||||||
| { | { | ||||||
| 	dfl_cmgr = (cmgr? cmgr: &locale_cmgr); | 	dfl_cmgr = (cmgr? cmgr: &builtin_cmgr[0]); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* string conversion function using default character conversion manager */ | /* string conversion function using default character conversion manager */ | ||||||
| @ -66,7 +69,8 @@ int qse_mbsntowcsnupto ( | |||||||
| 	const qse_mchar_t* mbs, qse_size_t* mbslen, | 	const qse_mchar_t* mbs, qse_size_t* mbslen, | ||||||
| 	qse_wchar_t* wcs, qse_size_t* wcslen, qse_wchar_t stopper) | 	qse_wchar_t* wcs, qse_size_t* wcslen, qse_wchar_t stopper) | ||||||
| { | { | ||||||
| 	return qse_mbsntowcsnuptowithcmgr (mbs, mbslen, wcs, wcslen, stopper, dfl_cmgr); | 	return qse_mbsntowcsnuptowithcmgr ( | ||||||
|  | 		mbs, mbslen, wcs, wcslen, stopper, dfl_cmgr); | ||||||
| } | } | ||||||
|  |  | ||||||
| qse_wchar_t* qse_mbstowcsdup (const qse_mchar_t* mbs, qse_mmgr_t* mmgr) | qse_wchar_t* qse_mbstowcsdup (const qse_mchar_t* mbs, qse_mmgr_t* mmgr) | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include <qse/cmn/sio.h> | #include <qse/cmn/sio.h> | ||||||
|  | #include <qse/cmn/mbwc.h> | ||||||
| #include <qse/cmn/mem.h> | #include <qse/cmn/mem.h> | ||||||
| #include <qse/cmn/fmt.h> | #include <qse/cmn/fmt.h> | ||||||
| #include <qse/cmn/stdio.h> | #include <qse/cmn/stdio.h> | ||||||
| @ -143,11 +144,24 @@ static int test3 (void) | |||||||
|  |  | ||||||
| int main () | int main () | ||||||
| { | { | ||||||
| #if 0 |  | ||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| 	UINT old_cp = GetConsoleOutputCP(); |      char locale[100]; | ||||||
| 	SetConsoleOutputCP (CP_UTF8); | 	UINT codepage = GetConsoleOutputCP();	 | ||||||
| #endif | 	if (codepage == CP_UTF8) | ||||||
|  | 	{ | ||||||
|  | 		/*SetConsoleOutputCP (CP_UTF8);*/ | ||||||
|  | 		qse_setdflcmgr (qse_utf8cmgr); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  |      	sprintf (locale, ".%u", (unsigned int)codepage); | ||||||
|  |      	setlocale (LC_ALL, locale); | ||||||
|  | 		qse_setdflcmgr (qse_loccmgr); | ||||||
|  | 	} | ||||||
|  | #else | ||||||
|  |      setlocale (LC_ALL, ""); | ||||||
|  | 	qse_setdflcmgr (qse_loccmgr); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	setlocale (LC_ALL, ""); | 	setlocale (LC_ALL, ""); | ||||||
| @ -159,11 +173,5 @@ int main () | |||||||
| 	R (test3); | 	R (test3); | ||||||
|  |  | ||||||
| 	qse_sio_close (g_out); | 	qse_sio_close (g_out); | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| #if defined(_WIN32) |  | ||||||
| 	SetConsoleOutputCP (old_cp); |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| #include <qse/cmn/sio.h> | #include <qse/cmn/sio.h> | ||||||
|  | #include <qse/cmn/mbwc.h> | ||||||
| #include <qse/cmn/mem.h> | #include <qse/cmn/mem.h> | ||||||
| #include <qse/cmn/stdio.h> | #include <qse/cmn/stdio.h> | ||||||
|  |  | ||||||
| @ -129,17 +130,22 @@ static int test3 (void) | |||||||
| int main () | int main () | ||||||
| { | { | ||||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||||
| 	char codepage[100]; |      char locale[100]; | ||||||
| 	UINT old_cp = GetConsoleOutputCP(); | 	UINT codepage = GetConsoleOutputCP();	 | ||||||
| 	SetConsoleOutputCP (CP_UTF8); | 	if (codepage == CP_UTF8) | ||||||
|  | 	{ | ||||||
| 	/* TODO: on windows this set locale only affects those mbcs fucntions in clib. | 		/*SetConsoleOUtputCP (CP_UTF8);*/ | ||||||
| 	 * it doesn't support utf8 i guess find a working way. the following won't work  | 		qse_setdflcmgr (qse_utf8cmgr); | ||||||
| 	sprintf (codepage, ".%d", GetACP()); | 	} | ||||||
| 	setlocale (LC_ALL, codepage); | 	else | ||||||
| 	*/ | 	{ | ||||||
|  |      	sprintf (locale, ".%u", (unsigned int)codepage); | ||||||
|  |      	setlocale (LC_ALL, locale); | ||||||
|  | 		qse_setdflcmgr (qse_loccmgr); | ||||||
|  | 	} | ||||||
| #else | #else | ||||||
|      setlocale (LC_ALL, ""); |      setlocale (LC_ALL, ""); | ||||||
|  | 	qse_setdflcmgr (qse_loccmgr); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	qse_printf (QSE_T("--------------------------------------------------------------------------------\n")); | 	qse_printf (QSE_T("--------------------------------------------------------------------------------\n")); | ||||||
| @ -150,8 +156,5 @@ int main () | |||||||
| 	R (test2); | 	R (test2); | ||||||
| 	R (test3); | 	R (test3); | ||||||
|  |  | ||||||
| #if defined(_WIN32) |  | ||||||
| 	SetConsoleOutputCP (old_cp); |  | ||||||
| #endif |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user