summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-11-05 00:25:24 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-11-05 00:25:24 +0900
commit79876af88f0faa7e3b60bef02a3f21f7466c76ef (patch)
treeefff535c23bc9a4c24563ca628257f74c6c734b1
parent601ec0f44adcbf97e7566b64fa9677f3b117ae6e (diff)
Removed util::endsWith(a, b). Added util::iendsWith()
-rw-r--r--src/AuthConfigFactory.cc2
-rw-r--r--src/ContentTypeRequestGroupCriteria.cc3
-rw-r--r--src/DHTMessageTrackerEntry.cc8
-rw-r--r--src/DownloadCommand.cc5
-rw-r--r--src/HttpDownloadCommand.cc7
-rw-r--r--src/HttpServer.cc4
-rw-r--r--src/HttpSkipResponseCommand.cc5
-rw-r--r--src/OptionHandlerImpl.cc8
-rw-r--r--src/bittorrent_helper.cc4
-rw-r--r--src/cookie_helper.cc3
-rw-r--r--src/util.cc21
-rw-r--r--src/util.h18
-rw-r--r--test/UtilTest.cc22
13 files changed, 68 insertions, 42 deletions
diff --git a/src/AuthConfigFactory.cc b/src/AuthConfigFactory.cc
index 2ac2cde0..e8450269 100644
--- a/src/AuthConfigFactory.cc
+++ b/src/AuthConfigFactory.cc
@@ -215,7 +215,7 @@ AuthConfigFactory::BasicCred::BasicCred
user_(user), password_(password),
host_(host), port_(port), path_(path), activated_(activated)
{
- if(!util::endsWith(path_, "/")) {
+ if(path_.empty() || path_[path_.size()-1] != '/') {
path_ += "/";
}
}
diff --git a/src/ContentTypeRequestGroupCriteria.cc b/src/ContentTypeRequestGroupCriteria.cc
index 078ef7df..b61c3bb7 100644
--- a/src/ContentTypeRequestGroupCriteria.cc
+++ b/src/ContentTypeRequestGroupCriteria.cc
@@ -49,7 +49,8 @@ bool tailMatch
(InputIterator first, InputIterator last, const std::string& target)
{
for(; first != last; ++first) {
- if(util::endsWith(target, *first)) {
+ if(util::endsWith(target.begin(), target.end(),
+ (*first).begin(), (*first).end())) {
return true;
}
}
diff --git a/src/DHTMessageTrackerEntry.cc b/src/DHTMessageTrackerEntry.cc
index 59ad4322..bf3e34d0 100644
--- a/src/DHTMessageTrackerEntry.cc
+++ b/src/DHTMessageTrackerEntry.cc
@@ -71,9 +71,13 @@ bool DHTMessageTrackerEntry::match(const std::string& transactionID, const std::
if(targetNode_->getIPAddress() == ipaddr) {
return true;
}
- if(util::endsWith(targetNode_->getIPAddress(), ipaddr)) {
+ if(util::endsWith(targetNode_->getIPAddress().begin(),
+ targetNode_->getIPAddress().end(),
+ ipaddr.begin(), ipaddr.end())) {
return targetNode_->getIPAddress() == "::ffff:"+ipaddr;
- } else if(util::endsWith(ipaddr, targetNode_->getIPAddress())) {
+ } else if(util::endsWith(ipaddr.begin(), ipaddr.end(),
+ targetNode_->getIPAddress().begin(),
+ targetNode_->getIPAddress().end())) {
return ipaddr == "::ffff:"+targetNode_->getIPAddress();
}
return false;
diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc
index d6beb2fe..c3af6d30 100644
--- a/src/DownloadCommand.cc
+++ b/src/DownloadCommand.cc
@@ -380,8 +380,11 @@ void DownloadCommand::installStreamFilter
}
streamFilter->installDelegate(streamFilter_);
streamFilter_ = streamFilter;
+ const std::string& name = streamFilter_->getName();
sinkFilterOnly_ =
- util::endsWith(streamFilter_->getName(), SinkStreamFilter::NAME);
+ util::endsWith(name.begin(), name.end(),
+ SinkStreamFilter::NAME.begin(),
+ SinkStreamFilter::NAME.end());
}
} // namespace aria2
diff --git a/src/HttpDownloadCommand.cc b/src/HttpDownloadCommand.cc
index 66fcc069..c31b6089 100644
--- a/src/HttpDownloadCommand.cc
+++ b/src/HttpDownloadCommand.cc
@@ -87,12 +87,15 @@ bool HttpDownloadCommand::prepareForNextSegment() {
getDownloadEngine()->addCommand(command);
return true;
} else {
+ const std::string& streamFilterName = getStreamFilter()->getName();
if(getRequest()->isPipeliningEnabled() ||
(getRequest()->isKeepAliveEnabled() &&
(
// Make sure that all filters are finished to pool socket
- (!util::endsWith(getStreamFilter()->getName(),
- SinkStreamFilter::NAME) &&
+ (!util::endsWith(streamFilterName.begin(),
+ streamFilterName.end(),
+ SinkStreamFilter::NAME.begin(),
+ SinkStreamFilter::NAME.end()) &&
getStreamFilter()->finished()) ||
getRequestEndOffset() ==
getFileEntry()->gtoloff(getSegments().front()->getPositionToWrite())
diff --git a/src/HttpServer.cc b/src/HttpServer.cc
index 919ea228..cef02a80 100644
--- a/src/HttpServer.cc
+++ b/src/HttpServer.cc
@@ -185,7 +185,9 @@ void HttpServer::feedResponse(const std::string& status,
}
if(!headers.empty()) {
header += headers;
- if(!util::endsWith(headers, "\r\n")) {
+ if(headers.size() < 2 ||
+ (headers[headers.size()-2] != '\r' &&
+ headers[headers.size()-1] != '\n')) {
header += "\r\n";
}
}
diff --git a/src/HttpSkipResponseCommand.cc b/src/HttpSkipResponseCommand.cc
index 8e58a962..c9744929 100644
--- a/src/HttpSkipResponseCommand.cc
+++ b/src/HttpSkipResponseCommand.cc
@@ -94,8 +94,11 @@ void HttpSkipResponseCommand::installStreamFilter
}
streamFilter->installDelegate(streamFilter_);
streamFilter_ = streamFilter;
+ const std::string& name = streamFilter_->getName();
sinkFilterOnly_ =
- util::endsWith(streamFilter_->getName(), SinkStreamFilter::NAME);
+ util::endsWith(name.begin(), name.end(),
+ SinkStreamFilter::NAME.begin(),
+ SinkStreamFilter::NAME.end());
}
bool HttpSkipResponseCommand::executeInternal()
diff --git a/src/OptionHandlerImpl.cc b/src/OptionHandlerImpl.cc
index c0e1af5c..e739201e 100644
--- a/src/OptionHandlerImpl.cc
+++ b/src/OptionHandlerImpl.cc
@@ -520,7 +520,9 @@ HttpProxyUserOptionHandler::HttpProxyUserOptionHandler
void HttpProxyUserOptionHandler::parseArg
(Option& option, const std::string& optarg)
{
- if(util::endsWith(pref_->k, "-user")) {
+ const char A2_USER[] = "-user";
+ if(util::endsWith(pref_->k.begin(), pref_->k.end(),
+ A2_USER, vend(A2_USER)-1)) {
const Pref* proxyPref = option::k2p(pref_->k.substr(0, pref_->k.size()-5));
const std::string& olduri = option.get(proxyPref);
if(!olduri.empty()) {
@@ -562,7 +564,9 @@ HttpProxyPasswdOptionHandler::HttpProxyPasswdOptionHandler
void HttpProxyPasswdOptionHandler::parseArg
(Option& option, const std::string& optarg)
{
- if(util::endsWith(pref_->k, "-passwd")) {
+ const char A2_PASSWD[] = "-passwd";
+ if(util::endsWith(pref_->k.begin(), pref_->k.end(),
+ A2_PASSWD, vend(A2_PASSWD)-1)) {
const Pref* proxyPref = option::k2p(pref_->k.substr(0, pref_->k.size()-7));
const std::string& olduri = option.get(proxyPref);
if(!olduri.empty()) {
diff --git a/src/bittorrent_helper.cc b/src/bittorrent_helper.cc
index 625375e8..dffef8a6 100644
--- a/src/bittorrent_helper.cc
+++ b/src/bittorrent_helper.cc
@@ -182,7 +182,7 @@ OutputIterator createUri
const std::string& filePath)
{
for(; first != last; ++first) {
- if(util::endsWith(*first, "/")) {
+ if(!(*first).empty() && (*first)[(*first).size()-1] == '/') {
*out++ = (*first)+filePath;
} else {
*out++ = (*first)+"/"+filePath;
@@ -310,7 +310,7 @@ void extractFileEntries
std::vector<std::string> uris;
for(std::vector<std::string>::const_iterator i = urlList.begin(),
eoi = urlList.end(); i != eoi; ++i) {
- if(util::endsWith(*i, A2STR::SLASH_C)) {
+ if(!(*i).empty() && (*i)[(*i).size()-1] == '/') {
uris.push_back((*i)+util::percentEncode(utf8Name));
} else {
uris.push_back(*i);
diff --git a/src/cookie_helper.cc b/src/cookie_helper.cc
index 1e15e793..95f45057 100644
--- a/src/cookie_helper.cc
+++ b/src/cookie_helper.cc
@@ -368,7 +368,8 @@ std::string canonicalizeHost(const std::string& host)
bool domainMatch(const std::string& requestHost, const std::string& domain)
{
return requestHost == domain ||
- (util::endsWith(requestHost, domain) &&
+ (util::endsWith(requestHost.begin(), requestHost.end(),
+ domain.begin(), domain.end()) &&
requestHost[requestHost.size()-domain.size()-1] == '.' &&
!util::isNumericHost(requestHost));
}
diff --git a/src/util.cc b/src/util.cc
index bc463614..9a229f24 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -230,20 +230,6 @@ int32_t difftvsec(struct timeval tv1, struct timeval tv2) {
return tv1.tv_sec-tv2.tv_sec;
}
-bool endsWith(const std::string& target, const std::string& part) {
- if(target.size() < part.size()) {
- return false;
- }
- if(part.empty()) {
- return true;
- }
- if(target.rfind(part) == target.size()-part.size()) {
- return true;
- } else {
- return false;
- }
-}
-
std::string replace(const std::string& target, const std::string& oldstr, const std::string& newstr) {
if(target.empty() || oldstr.empty()) {
return target;
@@ -1516,7 +1502,9 @@ void executeHook
memset(&pi, 0, sizeof (pi));
- bool batch = util::endsWith(util::toLower(command), ".bat");
+ const char A2_BAT[] = ".bat";
+ bool batch = util::iendsWith(command.begin(), command.end(),
+ A2_BAT, vend(A2_BAT)-1);
std::string cmdline;
std::string cmdexe;
if(batch) {
@@ -1618,7 +1606,8 @@ bool noProxyDomainMatch
const std::string& domain)
{
if(!domain.empty() && domain[0] == '.' && !util::isNumericHost(hostname)) {
- return util::endsWith(hostname, domain);
+ return util::endsWith(hostname.begin(), hostname.end(),
+ domain.begin(), domain.end());
} else {
return hostname == domain;
}
diff --git a/src/util.h b/src/util.h
index 967092ae..832d6ef0 100644
--- a/src/util.h
+++ b/src/util.h
@@ -205,10 +205,6 @@ InputIterator lstripIter
std::string strip
(const std::string& str, const std::string& chars = DEFAULT_STRIP_CHARSET);
-bool startsWith(const std::string& target, const std::string& part);
-
-bool endsWith(const std::string& target, const std::string& part);
-
std::string replace(const std::string& target, const std::string& oldstr, const std::string& newstr);
std::string percentEncode(const unsigned char* target, size_t len);
@@ -714,6 +710,20 @@ bool endsWith
return std::equal(first2, last2, last1-(last2-first2));
}
+template<typename InputIterator1, typename InputIterator2>
+bool iendsWith
+(InputIterator1 first1,
+ InputIterator1 last1,
+ InputIterator2 first2,
+ InputIterator2 last2)
+{
+ if(last1-first1 < last2-first2) {
+ return false;
+ }
+ first1 = last1-(last2-first2);
+ return strieq(first1, last1, first2, last2);
+}
+
void generateRandomData(unsigned char* data, size_t length);
// Saves data to file whose name is filename. If overwrite is true,
diff --git a/test/UtilTest.cc b/test/UtilTest.cc
index e5e05440..5a7a5a1b 100644
--- a/test/UtilTest.cc
+++ b/test/UtilTest.cc
@@ -33,6 +33,7 @@ class UtilTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testStreq);
CPPUNIT_TEST(testStrieq);
CPPUNIT_TEST(testEndsWith);
+ CPPUNIT_TEST(testIendsWith);
CPPUNIT_TEST(testReplace);
CPPUNIT_TEST(testStartsWith);
// may be moved to other helper class in the future.
@@ -100,6 +101,7 @@ public:
void testStreq();
void testStrieq();
void testEndsWith();
+ void testIendsWith();
void testReplace();
void testStartsWith();
// may be moved to other helper class in the future.
@@ -635,53 +637,57 @@ void UtilTest::testSplitIterM() {
void UtilTest::testEndsWith() {
std::string target = "abcdefg";
std::string part = "fg";
- CPPUNIT_ASSERT(util::endsWith(target, part));
CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "abdefg";
part = "g";
- CPPUNIT_ASSERT(util::endsWith(target, part));
CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "abdefg";
part = "eg";
- CPPUNIT_ASSERT(!util::endsWith(target, part));
CPPUNIT_ASSERT(!util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "g";
part = "eg";
- CPPUNIT_ASSERT(!util::endsWith(target, part));
CPPUNIT_ASSERT(!util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "g";
part = "g";
- CPPUNIT_ASSERT(util::endsWith(target, part));
CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "g";
part = "";
- CPPUNIT_ASSERT(util::endsWith(target, part));
CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "";
part = "";
- CPPUNIT_ASSERT(util::endsWith(target, part));
CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
target = "";
part = "g";
- CPPUNIT_ASSERT(!util::endsWith(target, part));
CPPUNIT_ASSERT(!util::endsWith(target.begin(), target.end(),
part.begin(), part.end()));
}
+void UtilTest::testIendsWith() {
+ std::string target = "abcdefg";
+ std::string part = "Fg";
+ CPPUNIT_ASSERT(util::iendsWith(target.begin(), target.end(),
+ part.begin(), part.end()));
+
+ target = "abdefg";
+ part = "ef";
+ CPPUNIT_ASSERT(!util::iendsWith(target.begin(), target.end(),
+ part.begin(), part.end()));
+}
+
void UtilTest::testStreq()
{
std::string s1, s2;