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