Home | History | Annotate | Line # | Download | only in bits
      1 // Errors for std::regex -*- C++ -*-
      2 
      3 // Copyright (C) 2010-2024 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_error.h
     27  * @brief Error and exception objects 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  * @addtogroup regex
     39  * @{
     40  */
     41 
     42 namespace regex_constants
     43 {
     44   /**
     45    * @name 5.3 Error Types
     46    */
     47   ///@{
     48 
     49   enum error_type
     50     {
     51       _S_error_collate, // XXX should have been a non-zero value
     52       _S_error_ctype,
     53       _S_error_escape,
     54       _S_error_backref,
     55       _S_error_brack,
     56       _S_error_paren,
     57       _S_error_brace,
     58       _S_error_badbrace,
     59       _S_error_range,
     60       _S_error_space,
     61       _S_error_badrepeat,
     62       _S_error_complexity,
     63       _S_error_stack,
     64       _S_null,
     65       _S_grammar
     66     };
     67 
     68   /** The expression contained an invalid collating element name. */
     69   _GLIBCXX17_INLINE constexpr error_type error_collate(_S_error_collate);
     70 
     71   /** The expression contained an invalid character class name. */
     72   _GLIBCXX17_INLINE constexpr error_type error_ctype(_S_error_ctype);
     73 
     74   /**
     75    * The expression contained an invalid escaped character, or a trailing
     76    * escape.
     77    */
     78   _GLIBCXX17_INLINE constexpr error_type error_escape(_S_error_escape);
     79 
     80   /** The expression contained an invalid back reference. */
     81   _GLIBCXX17_INLINE constexpr error_type error_backref(_S_error_backref);
     82 
     83   /** The expression contained mismatched [ and ]. */
     84   _GLIBCXX17_INLINE constexpr error_type error_brack(_S_error_brack);
     85 
     86   /** The expression contained mismatched ( and ). */
     87   _GLIBCXX17_INLINE constexpr error_type error_paren(_S_error_paren);
     88 
     89   /** The expression contained mismatched { and } */
     90   _GLIBCXX17_INLINE constexpr error_type error_brace(_S_error_brace);
     91 
     92   /** The expression contained an invalid range in a {} expression. */
     93   _GLIBCXX17_INLINE constexpr error_type error_badbrace(_S_error_badbrace);
     94 
     95   /**
     96    * The expression contained an invalid character range,
     97    * such as [b-a] in most encodings.
     98    */
     99   _GLIBCXX17_INLINE constexpr error_type error_range(_S_error_range);
    100 
    101   /**
    102    * There was insufficient memory to convert the expression into a
    103    * finite state machine.
    104    */
    105   _GLIBCXX17_INLINE constexpr error_type error_space(_S_error_space);
    106 
    107   /**
    108    * One of <em>*?+{</em> was not preceded by a valid regular expression.
    109    */
    110   _GLIBCXX17_INLINE constexpr error_type error_badrepeat(_S_error_badrepeat);
    111 
    112   /**
    113    * The complexity of an attempted match against a regular expression
    114    * exceeded a pre-set level.
    115    */
    116   _GLIBCXX17_INLINE constexpr error_type error_complexity(_S_error_complexity);
    117 
    118   /**
    119    * There was insufficient memory to determine whether the
    120    * regular expression could match the specified character sequence.
    121    */
    122   _GLIBCXX17_INLINE constexpr error_type error_stack(_S_error_stack);
    123 
    124   ///@}
    125 } // namespace regex_constants
    126 
    127   // [7.8] Class regex_error
    128   /**
    129    * @brief A regular expression exception class.
    130    * @ingroup exceptions
    131    *
    132    * The regular expression library throws objects of this class on error.
    133    *
    134    * @headerfile regex
    135    * @since C++11
    136    */
    137   class regex_error : public std::runtime_error
    138   {
    139     using error_type = regex_constants::error_type;
    140 
    141     error_type _M_code;
    142 
    143   public:
    144     /**
    145      * @brief Constructs a regex_error object.
    146      *
    147      * @param __ecode the regex error code.
    148      */
    149     explicit
    150     regex_error(error_type __ecode);
    151 
    152     virtual ~regex_error() throw();
    153 
    154     /**
    155      * @brief Gets the regex error code.
    156      *
    157      * @returns the regex error code.
    158      */
    159     regex_constants::error_type
    160     code() const noexcept
    161     { return _M_code; }
    162 
    163   private:
    164     /// @cond undocumented
    165     regex_error(error_type __ecode, const char* __what)
    166     : std::runtime_error(__what), _M_code(__ecode)
    167     { }
    168 
    169     [[__noreturn__]]
    170     friend void
    171     __throw_regex_error(error_type __ecode __attribute__((__unused__)),
    172 			const char* __what __attribute__((__unused__)))
    173     { _GLIBCXX_THROW_OR_ABORT(regex_error(__ecode, __what)); }
    174     /// @endcond
    175   };
    176 
    177   /// @cond undocumented
    178 
    179   [[__noreturn__]]
    180   void
    181   __throw_regex_error(regex_constants::error_type __ecode);
    182 
    183   [[__noreturn__]]
    184   inline void
    185   __throw_regex_error(regex_constants::error_type __ecode, const char* __what);
    186 
    187   /// @endcond
    188 
    189   ///@} // group regex
    190 
    191 _GLIBCXX_END_NAMESPACE_VERSION
    192 } // namespace std
    193