plucky (3) rpmatch.3.gz

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

名前

       rpmatch - 質問への応答が肯定か否定かを判定する

書式

       #include <stdlib.h>

       int rpmatch(const char *response);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       rpmatch():
           Since glibc 2.19:
               _DEFAULT_SOURCE
           Glibc 2.19 and earlier:
               _SVID_SOURCE

説明

       rpmatch()  は yes/no の質問に対するユーザーからの応答を処理する。 国際化 (I18N) に対応している。

       response にはユーザーからの応答を格納したヌル終端文字列が入っている必要がある。 たいていは、 fgets(3)  や
       getline(3)  で取り込んだものであろう。

       プログラムが  setlocale(3)   を呼び出して環境変数の変更を有効にした場合、  環境変数  LANG,   LC_MESSAGES,
       LC_ALL が ユーザーの言語設定として考慮される。

       ロケールに関わらず、^[Yy] にマッチする応答は常に肯定だと解釈され、 ^[Nn] にマッチする応答は常に否定だと解
       釈される。

返り値

       response を検査した後、 rpmatch()  は否定的な応答 ("no") と認識した場合は 0 を返し、 肯定的な応答 ("yes")
       と認識した場合は 1 を返す。 response の値を解釈できなかった場合は -1 を返す。

エラー

       返り値  -1 が返った場合、入力が不正であったか、他の何らかのエラーが あったことを意味する。返り値が 0 以外
       かどうかを確認するだけでは 十分ではない。

       rpmatch()  は、 regcomp(3)  や  regexec(3)   が失敗する理由のどれかで失敗することがある。  エラーの原因を
       errno や他の何かで知ることはできないが、 errno は正規表現エンジンの失敗の原因を示している (但し、このケー
       スと response の値を認識できずに失敗した場合を区別することはできない)。

属性

       この節で使用されている用語の説明については、 attributes(7) を参照。

       ┌─────────────────┬───────────────┬────────────────┐
       │インターフェース属性             │
       ├─────────────────┼───────────────┼────────────────┤
       │rpmatch()        │ Thread safety │ MT-Safe locale │
       └─────────────────┴───────────────┴────────────────┘

準拠

       rpmatch()  はどの標準でも必須となっていないが、 Linux 以外にも利用できるシステムもいくつかは存在する。

バグ

       rpmatch()  の実装は response の最初の 1 文字だけを見ているようである。その結果、  "nyes"  は  0  を返し、
       "ynever; not in a million years" は 1 を返すことになる。 入力文字列をもっと厳密に解釈した方がよいだろう。
       例えば、 (regex(7)  で説明されている拡張正規表現を使って)  ^([yY]|yes|YES)$^([nN]|no|NO)$  で解釈する
       など。

       以下のプログラムは、コマンドライン引数で 指定された文字列を rpmatch()  に渡した場合の結果を表示する。

       #define _SVID_SOURCE
       #include <locale.h>
       #include <stdlib.h>
       #include <string.h>
       #include <stdio.h>

       int
       main(int argc, char *argv[])
       {
           if (argc != 2 || strcmp(argv[1], "--help") == 0) {
               fprintf(stderr, "%s response\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           setlocale(LC_ALL, "");
           printf("rpmatch() returns: %d\n", rpmatch(argv[1]));
           exit(EXIT_SUCCESS);
       }

関連項目

       fgets(3), getline(3), nl_langinfo(3), regcomp(3), setlocale(3)

この文書について

       この  man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告
       に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。