Home | History | Annotate | Download | only in locale.categories
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <locale>
     11 
     12 // Not a portable test
     13 
     14 // __scan_keyword
     15 // Scans [__b, __e) until a match is found in the basic_strings range
     16 //  [__kb, __ke) or until it can be shown that there is no match in [__kb, __ke).
     17 //  __b will be incremented (visibly), consuming CharT until a match is found
     18 //  or proved to not exist.  A keyword may be "", in which will match anything.
     19 //  If one keyword is a prefix of another, and the next CharT in the input
     20 //  might match another keyword, the algorithm will attempt to find the longest
     21 //  matching keyword.  If the longer matching keyword ends up not matching, then
     22 //  no keyword match is found.  If no keyword match is found, __ke is returned.
     23 //  Else an iterator pointing to the matching keyword is found.  If more than
     24 //  one keyword matches, an iterator to the first matching keyword is returned.
     25 //  If on exit __b == __e, eofbit is set in __err.  If __case_sensitive is false,
     26 //  __ct is used to force to lower case before comparing characters.
     27 //  Examples:
     28 //  Keywords:  "a", "abb"
     29 //  If the input is "a", the first keyword matches and eofbit is set.
     30 //  If the input is "abc", no match is found and "ab" are consumed.
     31 //
     32 // template <class _InputIterator, class _ForwardIterator, class _Ctype>
     33 // _ForwardIterator
     34 // __scan_keyword(_InputIterator& __b, _InputIterator __e,
     35 //                _ForwardIterator __kb, _ForwardIterator __ke,
     36 //                const _Ctype& __ct, ios_base::iostate& __err,
     37 //                bool __case_sensitive = true);
     38 
     39 #include <locale>
     40 #include <cassert>
     41 
     42 int main()
     43 {
     44     const std::ctype<char>& ct = std::use_facet<std::ctype<char> >(std::locale::classic());
     45     std::ios_base::iostate err = std::ios_base::goodbit;
     46     {
     47         const char input[] = "a";
     48         const char* in = input;
     49         std::string keys[] = {"a", "abb"};
     50         err = std::ios_base::goodbit;
     51         std::string* k = std::__scan_keyword(in, input+sizeof(input)-1,
     52                                              keys, keys+sizeof(keys)/sizeof(keys[0]),
     53                                              ct, err);
     54         assert(k - keys == 0);
     55         assert(in == input+1);
     56         assert(err == std::ios_base::eofbit);
     57     }
     58     {
     59         const char input[] = "abc";
     60         const char* in = input;
     61         std::string keys[] = {"a", "abb"};
     62         err = std::ios_base::goodbit;
     63         std::string* k = std::__scan_keyword(in, input+sizeof(input)-1,
     64                                              keys, keys+sizeof(keys)/sizeof(keys[0]),
     65                                              ct, err);
     66         assert(k - keys == 2);
     67         assert(in == input+2);
     68         assert(err == std::ios_base::failbit);
     69     }
     70     {
     71         const char input[] = "abb";
     72         const char* in = input;
     73         std::string keys[] = {"a", "abb"};
     74         err = std::ios_base::goodbit;
     75         std::string* k = std::__scan_keyword(in, input+sizeof(input)-1,
     76                                              keys, keys+sizeof(keys)/sizeof(keys[0]),
     77                                              ct, err);
     78         assert(k - keys == 1);
     79         assert(in == input+3);
     80         assert(err == std::ios_base::eofbit);
     81     }
     82     {
     83         const char input[] = "Tue ";
     84         const char* in = input;
     85         std::string keys[] = {"Mon", "Monday", "Tue", "Tuesday"};
     86         err = std::ios_base::goodbit;
     87         std::string* k = std::__scan_keyword(in, input+sizeof(input)-1,
     88                                              keys, keys+sizeof(keys)/sizeof(keys[0]),
     89                                              ct, err);
     90         assert(k - keys == 2);
     91         assert(in == input+3);
     92         assert(err == std::ios_base::goodbit);
     93     }
     94     {
     95         const char input[] = "tue ";
     96         const char* in = input;
     97         std::string keys[] = {"Mon", "Monday", "Tue", "Tuesday"};
     98         err = std::ios_base::goodbit;
     99         std::string* k = std::__scan_keyword(in, input+sizeof(input)-1,
    100                                              keys, keys+sizeof(keys)/sizeof(keys[0]),
    101                                              ct, err);
    102         assert(k - keys == 4);
    103         assert(in == input+0);
    104         assert(err == std::ios_base::failbit);
    105     }
    106     {
    107         const char input[] = "tue ";
    108         const char* in = input;
    109         std::string keys[] = {"Mon", "Monday", "Tue", "Tuesday"};
    110         err = std::ios_base::goodbit;
    111         std::string* k = std::__scan_keyword(in, input+sizeof(input)-1,
    112                                              keys, keys+sizeof(keys)/sizeof(keys[0]),
    113                                              ct, err, false);
    114         assert(k - keys == 2);
    115         assert(in == input+3);
    116         assert(err == std::ios_base::goodbit);
    117     }
    118 }
    119