NAME
duplocale - 로캘 객체 복제하기
SYNOPSIS
#include <locale.h>
locale_t duplocale(locale_t locobj);
glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):
duplocale()
:-
- glibc 2.10부터:
_XOPEN_SOURCE >= 700
- glibc 2.10 전:
_GNU_SOURCE
DESCRIPTION
duplocale()
함수는 locobj
가 가리키는 로캘 객체의 복제본을 만든다.
locobj
가 LC_GLOBAL_LOCALE
이면 setlocale(3)로 정한 전역 로캘의 사본을 담은 로캘 객체를 만든다.
RETURN VALUE
성공 시 duplocale()
은 새 로캘 객체의 핸들을 반환한다. 오류 발생 시 (locale_t) 0
을 반환하며 오류를 나타내도록 errno
를 설정한다.
ERRORS
ENOMEM
- 로캘 객체 복제본을 만들 메모리가 충분치 않음.
VERSIONS
GNU C 라이브러리 2.3에서 duplocale()
함수가 처음 등장했다.
CONFORMING TO
POSIX.1-2008.
NOTES
다음 용도로 로캘을 복제하게 될 수 있다.
-
한 가지 이상 범주를 변경할 로캘 객체 사본 만들기. (newlocale(3) 사용.)
-
현재 로캘 핸들을 얻어서 toupper_l(3)처럼 로캘 핸들을 이용하는 다른 함수에 사용하기. 이를 위해 다음 호출이 반환한 값에
duplocale()
을 적용한다.loc = uselocale((locale_t) 0);
이런 기법이 필요한 이유는 위의 uselocale(3) 호출이
LC_GLOBAL_LOCALE
값을 반환할 수도 있기 때문이다. 그 값을 toupper_l(3) 같은 함수에 주면 규정 안 된 동작을 유발하게 된다.duplocale()
호출을 통해LC_GLOBAL_LOCALE
값이 사용 가능한 로캘 객체로 바뀌게 할 수 있다. 아래 EXAMPLES 절 참고.
duplocale()
로 만든 로캘 객체 각각을 freelocale()로 해제해 줘야 한다.
EXAMPLES
아래 프로그램에선 uselocale(3)과 duplocale()
로 현재 로캘 핸들을 얻어서 toupper_l(3)에게 준다. 프로그램에서 명령행 인자 하나를 받는데, 그 문자열을 대문자로 변환해서 표준 출력으로 찍는다. 사용 예시는 다음과 같다.
$ ./a.out abc
ABC
프로그램 소스
#define _XOPEN_SOURCE 700
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
locale_t loc, nloc;
if (argc != 2) {
fprintf(stderr, "Usage: %s string\n", argv[0]);
exit(EXIT_FAILURE);
}
/* 다음 과정이 필요한 이유는 uselocale()이 LC_GLOBAL_LOCALE을
반환할 수도 있기 때문이다. 그 값은 toupper_l() 인자로
줄 수 없다. */
loc = uselocale((locale_t) 0);
if (loc == (locale_t) 0)
errExit("uselocale");
nloc = duplocale(loc);
if (nloc == (locale_t) 0)
errExit("duplocale");
for (char *p = argv[1]; *p; p++)
putchar(toupper_l(*p, nloc));
printf("\n");
freelocale(nloc);
exit(EXIT_SUCCESS);
}
SEE ALSO
freelocale(3), newlocale(3), setlocale(3), uselocale(3), locale(5), locale(7)
2021-03-22