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