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.");