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