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가 가리키는 로캘 객체의 복제본을 만든다.

locobjLC_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

다음 용도로 로캘을 복제하게 될 수 있다.

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