Manpages

名 前

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 が 参 照 す る ロ ケ ー ル オ ブ ジ ェ ク ト の 複 製 を 作 成 す る 。

locobjLC_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;
char *p;

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 (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 プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。