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 + -
显示快捷键?