View | Details | Raw Unified | Return to bug 17221
Collapse All | Expand All

(-)rrdtool/patches/patch-ap (+143 lines)
Line 0 Link Here
1
--- src/rrd_graph.c	Sun Feb  6 23:19:21 2000
2
+++ src/rrd_graph.c	Mon Mar  6 17:13:16 2000
3
@@ -35,6 +35,7 @@
4
             OP_SUB,OP_MUL,
5
 	    OP_DIV,OP_SIN, OP_DUP, OP_EXC, OP_POP,
6
 	    OP_COS,OP_LOG,OP_EXP,OP_LT,OP_LE,OP_GT,OP_GE,OP_EQ,OP_IF,
7
+	    OP_MIN,OP_MAX,OP_LIMIT,
8
 	    OP_UN,OP_END};
9
 
10
 enum if_en {IF_GIF=0,IF_PNG=1};
11
@@ -769,6 +770,9 @@
12
 	match_op(OP_GE,GE)
13
 	match_op(OP_EQ,EQ)
14
 	match_op(OP_IF,IF)
15
+	match_op(OP_MIN,MIN)
16
+	match_op(OP_MAX,MAX)
17
+	match_op(OP_LIMIT,LIMIT)
18
 	  /* order is important here ! .. match longest first */
19
 	match_op(OP_UNKN,UNKN)
20
 	match_op(OP_UN,UN)
21
@@ -1057,7 +1061,12 @@
22
 			free(stack);
23
 			return -1;
24
 		    }
25
-		    stack[stptr-1] = stack[stptr-1] < stack[stptr] ? 1.0 : 0.0;
26
+		    if (isnan(stack[stptr-1])) 
27
+			;
28
+		    else if (isnan(stack[stptr]))
29
+		        stack[stptr-1] = stack[stptr];
30
+		    else
31
+			    stack[stptr-1] = stack[stptr-1] < stack[stptr] ? 1.0 : 0.0;
32
 		    stptr--;
33
 		    break;
34
 		case OP_LE:
35
@@ -1066,7 +1075,12 @@
36
 			free(stack);
37
 			return -1;
38
 		    }
39
-		    stack[stptr-1] = stack[stptr-1] <= stack[stptr] ? 1.0 : 0.0;
40
+		    if (isnan(stack[stptr-1])) 
41
+			;
42
+		    else if (isnan(stack[stptr]))
43
+		        stack[stptr-1] = stack[stptr];
44
+		    else
45
+		        stack[stptr-1] = stack[stptr-1] <= stack[stptr] ? 1.0 : 0.0;
46
 		    stptr--;
47
 		    break;
48
 		case OP_GT:
49
@@ -1075,7 +1089,12 @@
50
 			free(stack);
51
 			return -1;
52
 		    }
53
-		    stack[stptr-1] = stack[stptr-1] > stack[stptr] ? 1.0 : 0.0;
54
+		    if (isnan(stack[stptr-1])) 
55
+			;
56
+		    else if (isnan(stack[stptr]))
57
+		        stack[stptr-1] = stack[stptr];
58
+		    else
59
+		        stack[stptr-1] = stack[stptr-1] > stack[stptr] ? 1.0 : 0.0;
60
 		    stptr--;
61
 		    break;
62
 		case OP_GE:
63
@@ -1084,7 +1103,12 @@
64
 			free(stack);
65
 			return -1;
66
 		    }
67
-		    stack[stptr-1] = stack[stptr-1] >= stack[stptr] ? 1.0 : 0.0;
68
+		    if (isnan(stack[stptr-1])) 
69
+			;
70
+		    else if (isnan(stack[stptr]))
71
+		        stack[stptr-1] = stack[stptr];
72
+		    else
73
+		        stack[stptr-1] = stack[stptr-1] >= stack[stptr] ? 1.0 : 0.0;
74
 		    stptr--;
75
 		    break;
76
 		case OP_EQ:
77
@@ -1093,7 +1117,12 @@
78
 			free(stack);
79
 			return -1;
80
 		    }
81
-		    stack[stptr-1] = stack[stptr-1] == stack[stptr] ? 1.0 : 0.0;
82
+		    if (isnan(stack[stptr-1])) 
83
+			;
84
+		    else if (isnan(stack[stptr]))
85
+		        stack[stptr-1] = stack[stptr];
86
+		    else
87
+		        stack[stptr-1] = stack[stptr-1] == stack[stptr] ? 1.0 : 0.0;
88
 		    stptr--;
89
 		    break;
90
 		case OP_IF:
91
@@ -1105,6 +1134,52 @@
92
 		    stack[stptr-2] = stack[stptr-2] != 0.0 ? stack[stptr-1] : stack[stptr];
93
 		    stptr--;
94
 		    stptr--;
95
+		    break;
96
+		case OP_MIN:
97
+		    if(stptr<1){
98
+			rrd_set_error("RPN stack underflow");
99
+			free(stack);
100
+			return -1;
101
+		    }
102
+		    if (isnan(stack[stptr-1])) 
103
+			;
104
+		    else if (isnan(stack[stptr]))
105
+		        stack[stptr-1] = stack[stptr];
106
+		    else if (stack[stptr-1] > stack[stptr])
107
+		        stack[stptr-1] = stack[stptr];
108
+		    stptr--;
109
+		    break;
110
+		case OP_MAX:
111
+		    if(stptr<1){
112
+			rrd_set_error("RPN stack underflow");
113
+			free(stack);
114
+			return -1;
115
+		    }
116
+		    if (isnan(stack[stptr-1])) 
117
+			;
118
+		    else if (isnan(stack[stptr]))
119
+		        stack[stptr-1] = stack[stptr];
120
+		    else if (stack[stptr-1] < stack[stptr])
121
+		        stack[stptr-1] = stack[stptr];
122
+		    stptr--;
123
+		    break;
124
+		case OP_LIMIT:
125
+		    if(stptr<2){
126
+			rrd_set_error("RPN stack underflow");
127
+			free(stack);
128
+			return -1;
129
+		    }
130
+		    if (isnan(stack[stptr-2])) 
131
+			;
132
+		    else if (isnan(stack[stptr-1]))
133
+		        stack[stptr-2] = stack[stptr-1];
134
+		    else if (isnan(stack[stptr]))
135
+		        stack[stptr-2] = stack[stptr];
136
+		    else if (stack[stptr-2] < stack[stptr-1])
137
+		        stack[stptr-2] = DNAN;
138
+		    else if (stack[stptr-2] > stack[stptr])
139
+		        stack[stptr-2] = DNAN;
140
+		    stptr-=2;
141
 		    break;
142
 		case OP_UN:
143
 		    if(stptr<0){

Return to bug 17221