85    bool found_slash(
false);
 
   86    std::string::size_type pos(0);
 
   97    if(dimension.length() > 2
 
   98    && dimension.substr(0, 2) == 
"1/") 
 
  103    else if(dimension.length() > 3
 
  104         && dimension.substr(0, 3) == 
"1 /")
 
  112    && pos + 1 < dimension.size()
 
  113    && dimension[pos] == 
' ')
 
  122            std::string::size_type end(dimension.find_first_of(
" */", pos));
 
  123            if(end == std::string::npos)
 
  125                end = dimension.size();
 
  131                std::string 
const dim(dimension.substr(pos, end - pos));
 
  134                    divisor.push_back(dim);
 
  138                    dividend.push_back(dim);
 
  144                        << 
"number dimension is missing a dimension name." 
  150            if(pos >= dimension.size())
 
  157        if(pos < dimension.size()
 
  158        && dimension[pos] == 
' ')
 
  164        if(pos >= dimension.size())
 
  169        if(dimension[pos] == 
'/')
 
  176                        << 
"a valid dimension can have any number of '*' operators and a single '/' operator, here we found a second '/'." 
  184        else if(dimension[pos] == 
'*')
 
  192                    << 
"multiple dimensions can only be separated by '*' or '/' not '" 
  193                    << dimension.substr(pos, 1)
 
  198        if(pos < dimension.size()
 
  199        && dimension[pos] == 
' ')
 
 
  227    for(
size_t idx(dividend.size()); idx > 0;)
 
  230        std::string 
const dim(dividend[idx]);
 
  231        dimension_vector_t::iterator it(std::find(divisor.begin(), divisor.end(), dim));
 
  232        if(it != divisor.end())
 
  235            dividend.erase(dividend.begin() + idx);
 
 
  298#if __cplusplus >= 201700 
  305                    << 
"incompatible types between " 
  309                    << 
" for operator '/' or '%'." 
  319                        << 
"string * integer requires that the integer not be negative (" 
  320                        << rhs->get_integer()
 
  326            for(; count > 0; --count)
 
  328                result += lhs->get_string();
 
  330            lhs->set_string(result);
 
  335        ai = lhs->get_integer();
 
  336        bi = rhs->get_integer();
 
  342        bf = rhs->get_decimal_number();
 
  347        af = lhs->get_decimal_number();
 
  353        af = lhs->get_decimal_number();
 
  354        bf = rhs->get_decimal_number();
 
  359        af = lhs->get_decimal_number();
 
  360        bf = rhs->get_decimal_number();
 
  365        af = lhs->get_decimal_number();
 
  366        bf = rhs->get_decimal_number();
 
  372        bf = rhs->get_decimal_number();
 
  377        af = lhs->get_decimal_number();
 
  383        af = lhs->get_decimal_number();
 
  384        bf = rhs->get_decimal_number();
 
  395                << 
"unicode_range * unicode_range is the only multiplicative operator accepted with unicode ranges, '/' and '%' are not allowed." 
  405                << 
"unicode_range * unicode_range is the only multiplicative operator accepted with unicode ranges, '/' and '%' are not allowed." 
  431                << 
"unicode_range * unicode_range is the only multiplicative operator accepted with unicode ranges, '/' and '%' are not allowed." 
  439                    << 
"'number / color' and 'number % color' are not available." 
  444#if __cplusplus >= 201700 
  449        goto color_multiplicative;
 
  456                    << 
"'number / color' and 'number % color' are not available." 
  461#if __cplusplus >= 201700 
  466        bf = rhs->get_decimal_number();
 
  469        || rhs->get_string() == 
"")
 
  471            color c(lhs->get_color());
 
  495                green = fmod(green, bf);
 
  496                blue  = fmod(blue,  bf);
 
  497                alpha = fmod(alpha, bf);
 
  506            result->set_color(c);
 
  510                << 
"color factors must be unit less values, " 
  513                << 
" is not acceptable." 
  519            color lc(lhs->get_color());
 
  520            color const rc(rhs->get_color());
 
  529            lc.
get_color(lred, lgreen, lblue, lalpha);
 
  530            rc.
get_color(rred, rgreen, rblue, ralpha);
 
  541#pragma GCC diagnostic push 
  542#pragma GCC diagnostic ignored "-Wfloat-equal" 
  547#pragma GCC diagnostic pop 
  550                            << 
"color division does not accept any color component set to zero." 
  561#pragma GCC diagnostic push 
  562#pragma GCC diagnostic ignored "-Wfloat-equal" 
  567#pragma GCC diagnostic pop 
  570                            << 
"color modulo does not accept any color component set to zero." 
  574                lred   = fmod(lred   , rred  );
 
  575                lgreen = fmod(lgreen , rgreen);
 
  576                lblue  = fmod(lblue  , rblue );
 
  577                lalpha = fmod(lalpha , ralpha);
 
  584            lc.
set_color(lred, lgreen, lblue, lalpha);
 
  586            result->set_color(lc);
 
  592                << 
"incompatible types between " 
  596                << 
" for operator '*', '/', or '%'." 
  615        result->set_font_size(af);
 
  616        result->set_line_height(bf);
 
  619            result->set_dim1(
"%");
 
  623            result->set_dim1(lhs->get_string());
 
  627            result->set_dim2(
"%");
 
  631            result->set_dim2(rhs->get_string());
 
  668                        << 
"incompatible dimensions (\"" 
  672                        << 
"\") cannot be used with operator '%'." 
  677            result->set_string(ldim);
 
  698            result->set_integer(ai * bi);
 
  705                        << 
"division by zero." 
  709            result->set_integer(ai / bi);
 
  720            result->set_integer(ai % bi);
 
  734            result->set_decimal_number(af * bf);
 
  738#pragma GCC diagnostic push 
  739#pragma GCC diagnostic ignored "-Wfloat-equal" 
  741#pragma GCC diagnostic pop 
  744                        << 
"division by zero." 
  748            result->set_decimal_number(af / bf);
 
  752#pragma GCC diagnostic push 
  753#pragma GCC diagnostic ignored "-Wfloat-equal" 
  755#pragma GCC diagnostic pop 
  762            result->set_decimal_number(fmod(af, bf));
 
  772        throw csspp_exception_logic(
"expression.cpp:multiply(): 'type' set to a value which is not handled here.");