@cryptotaxi247 / netdata-1 / commits / 6bd133771

do not match a zero value with null color; fixes #3124

Costa Tsaousis (ktsaou) committed Dec 12, 2017 at 00:30 UTC 6bd13377149de3434e82d282960a8d69b3b033a0
1 file changed +46 -20
src/web_buffer_svg.c
+46 -20
@@ -610,16 +610,22 @@ static inline const char *color_map(const char *color) {
610 return color;
611 }
612
613 +typedef enum color_comparison {
614 + COLOR_COMPARE_EQUAL,
615 + COLOR_COMPARE_NOTEQUAL,
616 + COLOR_COMPARE_LESS,
617 + COLOR_COMPARE_LESSEQUAL,
618 + COLOR_COMPARE_GREATER,
619 + COLOR_COMPARE_GREATEREQUAL,
620 +} BADGE_COLOR_COMPARISON;
621 +
622 static inline void calc_colorz(const char *color, char *final, size_t len, calculated_number value) {
614 - int value_is_null = 0;
615 - if(isnan(value) || isinf(value)) {
616 - value = 0.0;
617 - value_is_null = 1;
618 - }
623 + if(isnan(value) || isinf(value))
624 + value = NAN;
625
626 char color_buffer[256 + 1] = "";
627 char value_buffer[256 + 1] = "";
622 - char comparison = '>';
628 + BADGE_COLOR_COMPARISON comparison = COLOR_COMPARE_GREATER;
629
630 // example input:
631 // color<max|color>min|color:null...
@@ -633,8 +639,15 @@ static inline void calc_colorz(const char *color, char *final, size_t len, calcu
639
640 while(*t && *t != '|') {
641 switch(*t) {
642 + case '!':
643 + if(t[1] == '=') t++;
644 + comparison = COLOR_COMPARE_NOTEQUAL;
645 + dv = value_buffer;
646 + break;
647 +
648 + case '=':
649 case ':':
637 - comparison = '=';
650 + comparison = COLOR_COMPARE_EQUAL;
651 dv = value_buffer;
652 break;
653
@@ -642,11 +655,11 @@ static inline void calc_colorz(const char *color, char *final, size_t len, calcu
655 case ')':
656 case '>':
657 if(t[1] == '=') {
645 - comparison = ')';
658 + comparison = COLOR_COMPARE_GREATEREQUAL;
659 t++;
660 }
661 else
649 - comparison = '>';
662 + comparison = COLOR_COMPARE_GREATER;
663 dv = value_buffer;
664 break;
665
@@ -654,11 +667,15 @@ static inline void calc_colorz(const char *color, char *final, size_t len, calcu
667 case '(':
668 case '<':
669 if(t[1] == '=') {
657 - comparison = '(';
670 + comparison = COLOR_COMPARE_LESSEQUAL;
671 + t++;
672 + }
673 + else if(t[1] == '>' || t[1] == ')' || t[1] == '}') {
674 + comparison = COLOR_COMPARE_NOTEQUAL;
675 t++;
676 }
677 else
661 - comparison = '<';
678 + comparison = COLOR_COMPARE_LESS;
679 dv = value_buffer;
680 break;
681
@@ -689,19 +706,28 @@ static inline void calc_colorz(const char *color, char *final, size_t len, calcu
706 *dc = '\0';
707 if(dv) {
708 *dv = '\0';
709 + calculated_number v;
710
693 - if(value_is_null) {
694 - if(!*value_buffer || !strcmp(value_buffer, "null"))
695 - break;
711 + if(!*value_buffer || !strcmp(value_buffer, "null")) {
712 + v = NAN;
713 }
714 else {
698 - calculated_number v = str2l(value_buffer);
715 + v = str2l(value_buffer);
716 + if(isnan(v) || isinf(v))
717 + v = NAN;
718 + }
719
700 - if(comparison == '<' && value < v) break;
701 - else if(comparison == '(' && value <= v) break;
702 - else if(comparison == '>' && value > v) break;
703 - else if(comparison == ')' && value >= v) break;
704 - else if(comparison == '=' && value == v) break;
720 + if(unlikely(isnan(value) || isnan(v))) {
721 + if(isnan(value) && isnan(v))
722 + break;
723 + }
724 + else {
725 + if (unlikely(comparison == COLOR_COMPARE_LESS && isless(value, v))) break;
726 + else if (unlikely(comparison == COLOR_COMPARE_LESSEQUAL && islessequal(value, v))) break;
727 + else if (unlikely(comparison == COLOR_COMPARE_GREATER && isgreater(value, v))) break;
728 + else if (unlikely(comparison == COLOR_COMPARE_GREATEREQUAL && isgreaterequal(value, v))) break;
729 + else if (unlikely(comparison == COLOR_COMPARE_EQUAL && !islessgreater(value, v))) break;
730 + else if (unlikely(comparison == COLOR_COMPARE_NOTEQUAL && islessgreater(value, v))) break;
731 }
732 }
733 else