X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_diff.c;h=07f8fb3b154e87551f157a2673b66e1cc653a18a;hb=3e4e57c524ed5bbded8aa2a96cd99c5c26c980cf;hp=1d0d1f54f2ff9f0619ee22e3343a8ed3f1b14075;hpb=5837606887a6d81e8b1f7588525cb1c8783fb62b;p=rrdtool.git diff --git a/src/rrd_diff.c b/src/rrd_diff.c index 1d0d1f5..07f8fb3 100644 --- a/src/rrd_diff.c +++ b/src/rrd_diff.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.0.33 Copyright Tobias Oetiker, 1999 + * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010 * This code is stolen from rateup (mrtg-2.x) by Dave Rand ***************************************************************************** * diff calculate the difference between two very long integers available as @@ -7,8 +7,19 @@ ***************************************************************************** * $Id$ * $Log$ - * Revision 1.1 2001/02/25 22:25:05 oetiker - * Initial revision + * Revision 1.4 2003/03/10 00:30:34 oetiker + * handle cases with two negative numbers + * -- Sasha Mikheev + * + * Revision 1.3 2002/04/01 18:31:22 oetiker + * "!" takes a higher preference than "||" this means rrd_update N:: would + * segfault -- Oliver Cook + * + * Revision 1.2 2002/02/01 20:34:49 oetiker + * fixed version number and date/time + * + * Revision 1.1.1.1 2001/02/25 22:25:05 oetiker + * checkin * * Revision 1.1 1998/10/08 18:21:45 oetiker * Initial revision @@ -24,38 +35,52 @@ * *****************************************************************************/ +#include #include "rrd_tool.h" -double -rrd_diff(char *a, char *b) +double rrd_diff( + char *a, + char *b) { - char res[LAST_DS_LEN+1], *a1, *b1, *r1, *fix; - int c,x,m; - - while (!isdigit((int)*a) || *a==0) + char res[LAST_DS_LEN + 1], *a1, *b1, *r1, *fix; + int c, x, m; + char a_neg = 0, b_neg = 0; + double result; + + while (!(isdigit((int) *a) || *a == 0)) { + if (*a == '-') + a_neg = 1; a++; - fix=a; - while (isdigit((int)*fix)) - fix++; - *fix = 0; /* maybe there is some non digit data in the string */ - while (!isdigit((int)*b) || *b==0) + } + fix = a; + while (isdigit((int) *fix)) + fix++; + *fix = 0; /* maybe there is some non digit data in the string */ + while (!(isdigit((int) *b) || *b == 0)) { + if (*b == '-') + b_neg = 1; b++; - fix=b; - while (isdigit((int)*fix)) - fix++; - *fix = 0; /* maybe there is some non digit data in the string */ - if(!isdigit((int)*a) || !isdigit((int)*b)) - return DNAN; - a1 = &a[strlen(a)-1]; - m = max(strlen(a),strlen(b)); - if (m > LAST_DS_LEN) return DNAN; /* result string too short */ + } + fix = b; + while (isdigit((int) *fix)) + fix++; + *fix = 0; /* maybe there is some non digit data in the string */ + if (!isdigit((int) *a) || !isdigit((int) *b)) + return DNAN; + if (a_neg + b_neg == 1) /* can not handle numbers with different signs yet */ + return DNAN; + a1 = &a[strlen(a) - 1]; + m = max(strlen(a), strlen(b)); + if (m > LAST_DS_LEN) + return DNAN; /* result string too short */ - r1 = &res[m+1]; - for (b1 = res;b1 <= r1; b1++) *b1 = ' '; - b1 = &b[strlen(b)-1]; - r1[1] = 0; /* Null terminate result */ + r1 = &res[m + 1]; + for (b1 = res; b1 <= r1; b1++) + *b1 = ' '; + b1 = &b[strlen(b) - 1]; + r1[1] = 0; /* Null terminate result */ c = 0; - for (x=0; x= a && b1 >= b) { *r1 = ((*a1 - c) - *b1) + '0'; } else if (a1 >= a) { @@ -65,28 +90,34 @@ rrd_diff(char *a, char *b) } if (*r1 < '0') { *r1 += 10; - c=1; - } else - if (*r1 > '9') { /* 0 - 10 */ - *r1 -= 10; - c=1; - } else { - c=0; + c = 1; + } else if (*r1 > '9') { /* 0 - 10 */ + *r1 -= 10; + c = 1; + } else { + c = 0; } - a1--;b1--;r1--; + a1--; + b1--; + r1--; } if (c) { - r1 = &res[m+1]; - for (x=0; isdigit((int)*r1) && x '9') { *r1 -= 10; - c=1; + c = 1; } else { - c=0; + c = 0; } } - return(-atof(res)); + result = -atof(res); } else - return(atof(res)); -} + result = atof(res); + + if (a_neg + b_neg == 2) /* both are negatives, reverse sign */ + result = -result; + + return result; +}