/*****************************************************************************
- * RRDtool 1.0.33 Copyright Tobias Oetiker, 1999
+ * RRDtool 1.2.12 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
*****************************************************************************
* $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 <sasha@avalon-net.co.il>
+ *
+ * Revision 1.3 2002/04/01 18:31:22 oetiker
+ * "!" takes a higher preference than "||" this means rrd_update N:: would
+ * segfault -- Oliver Cook <ollie@uk.clara.net>
+ *
+ * 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
{
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 */
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;
}