DUPLOCALE
Section: Linux Programmer's Manual (3)
Updated: 2020-11-01
Index
JM Home Page
roff page
 
名前
duplocale - ロケールオブジェクトを複製する
 
書式
#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
 
説明
duplocale() 関数は locobj が参照するロケールオブジェクトの複製を作成する。
locobj が LC_GLOBAL_LOCALE の場合、 duplocale() は setlocale(3)
により判定されたグローバルロケールのコピーを含むロケールオブジェクトを作成する。
 
返り値
成功すると、 duplocale() は新しいロケールオブジェクトのハンドルを返す。 エラーの場合、 (locale_t) 0 を返し、
errno にエラーの原因を示す値を設定する。
 
エラー
- ENOMEM
- 
ロケールオブジェクトの複製を作成するのに十分なメモリーがない。
バージョン
duplocale() 関数は GNU C ライブラリのバージョン 2.3 で初めて登場した。
 
準拠
POSIX.1-2008.
 
注意
ロケールの複製は以下のことを行う際に役立つ。
- *
- 
ロケールオブジェクトのコピーを作成し、  (newlocale(3) を使って) いくつかのカテゴリーだけを変更する。
- *
- 
現在のロケールに対するハンドルを取得する。 このハンドルはロケールハンドルを受け取る他の関数 (toupper_l(3) など) で使用できる。
これを行うには、 以下の呼び出しが返した値を duplocale() に渡せばよい。
- 
 loc = uselocale((locale_t) 0);
- 
上記の uselocale(3) の呼び出しは値 LC_GLOBAL_LOCALE を返すことがあり、 この値を
toupper_l(3) などの関数に渡した場合の動作は不定なので、 この方法は必要である。 duplocale()
を呼び出すことで、確実に LC_GLOBAL_LOCALE が使用可能なロケールオブジェクトに変換することができる。 下記の「例」を参照。
duplocale() で作成された各ロケールオブジェクトは freelocale(3) を使って解放すべきである。
 
例
以下のプログラムでは、 toupper_l(3) に渡す現在のロケールのハンドルを取得するのに uselocale(3) と
duplocale() を使用する。
このプログラムはコマンドライン引数として文字列を一つ取る。この文字列は、大文字に変換され、標準出力に表示される。 以下は使用例である。
$ ./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() は toupper_l() の
       引数として渡すことができない値 LC_GLOBAL_LOCALE を返す
       可能性があるからである。 */
    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);
}
 
関連項目
freelocale(3), newlocale(3), setlocale(3), uselocale(3),
locale(5), locale(7)
 
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/ に書かれている。
 Index
- 名前
- 
- 書式
- 
- 説明
- 
- 返り値
- 
- エラー
- 
- バージョン
- 
- 準拠
- 
- 注意
- 
- 例
- 
- プログラムのソース
- 
 
- 関連項目
- 
- この文書について
- 
This document was created by
man2html,
using the manual pages.