You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

294 lines
8.6 KiB

/* /////////////////////////////////////////////////////////////////////////
* File: shwild/shwild.hpp
*
* Purpose: C++ root file for the shwild C-API
*
* Created: 17th June 2005
* Updated: 19th December 2011
*
* Home: http://shwild.org/
*
* Copyright (c) 2005-2011, Matthew Wilson and Sean Kelly
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - Neither the names of Matthew Wilson and Sean Kelly nor the names of
* any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ////////////////////////////////////////////////////////////////////// */
/** \file shwild/shwild.hpp [C++] C++ root file for the shwild C-API
*/
#ifndef SHWILD_INCL_SHWILD_HPP_SHWILD
#define SHWILD_INCL_SHWILD_HPP_SHWILD
/* /////////////////////////////////////////////////////////////////////////
* Version information
*/
#ifndef SHWILD_DOCUMENTATION_SKIP_SECTION
# define SHWILD_VER_SHWILD_HPP_SHWILD_MAJOR 1
# define SHWILD_VER_SHWILD_HPP_SHWILD_MINOR 1
# define SHWILD_VER_SHWILD_HPP_SHWILD_REVISION 4
# define SHWILD_VER_SHWILD_HPP_SHWILD_EDIT 7
#endif /* !SHWILD_DOCUMENTATION_SKIP_SECTION */
/* /////////////////////////////////////////////////////////////////////////
* Includes
*/
#ifndef SHWILD_INCL_SHWILD_H_SHWILD
# include <shwild/shwild.h>
#endif /* !SHWILD_INCL_SHWILD_H_SHWILD */
#include <stdexcept>
/* /////////////////////////////////////////////////////////////////////////
* Compiler warnings
*/
#ifdef __BORLANDC__
# pragma warn -8026 /* Suppresses "Functions with exception specifications are not expanded inline" */
#endif /* compiler */
/* /////////////////////////////////////////////////////////////////////////
* Namespace
*/
#if !defined(SHWILD_NO_NAMESPACE)
namespace shwild
{
#endif /* !SHWILD_NO_NAMESPACE */
/* /////////////////////////////////////////////////////////////////////////
* Classes
*/
// TODO: Flesh this out to be a full and complete exception class
/// Exception thrown by the Pattern constructor
/// \ingroup group__shwild_api__cpp_api
class PatternException
: public std::runtime_error
{
/// \name Member Types
/// @{
public:
typedef std::runtime_error parent_class_type;
typedef PatternException class_type;
/// @}
/// \name Construction
/// @{
public:
/// Construct from the given message and error code
PatternException(char const* message, int shwildErrorCode)
: parent_class_type(message)
, m_shwildErrorCode(shwildErrorCode)
{}
/// @}
/// \name Accessors
/// @{
public:
/// nul-terminated C-style string describing the exception
virtual char const* what() const throw()
{
return "Pattern Exception";
}
/// The error code associated with the exception
int errorCode() const throw()
{
return m_shwildErrorCode;
}
/// @}
/// \name Members
/// @{
private:
int m_shwildErrorCode;
/// @}
};
/// Facade for the \ref group__shwild_api__c_api "shwild C API"
/// \ingroup group__shwild_api__cpp_api
class Pattern
{
public:
/// Parses and precompiles the given pattern, according to the behaviour specified by the given flags
///
/// \note If the parsing fails, an instance of PatternException is thrown
explicit Pattern(char const* pattern, unsigned flags = 0);
/// Parses and precompiles the given pattern, according to the behaviour specified by the given flags
///
/// \note If the parsing fails, an instance of PatternException is thrown
explicit Pattern(slice_t const* pattern, unsigned flags = 0);
/// Parses and precompiles the given pattern, according to the behaviour specified by the given flags
///
/// \note If the parsing fails, an instance of PatternException is thrown
explicit Pattern(slice_t const& pattern, unsigned flags = 0);
/// Releases any resources associated with the instance
~Pattern();
public:
/// Match the given string against the precompiled pattern maintained as member state
bool match(char const* string) const;
/// Match the given string against the precompiled pattern maintained as member state
bool match(slice_t const* string) const;
/// Match the given string against the precompiled pattern maintained as member state
bool match(slice_t const& string) const;
public:
/** The number of potential matches (including the end marker) in
* the compiled pattern.
*
* \note For compilation without exception support, this will be <0 if a
* compilation error occurred
*/
int numMatched() const
{
return m_numMatches;
}
private:
static shwild_handle_t init_(char const* pattern, unsigned flags, int &numMatches);
static shwild_handle_t init_(slice_t const* pattern, unsigned flags, int &numMatches);
private:
shwild_handle_t m_hCompiledPattern;
int m_numMatches;
private:
Pattern(Pattern const&);
Pattern &operator =(Pattern const&);
};
/* /////////////////////////////////////////////////////////////////////////
* Implementation
*/
#ifndef SHWILD_DOCUMENTATION_SKIP_SECTION
inline /* static */ shwild_handle_t Pattern::init_(char const* pattern, unsigned flags, int &numMatches)
{
shwild_handle_t hCompiledPattern;
numMatches = shwild_compile_pattern(pattern, flags, &hCompiledPattern);
if(numMatches < 0)
{
hCompiledPattern = NULL;
throw PatternException("Failed to compile pattern", numMatches);
}
return hCompiledPattern;
}
inline /* static */ shwild_handle_t Pattern::init_(slice_t const* pattern, unsigned flags, int &numMatches)
{
shwild_handle_t hCompiledPattern;
numMatches = shwild_compile_pattern_s(pattern, flags, &hCompiledPattern);
if(numMatches < 0)
{
hCompiledPattern = NULL;
throw PatternException("Failed to compile pattern", numMatches);
}
return hCompiledPattern;
}
inline Pattern::Pattern(char const* pattern, unsigned flags)
: m_hCompiledPattern(init_(pattern, flags, m_numMatches))
{}
inline Pattern::Pattern(slice_t const* pattern, unsigned flags)
: m_hCompiledPattern(init_(pattern, flags, m_numMatches))
{}
inline Pattern::Pattern(slice_t const& pattern, unsigned flags)
: m_hCompiledPattern(init_(&pattern, flags, m_numMatches))
{}
inline Pattern::~Pattern()
{
shwild_destroy_pattern(m_hCompiledPattern);
}
inline bool Pattern::match(char const* string) const
{
int r = shwild_match_pattern(m_hCompiledPattern, string);
if(r < 0)
{
throw PatternException("Match failed", r);
}
return 0 == r;
}
inline bool Pattern::match(slice_t const* string) const
{
int r = shwild_match_pattern_s(m_hCompiledPattern, string);
if(r < 0)
{
throw PatternException("Match failed", r);
}
return 0 == r;
}
inline bool Pattern::match(slice_t const& string) const
{
int r = shwild_match_pattern_s(m_hCompiledPattern, &string);
if(r < 0)
{
throw PatternException("Match failed", r);
}
return 0 == r;
}
#endif /* !SHWILD_DOCUMENTATION_SKIP_SECTION */
/* /////////////////////////////////////////////////////////////////////////
* Namespace
*/
#if !defined(SHWILD_NO_NAMESPACE)
} // namespace shwild
#endif /* !SHWILD_NO_NAMESPACE */
/* ////////////////////////////////////////////////////////////////////// */
#endif /* !SHWILD_INCL_SHWILD_HPP_SHWILD */
/* ///////////////////////////// end of file //////////////////////////// */