⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regress.h

📁 正则表达式源代码
💻 H
字号:
/* * * Copyright (c) 1998-2002 * Dr John Maddock * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Dr John Maddock makes no representations * about the suitability of this software for any purpose.   * It is provided "as is" without express or implied warranty. * */  /*  *  *   FILE     regress.h  *   VERSION  see <boost/version.hpp>  *  * Function and data declarations for regress.  *  */#ifndef _REGRESS_H#define _REGRESS_H#include <boost/regex/config.hpp>#ifdef BOOST_RE_OLD_IOSTREAM#include <iostream.h>#else#include <iostream>using std::cout;using std::cerr;using std::cin;using std::istream;using std::ostream;using std::endl;#endif#include <string>#include <iostream>#include <boost/regex.hpp>#if defined(TEST_UNICODE)#ifdef BOOST_NO_WREGEX#error "Wide character support is not enabled in regex lib - can't build wide character test program"#endif#ifdef __GNUC__#define char_t wchar_t#elsetypedef wchar_t char_t;#endiftypedef std::basic_string<char_t> string_type;typedef std::basic_string<char> nstring_type;inline istream& get_line(istream& is, nstring_type& s, char delim = '\n');istream& get_line(istream& is, string_type& s, char delim = L'\n');#define BOOST_RE_STR(x) L##xstd::string make_narrow(const wchar_t* ptr);inline std::string make_narrow(const std::wstring& s){ return make_narrow(s.c_str()); }#else // TEST_UNICODE#ifdef __GNUC__#define char_t char#elsetypedef char char_t;#endiftypedef std::basic_string<char_t> string_type;inline istream& get_line(istream& is, string_type& s, char delim = '\n');#define BOOST_RE_STR(x) xinline std::string make_narrow(const std::string& s){ return s; }#endif // TEST_UNICODEvoid parse_input_line(const string_type& s);void expand_escapes(string_type& s);void run_tests();void begin_error();void reset_error();int to_int(string_type::const_iterator i, string_type::const_iterator j);#define MAX_MATCHES 30extern string_type expression;extern string_type search_text;extern string_type format_string;extern string_type merge_string;extern int matches[MAX_MATCHES];#ifndef MAX_PATH#define MAX_PATH 260#endifextern char file[MAX_PATH];extern int line;extern bool do_test;extern unsigned int flags[5];extern unsigned error_count;struct flag_info{   const char_t* name; // printable flag name   unsigned int len;   // length of name   unsigned int value; // value of the flag   unsigned int id;    // index to assign value to};extern flag_info flag_data[];//// class jm_debug_alloc// NB this is a byte based allocator//class jm_debug_alloc;template <class T, class Base>class allocator_binder : public Base{public:   typedef T              value_type;   typedef value_type *   pointer;   typedef const T*       const_pointer;   typedef T&             reference;   typedef const T&       const_reference;   typedef std::size_t    size_type;   typedef std::ptrdiff_t difference_type;   typedef Base           base_type;   allocator_binder(){}   allocator_binder(const base_type& x) : Base(x){}   allocator_binder& operator=(const base_type& x)   {      *(static_cast<base_type*>(this)) = x;      return *this;   }   ~allocator_binder(){}   pointer address(reference x) { return &x; }   const_pointer address(const_reference x) const { return &x; }   pointer allocate(size_type n, const void* = 0)    {      return n != 0 ?         reinterpret_cast<pointer>(base_type::allocate(n * sizeof(value_type)))         : 0;   }   void deallocate(pointer p, size_type n)   {      assert( (p == 0) == (n == 0) );      if (p != 0)         base_type::deallocate((void*)p, n * sizeof(value_type));   }   size_type max_size() const   { return size_t(-1) / sizeof(value_type); }   void construct(pointer p, const T& val) const   { boost::detail::allocator_construct(p, val); }   void destroy(pointer p) const   { boost::detail::allocator_destroy(p); }#ifndef BOOST_NO_MEMBER_TEMPLATES   template <class U>   struct rebind   {      typedef allocator_binder<U, jm_debug_alloc> other;   };#endif};class jm_debug_alloc{private:   int* blocks, *count;   jm_debug_alloc* guard;public:   typedef std::size_t    size_type;   typedef std::ptrdiff_t difference_type;   typedef char*          pointer;   typedef const char*    const_pointer;   typedef char&          reference;   typedef const char&    const_reference;   typedef char           value_type;   typedef jm_debug_alloc base_type;#ifndef BOOST_NO_MEMBER_TEMPLATES   template <class U>   struct rebind   {      typedef allocator_binder<U, jm_debug_alloc> other;   };#endif   jm_debug_alloc();   jm_debug_alloc(const jm_debug_alloc& d);   jm_debug_alloc& operator=(const jm_debug_alloc& d);   ~jm_debug_alloc();   void free_();   static pointer address(reference x)   {      return &x;   }   static const_pointer address(const_reference x)   {      return &x;   }   unsigned maxi(unsigned i, unsigned j)   {      return i < j ? j : i;   }   void* allocate(size_type n, void* hint = 0);   void deallocate(void* p, size_type n);   static size_type max_size()   {      return UINT_MAX;   }   static void construct(pointer p, const char& val)   { boost::detail::allocator_construct(p, val); }   static void destroy(pointer p)   { boost::detail::allocator_destroy(p); }};#ifdef __BORLANDC__#if __BORLANDC__ < 0x520#define BOOST_RE_BORLAND_FIX#endif#endif//// class debug_iterator//template <class T>struct debug_iterator#if !defined(BOOST_NO_STD_ITERATOR) || defined(BOOST_MSVC_STD_ITERATOR): public std::iterator<std::random_access_iterator_tag, char_t>#endif{   typedef std::ptrdiff_t                    difference_type;   typedef char_t                            value_type;   typedef char_t*                           pointer;   typedef char_t&                           reference;   typedef std::random_access_iterator_tag   iterator_category;   typedef debug_iterator                    self;   typedef std::size_t                       size_type;  T cur;  T first;  T last;  debug_iterator(T c, T f, T l)    : cur(c), first(f), last(l) {}  debug_iterator() : cur(), first(), last() {}  debug_iterator(const debug_iterator& x)    : cur(x.cur), first(x.first), last(x.last) {}  debug_iterator& operator=(const debug_iterator& x)  {     cur = x.cur;     first = x.first;     last = x.last;     return *this;  }  reference operator*() const  {      if(cur == last)      {         begin_error();         cout << "Error: attempt to dereference iterator past range" << endl;      }      return *cur;  }  operator T()const { return cur; }  difference_type operator-(const self& x) const {    return (difference_type)(cur - x.cur);  }  self& operator++()  {      if(cur == last)      {         begin_error();         cout << "Error: attempt to increment iterator past range" << endl;         return *this;      }    ++cur;    return *this;  }  self operator++(int)  {    self tmp = *this;    ++*this;    return tmp;  }  self& operator--()  {      if(cur == first)      {         begin_error();         cout << "Error: attempt to decrement iterator past range" << endl;         return *this;      }    --cur;    return *this;  }  self operator--(int)  {    self tmp = *this;    --*this;    return tmp;  }  self& operator+=(difference_type n)  {      if((last - cur) < n)      {         begin_error();         cout << "Error: attempt to increment iterator past range" << endl;         return *this;      }    cur += n;    return *this;  }  self operator+(difference_type n) const  {    self tmp = *this;    return tmp += n;  }  self& operator-=(difference_type n) { return *this += -n; }   self operator-(difference_type n) const  {    self tmp = *this;    return tmp -= n;  }  reference operator[](difference_type n) const { return *(cur + n); }  bool operator==(const self& x) const { return cur == x.cur; }  bool operator!=(const self& x) const { return !(*this == x); }  bool operator<(const self& x) const {    return (cur < x.cur);  }  friend self operator+(difference_type n, const self& i)  {    self tmp = i;    return tmp += n;  }};#if defined(__SGI_STL_PORT) namespace std{template <class T>#if __SGI_STL_PORT <= 0x400inline random_access_iterator_tag __STL_CALL __ITERATOR_CATEGORY(const debug_iterator<T>&) {#elseinline random_access_iterator_tag __iterator_category(const debug_iterator<T>&) {#endif  return random_access_iterator_tag();}}#elif defined(__STL_CONFIG_H)namespace std{template <class T>inline random_access_iterator_tag iterator_category(const debug_iterator<T>&) {  return random_access_iterator_tag();}}#endif#if (defined(BOOST_MSVC) || defined(__ICL)) && (defined(_YVALS) || defined(_CPPLIB_VER))namespace std{template <class T>inline random_access_iterator_tag __cdecl_Iter_cat(const debug_iterator<T>&) {  return random_access_iterator_tag();}}#endif#ifdef BOOST_RWSTD_VERnamespace std{template <class T>inline random_access_iterator_tag__iterator_category(const debug_iterator<T>&) {  return random_access_iterator_tag();}}#endif#if defined(_WIN32) && !defined(BOOST_RE_TEST_LOCALE_CPP) && !defined(BOOST_RE_TEST_LOCALE_C) && !defined(BOOST_RE_TEST_LOCALE_W32)&& !defined(BOOST_REGEX_NO_W32)#define BOOST_RE_TEST_LOCALE_W32#endif#ifdef BOOST_RE_TEST_LOCALE_W32typedef boost::reg_expression<char_t, boost::w32_regex_traits<char_t>, jm_debug_alloc> re_type;#elif defined(BOOST_RE_TEST_LOCALE_CPP)typedef boost::reg_expression<char_t, boost::cpp_regex_traits<char_t>, jm_debug_alloc> re_type;#elsetypedef boost::reg_expression<char_t, boost::c_regex_traits<char_t>, jm_debug_alloc> re_type;#endif#define REG_NO_POSIX_TEST 1#define REG_UNICODE_ONLY 2#define REG_GREP 4#define REG_MERGE 8#define REG_MERGE_COPY 16#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -