5.7.2. 런타임 시 로케일 선택

C 라이브러리 함수 setlocale()은 해당 인수에서 지정된 로케일 범주에 대하여 런타임 시 로케일을 선택합니다. 이는 각 로케일 범주에서 별도로 요청된 locale을 선택하여 이루어집니다. 사실상 각 로케일 범주는 각 locale의 엔트리를 포함하는 작은 파일링 시스템입니다.

각 로케일 범주는 _get_lc_category와 같은 함수에 의해 처리됩니다. 예를 들면 다음과 같습니다.

void const *_get_lc_time (void *null, char const *locale_name)

_get_lc_time()은 이름이 locale_name인 로케일에 대한 time 파일링 시스템 진입점의 주소를 반환합니다(진입점이 없는 경우 NULL을 반환).

각 로케일 범주의 구현은 Table 5.9에서 보듯이 선택 함수를 제공해야 합니다.

Table 5.9. 로케일 범주 구현

함수설명
_get_lc_ctype()문자 특성이 들어 있는 사용자 정의 배열의 첫 번째 요소에 대한 포인터를 반환합니다. 자세한 내용은 _get_lc_ctype()을 참조하십시오.
_get_lc_collate()정렬 특성이 들어 있는 사용자 정의 배열의 첫 번째 요소에 대한 포인터를 반환합니다. 자세한 내용은 _get_lc_collate()를 참조하십시오.
_get_lc_monetary()사용자 정의 __lc_monetary_blk 구조에 대한 포인터를 반환합니다. 자세한 내용은 _get_lc_monetary()를 참조하십시오.
_get_lc_numeric()사용자 정의 __lc_numeric_blk 구조에 대한 포인터를 반환합니다. 자세한 내용은 _get_lc_numeric()을 참조하십시오.
_get_lc_time()사용자 정의 __lc_time_blk 구조에 대한 포인터를 반환합니다. 자세한 내용은 _get_lc_time()을 참조하십시오.

구현해야 할 대상을 설명하고 유용한 지원 매크로를 제공하는 C 헤더 파일은 locale.hrt_locale.h에서 제공됩니다.

구현

각 범주에 대해, 로케일 변경은 포인터를 로케일 범주에 대한 읽기 전용 데이터로 변경하여 이루어집니다. 기본 로케일을 제외하고, 데이터는 사용자가 제공해야 합니다.

범주의 모든 로케일 블록은 읽기 전용, 위치 독립적, 메모리 내 파일 시스템 구조로 수집됩니다. C 라이브러리는 파일 시스템 검색을 위해 블록 및 _findlocale() 함수를 만드는 매크로 세트를 제공합니다.

제공된 재구현을 시작 지점으로 사용하여 선택 가능한 런타임 로케일 세트를 정의할 수 있습니다. 응용 프로그램은 _get_lc_category 함수를 직접 호출하지 않습니다. _get_lc_category 함수는 setlocale()__rt_lib_init()에 의해 호출됩니다. Example 5.2에서 볼 수 있듯이 setlocale()이 사용할 수 있도록 _get_lc_category의 재구현 및 새 로케일 정의 블록을 제공하여 새로운 로케일을 구현합니다.

Example 5.2. get_lc_ctype

void const *_get_lc_ctype(void const *null, char const *name) {
    return _findlocale(&lcctype_c_index, name);
}
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0205GK
Non-Confidential