X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_diff.c;h=fa275a61c2aa7d7f2468df547b5972b85649391b;hp=0e04de675b29cd1fdc5ab66d4a335c892d70ed05;hb=f207955a7e325708d056d3dd912863dc9930a71c;hpb=285da1fa16e80919db972b1d7021c0b4705bedb1 diff --git a/src/rrd_diff.c b/src/rrd_diff.c index 0e04de6..fa275a6 100644 --- a/src/rrd_diff.c +++ b/src/rrd_diff.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.1.x Copyright Tobias Oetiker, 1999 + * RRDtool 1.2rc6 Copyright by Tobi Oetiker, 1997-2005 * This code is stolen from rateup (mrtg-2.x) by Dave Rand ***************************************************************************** * diff calculate the difference between two very long integers available as @@ -7,6 +7,14 @@ ***************************************************************************** * $Id$ * $Log$ + * 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 * @@ -34,21 +42,31 @@ 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 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) + 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; + 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 */ @@ -89,7 +107,12 @@ rrd_diff(char *a, char *b) 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; }