名 前
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;
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");
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/ に 書 か れ て い る 。