Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all bug

名前

       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/ に書かれている。