1  // Namespace std::regex_constants -*- C++ -*-
       2  
       3  // Copyright (C) 2010-2023 Free Software Foundation, Inc.
       4  //
       5  // This file is part of the GNU ISO C++ Library.  This library is free
       6  // software; you can redistribute it and/or modify it under the
       7  // terms of the GNU General Public License as published by the
       8  // Free Software Foundation; either version 3, or (at your option)
       9  // any later version.
      10  
      11  // This library is distributed in the hope that it will be useful,
      12  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  // GNU General Public License for more details.
      15  
      16  // Under Section 7 of GPL version 3, you are granted additional
      17  // permissions described in the GCC Runtime Library Exception, version
      18  // 3.1, as published by the Free Software Foundation.
      19  
      20  // You should have received a copy of the GNU General Public License and
      21  // a copy of the GCC Runtime Library Exception along with this program;
      22  // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      23  // <http://www.gnu.org/licenses/>.
      24  
      25  /**
      26   *  @file bits/regex_constants.h
      27   *  @brief Constant definitions for the std regex library.
      28   *
      29   *  This is an internal header file, included by other library headers.
      30   *  Do not attempt to use it directly. @headername{regex}
      31   */
      32  
      33  namespace std _GLIBCXX_VISIBILITY(default)
      34  {
      35  _GLIBCXX_BEGIN_NAMESPACE_VERSION
      36  
      37  /**
      38   * @defgroup regex Regular Expressions
      39   *
      40   * A facility for performing regular expression pattern matching.
      41   *
      42   * @since C++11
      43   *
      44   * @{
      45   */
      46  
      47  /**
      48   * @namespace std::regex_constants
      49   * @brief ISO C++ 2011 namespace for options and flags used with std::regex
      50   */
      51  namespace regex_constants
      52  {
      53    /**
      54     * @name 5.1 Regular Expression Syntax Options
      55     */
      56    ///@{
      57  
      58    /**
      59     * @brief This is a bitmask type indicating how to interpret the regex.
      60     *
      61     * The @c syntax_option_type is implementation defined but it is valid to
      62     * perform bitwise operations on these values and expect the right thing to
      63     * happen.
      64     *
      65     * A valid value of type syntax_option_type shall have exactly one of the
      66     * elements @c ECMAScript, @c basic, @c extended, @c awk, @c grep, @c egrep
      67     * %set.
      68     */
      69    enum syntax_option_type : unsigned int
      70    {
      71      _S_icase		= 1 << 0,
      72      _S_nosubs		= 1 << 1,
      73      _S_optimize		= 1 << 2,
      74      _S_collate		= 1 << 3,
      75      _S_ECMAScript	= 1 << 4,
      76      _S_basic		= 1 << 5,
      77      _S_extended		= 1 << 6,
      78      _S_awk		= 1 << 7,
      79      _S_grep		= 1 << 8,
      80      _S_egrep		= 1 << 9,
      81      _S_polynomial	= 1 << 10,
      82      _S_multiline	= 1 << 11
      83    };
      84  
      85    /**
      86     * Specifies that the matching of regular expressions against a character
      87     * sequence shall be performed without regard to case.
      88     */
      89    _GLIBCXX17_INLINE constexpr syntax_option_type icase = _S_icase;
      90  
      91    /**
      92     * Specifies that when a regular expression is matched against a character
      93     * container sequence, no sub-expression matches are to be stored in the
      94     * supplied match_results structure.
      95     */
      96    _GLIBCXX17_INLINE constexpr syntax_option_type nosubs = _S_nosubs;
      97  
      98    /**
      99     * Specifies that the regular expression engine should pay more attention to
     100     * the speed with which regular expressions are matched, and less to the
     101     * speed with which regular expression objects are constructed. Otherwise
     102     * it has no detectable effect on the program output.
     103     */
     104    _GLIBCXX17_INLINE constexpr syntax_option_type optimize = _S_optimize;
     105  
     106    /**
     107     * Specifies that character ranges of the form [a-b] should be locale
     108     * sensitive.
     109     */
     110    _GLIBCXX17_INLINE constexpr syntax_option_type collate = _S_collate;
     111  
     112    /**
     113     * Specifies that the grammar recognized by the regular expression engine is
     114     * that used by ECMAScript in ECMA-262 [Ecma International, ECMAScript
     115     * Language Specification, Standard Ecma-262, third edition, 1999], as
     116     * modified in section [28.13].  This grammar is similar to that defined
     117     * in the PERL scripting language but extended with elements found in the
     118     * POSIX regular expression grammar.
     119     */
     120    _GLIBCXX17_INLINE constexpr syntax_option_type ECMAScript = _S_ECMAScript;
     121  
     122    /**
     123     * Specifies that the grammar recognized by the regular expression engine is
     124     * that used by POSIX basic regular expressions in IEEE Std 1003.1-2001,
     125     * Portable Operating System Interface (POSIX), Base Definitions and
     126     * Headers, Section 9, Regular Expressions [IEEE, Information Technology --
     127     * Portable Operating System Interface (POSIX), IEEE Standard 1003.1-2001].
     128     */
     129    _GLIBCXX17_INLINE constexpr syntax_option_type basic = _S_basic;
     130  
     131    /**
     132     * Specifies that the grammar recognized by the regular expression engine is
     133     * that used by POSIX extended regular expressions in IEEE Std 1003.1-2001,
     134     * Portable Operating System Interface (POSIX), Base Definitions and
     135     * Headers, Section 9, Regular Expressions.
     136     */
     137    _GLIBCXX17_INLINE constexpr syntax_option_type extended = _S_extended;
     138  
     139    /**
     140     * Specifies that the grammar recognized by the regular expression engine is
     141     * that used by POSIX utility awk in IEEE Std 1003.1-2001.  This option is
     142     * identical to syntax_option_type extended, except that C-style escape
     143     * sequences are supported.  These sequences are:
     144     * \\\\, \\a, \\b, \\f, \\n, \\r, \\t , \\v, \\&apos,, &apos,,
     145     * and \\ddd (where ddd is one, two, or three octal digits).
     146     */
     147    _GLIBCXX17_INLINE constexpr syntax_option_type awk = _S_awk;
     148  
     149    /**
     150     * Specifies that the grammar recognized by the regular expression engine is
     151     * that used by POSIX utility grep in IEEE Std 1003.1-2001.  This option is
     152     * identical to syntax_option_type basic, except that newlines are treated
     153     * as whitespace.
     154     */
     155    _GLIBCXX17_INLINE constexpr syntax_option_type grep = _S_grep;
     156  
     157    /**
     158     * Specifies that the grammar recognized by the regular expression engine is
     159     * that used by POSIX utility grep when given the -E option in
     160     * IEEE Std 1003.1-2001.  This option is identical to syntax_option_type
     161     * extended, except that newlines are treated as whitespace.
     162     */
     163    _GLIBCXX17_INLINE constexpr syntax_option_type egrep = _S_egrep;
     164  
     165  #if __cplusplus >= 201703L || !defined __STRICT_ANSI__
     166    // _GLIBCXX_RESOLVE_LIB_DEFECTS
     167    // 2503. multiline option should be added to syntax_option_type
     168    /**
     169     * Specifies that the `^` anchor matches at the beginning of a line,
     170     * and the `$` anchor matches at the end of a line, not only at the
     171     * beginning/end of the input.
     172     * Valid for the ECMAScript syntax, ignored otherwise.
     173     * @since C++17
     174     */
     175    _GLIBCXX17_INLINE constexpr syntax_option_type multiline = _S_multiline;
     176  #endif
     177  
     178    /// Extension: Equivalent to regex_constants::multiline for C++11 and C++14.
     179    _GLIBCXX17_INLINE constexpr syntax_option_type __multiline = _S_multiline;
     180  
     181    /**
     182     * Extension: Ensure both space complexity of compiled regex and
     183     * time complexity execution are not exponential.
     184     * If specified in a regex with back-references, the exception
     185     * regex_constants::error_complexity will be thrown.
     186     */
     187    _GLIBCXX17_INLINE constexpr syntax_option_type __polynomial = _S_polynomial;
     188  
     189    constexpr inline syntax_option_type
     190    operator&(syntax_option_type __a, syntax_option_type __b)
     191    {
     192      return (syntax_option_type)(static_cast<unsigned int>(__a)
     193  				& static_cast<unsigned int>(__b));
     194    }
     195  
     196    constexpr inline syntax_option_type
     197    operator|(syntax_option_type __a, syntax_option_type __b)
     198    {
     199      return (syntax_option_type)(static_cast<unsigned int>(__a)
     200  				| static_cast<unsigned int>(__b));
     201    }
     202  
     203    constexpr inline syntax_option_type
     204    operator^(syntax_option_type __a, syntax_option_type __b)
     205    {
     206      return (syntax_option_type)(static_cast<unsigned int>(__a)
     207  				^ static_cast<unsigned int>(__b));
     208    }
     209  
     210    constexpr inline syntax_option_type
     211    operator~(syntax_option_type __a)
     212    { return (syntax_option_type)(~static_cast<unsigned int>(__a)); }
     213  
     214    _GLIBCXX14_CONSTEXPR
     215    inline syntax_option_type&
     216    operator&=(syntax_option_type& __a, syntax_option_type __b)
     217    { return __a = __a & __b; }
     218  
     219    _GLIBCXX14_CONSTEXPR
     220    inline syntax_option_type&
     221    operator|=(syntax_option_type& __a, syntax_option_type __b)
     222    { return __a = __a | __b; }
     223  
     224    _GLIBCXX14_CONSTEXPR
     225    inline syntax_option_type&
     226    operator^=(syntax_option_type& __a, syntax_option_type __b)
     227    { return __a = __a ^ __b; }
     228  
     229    ///@}
     230  
     231    /**
     232     * @name 5.2 Matching Rules
     233     *
     234     * Matching a regular expression against a sequence of characters [first,
     235     * last) proceeds according to the rules of the grammar specified for the
     236     * regular expression object, modified according to the effects listed
     237     * below for any bitmask elements set.
     238     *
     239     */
     240    ///@{
     241  
     242    /**
     243     * @brief This is a bitmask type indicating regex matching rules.
     244     *
     245     * The @c match_flag_type is implementation defined but it is valid to
     246     * perform bitwise operations on these values and expect the right thing to
     247     * happen.
     248     */
     249    enum match_flag_type : unsigned int
     250    {
     251      _S_default,
     252      _S_not_bol		= 1 << 0,
     253      _S_not_eol		= 1 << 1,
     254      _S_not_bow		= 1 << 2,
     255      _S_not_eow		= 1 << 3,
     256      _S_any		= 1 << 4,
     257      _S_not_null		= 1 << 5,
     258      _S_continuous	= 1 << 6,
     259      _S_prev_avail	= 1 << 7,
     260      _S_sed		= 1 << 8,
     261      _S_no_copy		= 1 << 9,
     262      _S_first_only	= 1 << 10,
     263      _S_match_flag_last	= 1 << 11
     264    };
     265  
     266    /**
     267     * The default matching rules.
     268     */
     269    _GLIBCXX17_INLINE constexpr match_flag_type match_default = _S_default;
     270  
     271    /**
     272     * The first character in the sequence [first, last) is treated as though it
     273     * is not at the beginning of a line, so the character (^) in the regular
     274     * expression shall not match [first, first).
     275     */
     276    _GLIBCXX17_INLINE constexpr match_flag_type match_not_bol = _S_not_bol;
     277  
     278    /**
     279     * The last character in the sequence [first, last) is treated as though it
     280     * is not at the end of a line, so the character ($) in the regular
     281     * expression shall not match [last, last).
     282     */
     283    _GLIBCXX17_INLINE constexpr match_flag_type match_not_eol = _S_not_eol;
     284  
     285    /**
     286     * The expression \\b is not matched against the sub-sequence
     287     * [first,first).
     288     */
     289    _GLIBCXX17_INLINE constexpr match_flag_type match_not_bow = _S_not_bow;
     290  
     291    /**
     292     * The expression \\b should not be matched against the sub-sequence
     293     * [last,last).
     294     */
     295    _GLIBCXX17_INLINE constexpr match_flag_type match_not_eow = _S_not_eow;
     296  
     297    /**
     298     * If more than one match is possible then any match is an acceptable
     299     * result.
     300     */
     301    _GLIBCXX17_INLINE constexpr match_flag_type match_any = _S_any;
     302  
     303    /**
     304     * The expression does not match an empty sequence.
     305     */
     306    _GLIBCXX17_INLINE constexpr match_flag_type match_not_null = _S_not_null;
     307  
     308    /**
     309     * The expression only matches a sub-sequence that begins at first .
     310     */
     311    _GLIBCXX17_INLINE constexpr match_flag_type match_continuous = _S_continuous;
     312  
     313    /**
     314     * `--first` is a valid iterator position.  When this flag is set then the
     315     * flags `match_not_bol` and `match_not_bow` are ignored by the algorithms
     316     * `regex_match`, `regex_search`, and `regex_replace`, and by the iterators
     317     * `regex_iterator` and `regex_token_iterator`.
     318     */
     319    _GLIBCXX17_INLINE constexpr match_flag_type match_prev_avail = _S_prev_avail;
     320  
     321    /**
     322     * When a regular expression match is to be replaced by a new string, the
     323     * new string is constructed using the rules used by the ECMAScript replace
     324     * function in ECMA- 262 [Ecma International, ECMAScript Language
     325     * Specification, Standard Ecma-262, third edition, 1999], part 15.5.4.11
     326     * String.prototype.replace. In addition, during search and replace
     327     * operations all non-overlapping occurrences of the regular expression
     328     * are located and replaced, and sections of the input that did not match
     329     * the expression are copied unchanged to the output string.
     330     *
     331     * Format strings (from ECMA-262 [15.5.4.11]):
     332     * @li $$  The dollar-sign itself ($)
     333     * @li $&  The matched substring.
     334     * @li $`  The portion of @a string that precedes the matched substring.
     335     *         This would be match_results::prefix().
     336     * @li $'  The portion of @a string that follows the matched substring.
     337     *         This would be match_results::suffix().
     338     * @li $n  The nth capture, where n is in [1,9] and $n is not followed by a
     339     *         decimal digit.  If n <= match_results::size() and the nth capture
     340     *         is undefined, use the empty string instead.  If n >
     341     *         match_results::size(), the result is implementation-defined.
     342     * @li $nn The nnth capture, where nn is a two-digit decimal number on
     343     *         [01, 99].  If nn <= match_results::size() and the nth capture is
     344     *         undefined, use the empty string instead. If
     345     *         nn > match_results::size(), the result is implementation-defined.
     346     */
     347    _GLIBCXX17_INLINE constexpr match_flag_type format_default = _S_default;
     348  
     349    /**
     350     * When a regular expression match is to be replaced by a new string, the
     351     * new string is constructed using the rules used by the POSIX sed utility
     352     * in IEEE Std 1003.1- 2001 [IEEE, Information Technology -- Portable
     353     * Operating System Interface (POSIX), IEEE Standard 1003.1-2001].
     354     */
     355    _GLIBCXX17_INLINE constexpr match_flag_type format_sed = _S_sed;
     356  
     357    /**
     358     * During a search and replace operation, sections of the character
     359     * container sequence being searched that do not match the regular
     360     * expression shall not be copied to the output string.
     361     */
     362    _GLIBCXX17_INLINE constexpr match_flag_type format_no_copy = _S_no_copy;
     363  
     364    /**
     365     * When specified during a search and replace operation, only the first
     366     * occurrence of the regular expression shall be replaced.
     367     */
     368    _GLIBCXX17_INLINE constexpr match_flag_type format_first_only = _S_first_only;
     369  
     370    constexpr inline match_flag_type
     371    operator&(match_flag_type __a, match_flag_type __b)
     372    {
     373      return (match_flag_type)(static_cast<unsigned int>(__a)
     374  				& static_cast<unsigned int>(__b));
     375    }
     376  
     377    constexpr inline match_flag_type
     378    operator|(match_flag_type __a, match_flag_type __b)
     379    {
     380      return (match_flag_type)(static_cast<unsigned int>(__a)
     381  				| static_cast<unsigned int>(__b));
     382    }
     383  
     384    constexpr inline match_flag_type
     385    operator^(match_flag_type __a, match_flag_type __b)
     386    {
     387      return (match_flag_type)(static_cast<unsigned int>(__a)
     388  				^ static_cast<unsigned int>(__b));
     389    }
     390  
     391    constexpr inline match_flag_type
     392    operator~(match_flag_type __a)
     393    { return (match_flag_type)(~static_cast<unsigned int>(__a)); }
     394  
     395    _GLIBCXX14_CONSTEXPR
     396    inline match_flag_type&
     397    operator&=(match_flag_type& __a, match_flag_type __b)
     398    { return __a = __a & __b; }
     399  
     400    _GLIBCXX14_CONSTEXPR
     401    inline match_flag_type&
     402    operator|=(match_flag_type& __a, match_flag_type __b)
     403    { return __a = __a | __b; }
     404  
     405    _GLIBCXX14_CONSTEXPR
     406    inline match_flag_type&
     407    operator^=(match_flag_type& __a, match_flag_type __b)
     408    { return __a = __a ^ __b; }
     409  
     410    ///@}
     411  } // namespace regex_constants
     412  /// @} group regex
     413  
     414  _GLIBCXX_END_NAMESPACE_VERSION
     415  } // namespace std
     416