int CChars::PrivateReplaceWithLonger(const char* szFind, const char* szReplace, int iFindLen, int iDifference) { int iCount; int iIndex; int i; int iTotalDifference; int iOldIndex; iCount = Occurrences(szFind); if (iCount == 0) { return 0; } iTotalDifference = iDifference * iCount; mcText.AddNum(iTotalDifference); (*mcText.Tail()) = 0; iIndex = Length() - (iFindLen + iTotalDifference); for (i = iCount-1; i >= 0; i--) { iOldIndex = iIndex; iIndex = FindFromEnd(iIndex, szFind); memcpy(mcText.Get(iIndex + iFindLen + (iDifference * (i+1))), mcText.Get(iIndex + iFindLen), iOldIndex - iIndex); Overwrite(iIndex + (iDifference * i), szReplace); iIndex -= iFindLen; } return iCount; }
Mistral2_Expression* Mistral2_Gcc::add(Mistral2Solver *solver, bool top_level) { if(!has_been_added()) { #ifdef _DEBUGWRAP std::cout << "add gcc constraint" << std::endl; #endif _solver = solver; int i, n=_vars.size(), m=_vals.size(); int min_val=_vals.get_item(0); int max_val=_vals.get_item(m-1); int M = (max_val - min_val + 1); Mistral::VarArray scope(n); int *tmp_lb = new int[M]; int *tmp_ub = new int[M]; for(i=0; i<n; ++i) { _vars.get_item(i)->add(_solver,false); scope[i] = _vars.get_item(i)->_self; } //std::cout << min_val << " to " << max_val << std::endl; for(i=0; i<M; ++i) { tmp_lb[i] = _lb_card.get_item(i); tmp_ub[i] = _ub_card.get_item(i); //std::cout << " " << i+min_val << ": in [" << tmp_lb[i] << ".." << tmp_ub[i] << "]\n"; } _self = Occurrences(scope, min_val, max_val, tmp_lb, tmp_ub); if( top_level ) _solver->solver->add( _self ); delete [] tmp_lb; delete [] tmp_ub; } return this; }