void BasicHashtableImpl::rehash(size_t minimumCapacity, float loadFactor) { if (minimumCapacity < mSize) { minimumCapacity = mSize; } size_t newBucketCount, newCapacity; determineCapacity(minimumCapacity, loadFactor, &newBucketCount, &newCapacity); if (newBucketCount != mBucketCount || newCapacity != mCapacity) { if (mBuckets) { void* newBuckets; if (mSize) { newBuckets = allocateBuckets(newBucketCount); for (size_t i = 0; i < mBucketCount; i++) { const Bucket& fromBucket = bucketAt(mBuckets, i); if (fromBucket.cookie & Bucket::PRESENT) { hash_t hash = fromBucket.cookie & Bucket::HASH_MASK; size_t index = chainStart(hash, newBucketCount); Bucket* toBucket = &bucketAt(newBuckets, size_t(index)); if (toBucket->cookie & Bucket::PRESENT) { size_t inc = chainIncrement(hash, newBucketCount); do { toBucket->cookie |= Bucket::COLLISION; index = chainSeek(index, inc, newBucketCount); toBucket = &bucketAt(newBuckets, size_t(index)); } while (toBucket->cookie & Bucket::PRESENT); } toBucket->cookie = Bucket::PRESENT | hash; initializeBucketEntry(*toBucket, fromBucket.entry); } } } else { newBuckets = NULL; } releaseBuckets(mBuckets, mBucketCount); mBuckets = newBuckets; mFilledBuckets = mSize; } mBucketCount = newBucketCount; mCapacity = newCapacity; } mLoadFactor = loadFactor; }
bool KHtRewriteModule::process(KApacheConfig *htaccess, const char *cmd, std::vector<char *> &item) { if (strcasecmp(cmd, "RewriteEngine") == 0) { if (item.size() <= 0) { return true; } if (strcasecmp(item[0], "OFF") == 0) { enable = false; } if (strcasecmp(item[0], "ON") == 0) { enable = true; } return true; } if (!enable) { return false; } if (strcasecmp(cmd,"RewriteBase") == 0) { if (item.size() <= 0) { return true; } rewriteBase = item[0]; return true; } if (strcasecmp(cmd, "RewriteCond") == 0) { if (item.size() < 2) { return true; } rewrite_flag_t rf; memset(&rf, 0, sizeof(rf)); if (item.size() > 2) { parseRewriteFlag(item[2], rf); } chainStart(htaccess); rule << "<cond str='" << item[0] << "'"; if(lastCondOr){ rule << " or='1'"; } if (TEST(rf.flag,REWRITE_OR)) { lastCondOr = true; }else{ lastCondOr = false; } rule << " nc='"; if (TEST(rf.flag,REWRITE_NOCASE)) { rule << "1"; } else { rule << "0"; } rule << "'"; //if (TEST(rf.flag,REWRITE_QSA)) { // rule << " qsa='1'"; //} rule << ">" << CDATA_START << item[1] << CDATA_END << "</cond>\n"; return true; } if (strcasecmp(cmd, "RewriteRule") == 0) { if (item.size() < 2) { return true; } rewrite_flag_t rf; memset(&rf, 0, sizeof(rf)); if (item.size() > 2) { parseRewriteFlag(item[2], rf); } if (action.str().size() == 0) { //chain << "<chain action='"; if (TEST(rf.flag,REWRITE_LAST)) { action << "default"; } else if (TEST(rf.flag,REWRITE_NEXT)) { action << "table:BEGIN"; } else if (TEST(rf.flag,REWRITE_SKIP)) { action << "tablechain:BEGIN:" << cur_chainid + rf.skip; } else if (TEST(rf.flag,REWRITE_FOBIDDEN|REWRITE_GONE)) { action << "deny"; } else if (TEST(rf.flag,REWRITE_REDIRECT)) { action << "default"; } } // chain << "'>\n"; chainStart(htaccess); rule << "<rule path='" << item[0] << "' dst='" << item[1] << "' internal='";///>\n"; //internal='"; if (TEST(rf.flag,REWRITE_REDIRECT)) { rule << "0"; if (rf.code>0) { rule << "' code='" << rf.code; } } else { rule << "1"; } rule << "' nc='"; if (TEST(rf.flag,REWRITE_NOCASE)) { rule << "1"; } else { rule << "0"; } rule << "'"; if (TEST(rf.flag,REWRITE_PROXY)) { rule << " proxy='1'"; } if (TEST(rf.flag,REWRITE_QSA)) { rule << " qsa='1'"; } rule << "/>\n"; if (!TEST(rf.flag,REWRITE_CHAIN_AND)) { //last_chainand = true; chainEnd(); //last_chainand = false; } return true; } if (strcasecmp(cmd,"Redirect")==0) { return true; } return false; }