cregex.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 644 行 · 第 1/2 页

CPP
644
字号
};}namespace{void BuildFileList(std::list<std::string>* pl, const char* files, bool recurse){   file_iterator start(files);   file_iterator end;   if(recurse)   {      // go through sub directories:      char buf[MAX_PATH];      re_detail::overflow_error_if_not_zero(re_detail::strcpy_s(buf, MAX_PATH, start.root()));      if(*buf == 0)      {         re_detail::overflow_error_if_not_zero(re_detail::strcpy_s(buf, MAX_PATH, "."));         re_detail::overflow_error_if_not_zero(re_detail::strcat_s(buf, MAX_PATH, directory_iterator::separator()));         re_detail::overflow_error_if_not_zero(re_detail::strcat_s(buf, MAX_PATH, "*"));      }      else      {         re_detail::overflow_error_if_not_zero(re_detail::strcat_s(buf, MAX_PATH, directory_iterator::separator()));         re_detail::overflow_error_if_not_zero(re_detail::strcat_s(buf, MAX_PATH, "*"));      }      directory_iterator dstart(buf);      directory_iterator dend;      // now get the file mask bit of "files":      const char* ptr = files;      while(*ptr) ++ptr;      while((ptr != files) && (*ptr != *directory_iterator::separator()) && (*ptr != '/'))--ptr;      if(ptr != files) ++ptr;      while(dstart != dend)      {#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(_WIN32_WCE) && !defined(UNDER_CE)         (::sprintf_s)(buf, sizeof(buf), "%s%s%s", dstart.path(), directory_iterator::separator(), ptr);#else         (std::sprintf)(buf, "%s%s%s", dstart.path(), directory_iterator::separator(), ptr);#endif         BuildFileList(pl, buf, recurse);         ++dstart;      }   }   while(start != end)   {      pl->push_back(*start);      ++start;   }}}unsigned int RegEx::GrepFiles(GrepFileCallback cb, const char* files, bool recurse, match_flag_type flags){   unsigned int result = 0;   std::list<std::string> file_list;   BuildFileList(&file_list, files, recurse);   std::list<std::string>::iterator start, end;   start = file_list.begin();   end = file_list.end();   while(start != end)   {      mapfile map((*start).c_str());      pdata->t = re_detail::RegExData::type_pf;      pdata->fbase = map.begin();      re_detail::pred4 pred(cb, this, (*start).c_str());      int r = regex_grep(pred, map.begin(), map.end(), pdata->e, flags);      result += r;      ++start;      pdata->clean();      if(pred.ok == false)         return result;   }   return result;}unsigned int RegEx::FindFiles(FindFilesCallback cb, const char* files, bool recurse, match_flag_type flags){   unsigned int result = 0;   std::list<std::string> file_list;   BuildFileList(&file_list, files, recurse);   std::list<std::string>::iterator start, end;   start = file_list.begin();   end = file_list.end();   while(start != end)   {      mapfile map((*start).c_str());      pdata->t = re_detail::RegExData::type_pf;      pdata->fbase = map.begin();      if(regex_search(map.begin(), map.end(), pdata->fm, pdata->e, flags))      {         ++result;         if(false == cb((*start).c_str()))            return result;      }      //pdata->update();      ++start;      //pdata->clean();   }   return result;}#endif#ifdef BOOST_REGEX_V3#define regex_replace regex_merge#endifstd::string RegEx::Merge(const std::string& in, const std::string& fmt,                    bool copy, match_flag_type flags){   std::string result;   re_detail::string_out_iterator<std::string> i(result);   if(!copy) flags |= format_no_copy;   regex_replace(i, in.begin(), in.end(), pdata->e, fmt.c_str(), flags);   return result;}std::string RegEx::Merge(const char* in, const char* fmt,                    bool copy, match_flag_type flags){   std::string result;   if(!copy) flags |= format_no_copy;   re_detail::string_out_iterator<std::string> i(result);   regex_replace(i, in, in + std::strlen(in), pdata->e, fmt, flags);   return result;}std::size_t RegEx::Split(std::vector<std::string>& v,                       std::string& s,                      match_flag_type flags,                      unsigned max_count){   return regex_split(std::back_inserter(v), s, pdata->e, flags, max_count);}//// now operators for returning what matched in more detail://std::size_t RegEx::Position(int i)const{   switch(pdata->t)   {   case re_detail::RegExData::type_pc:      return pdata->m[i].matched ? pdata->m[i].first - pdata->pbase : RegEx::npos;#ifndef BOOST_REGEX_NO_FILEITER   case re_detail::RegExData::type_pf:      return pdata->fm[i].matched ? pdata->fm[i].first - pdata->fbase : RegEx::npos;#endif   case re_detail::RegExData::type_copy:      {      std::map<int, std::ptrdiff_t, std::less<int> >::iterator pos = pdata->positions.find(i);      if(pos == pdata->positions.end())         return RegEx::npos;      return (*pos).second;      }   }   return RegEx::npos;}std::size_t RegEx::Marks()const{   return pdata->e.mark_count();}std::size_t RegEx::Length(int i)const{   switch(pdata->t)   {   case re_detail::RegExData::type_pc:      return pdata->m[i].matched ? pdata->m[i].second - pdata->m[i].first : RegEx::npos;#ifndef BOOST_REGEX_NO_FILEITER   case re_detail::RegExData::type_pf:      return pdata->fm[i].matched ? pdata->fm[i].second - pdata->fm[i].first : RegEx::npos;#endif   case re_detail::RegExData::type_copy:      {      std::map<int, std::string, std::less<int> >::iterator pos = pdata->strings.find(i);      if(pos == pdata->strings.end())         return RegEx::npos;      return (*pos).second.size();      }   }   return RegEx::npos;}bool RegEx::Matched(int i)const{   switch(pdata->t)   {   case re_detail::RegExData::type_pc:      return pdata->m[i].matched;#ifndef BOOST_REGEX_NO_FILEITER   case re_detail::RegExData::type_pf:      return pdata->fm[i].matched;#endif         case re_detail::RegExData::type_copy:      {      std::map<int, std::string, std::less<int> >::iterator pos = pdata->strings.find(i);      if(pos == pdata->strings.end())         return false;      return true;      }   }   return false;}std::string RegEx::What(int i)const{   std::string result;   switch(pdata->t)   {   case re_detail::RegExData::type_pc:      if(pdata->m[i].matched)          result.assign(pdata->m[i].first, pdata->m[i].second);      break;   case re_detail::RegExData::type_pf:      if(pdata->m[i].matched)          result.assign(to_string(pdata->m[i].first, pdata->m[i].second));      break;   case re_detail::RegExData::type_copy:      {      std::map<int, std::string, std::less<int> >::iterator pos = pdata->strings.find(i);      if(pos != pdata->strings.end())         result = (*pos).second;      break;      }   }   return result;}#ifdef BOOST_HAS_LONG_LONGconst std::size_t RegEx::npos = static_cast<std::size_t>(~0ULL);#elseconst std::size_t RegEx::npos = static_cast<std::size_t>(~0UL);#endif} // namespace boost#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x550) && (__BORLANDC__ <= 0x551) && !defined(_RWSTD_COMPILE_INSTANTIATE)//// this is an ugly hack to work around an ugly problem:// by default this file will produce unresolved externals during// linking unless _RWSTD_COMPILE_INSTANTIATE is defined (Borland bug).// However if _RWSTD_COMPILE_INSTANTIATE is defined then we get separate// copies of basic_string's static data in the RTL and this DLL, this messes// with basic_string's memory management and results in run-time crashes,// Oh sweet joy of Catch 22....//namespace std{template<> template<>basic_string<char>& BOOST_REGEX_DECLbasic_string<char>::replace<const char*>(char* f1, char* f2, const char* i1, const char* i2){   unsigned insert_pos = f1 - begin();   unsigned remove_len = f2 - f1;   unsigned insert_len = i2 - i1;   unsigned org_size = size();   if(insert_len > remove_len)   {      append(insert_len-remove_len, ' ');      std::copy_backward(begin() + insert_pos + remove_len, begin() + org_size, end());      std::copy(i1, i2, begin() + insert_pos);   }   else   {      std::copy(begin() + insert_pos + remove_len, begin() + org_size, begin() + insert_pos + insert_len);      std::copy(i1, i2, begin() + insert_pos);      erase(size() + insert_len - remove_len);   }   return *this;}template<> template<>basic_string<wchar_t>& BOOST_REGEX_DECLbasic_string<wchar_t>::replace<const wchar_t*>(wchar_t* f1, wchar_t* f2, const wchar_t* i1, const wchar_t* i2){   unsigned insert_pos = f1 - begin();   unsigned remove_len = f2 - f1;   unsigned insert_len = i2 - i1;   unsigned org_size = size();   if(insert_len > remove_len)   {      append(insert_len-remove_len, ' ');      std::copy_backward(begin() + insert_pos + remove_len, begin() + org_size, end());      std::copy(i1, i2, begin() + insert_pos);   }   else   {      std::copy(begin() + insert_pos + remove_len, begin() + org_size, begin() + insert_pos + insert_len);      std::copy(i1, i2, begin() + insert_pos);      erase(size() + insert_len - remove_len);   }   return *this;}} // namespace std#endif#endif

⌨️ 快捷键说明

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