|
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){ |