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;
}