1/*
2 * Copyright 2010-2011, Oliver Tappe, zooey@hirschkaefer.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _ICU_CTYPE_DATA_H
6#define _ICU_CTYPE_DATA_H
7
8
9#include "ICUCategoryData.h"
10#include "LocaleBackend.h"
11
12
13namespace BPrivate {
14namespace Libroot {
15
16
17class ICUCtypeData : public ICUCategoryData {
18	typedef	ICUCategoryData		inherited;
19public:
20								ICUCtypeData(pthread_key_t tlsKey);
21	virtual 					~ICUCtypeData();
22
23			void				Initialize(LocaleCtypeDataBridge* dataBridge);
24
25	virtual	status_t			SetTo(const U_NAMESPACE_QUALIFIER Locale&
26										locale,
27									const char* posixLocaleName);
28	virtual	status_t			SetToPosix();
29
30			int					IsWCType(wint_t wc, wctype_t charClass);
31			status_t			ToWCTrans(wint_t wc, wctrans_t transition,
32									wint_t& result);
33
34			status_t			MultibyteToWchar(wchar_t* wcOut, const char* mb,
35									size_t mbLength, mbstate_t* mbState,
36									size_t& lengthOut);
37			status_t			MultibyteStringToWchar(wchar_t* wcDest,
38									size_t wcDestLength, const char** mbSource,
39									size_t mbSourceLength, mbstate_t* mbState,
40									size_t& lengthOut);
41			status_t			WcharToMultibyte(char* mbOut, wchar_t wc,
42									mbstate_t* mbState, size_t& lengthOut);
43			status_t			WcharStringToMultibyte(char* mbDest,
44									size_t mbDestLength,
45									const wchar_t** wcSource,
46									size_t wcSourceLength, mbstate_t* mbState,
47									size_t& lengthOut);
48
49			const char*			GetLanginfo(int index);
50
51private:
52			status_t			_GetConverterForMbState(mbstate_t* mbState,
53									UConverter*& converterOut);
54
55			status_t			_DropConverterFromMbState(mbstate_t* mbState);
56
57			/*
58			 * The following arrays have 384 elements where the elements at
59			 * index -128..-2 mirror the elements at index 128..255 (to protect
60			 * against invocations of ctype macros with negative character
61			 * values).
62			 * The element at index -1 is a dummy element containing the
63			 * neutral/identity value used when the array is accessed as in
64			 * 'isblank(EOF)' (i.e. with index -1).
65			 */
66			unsigned short		fClassInfo[384];
67			int					fToLowerMap[384];
68			int					fToUpperMap[384];
69
70			LocaleCtypeDataBridge*	fDataBridge;
71};
72
73
74}	// namespace Libroot
75}	// namespace BPrivate
76
77
78#endif	// _ICU_CTYPE_DATA_H
79