From 42f44336caceae90b9e743f9e6d4c8f7e5bda3a4 Mon Sep 17 00:00:00 2001 From: oetiker Date: Mon, 10 Mar 2003 00:30:34 +0000 Subject: [PATCH] handle cases with two negative numbers -- Sasha Mikheev git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk@191 a5681a0c-68f1-0310-ab6d-d61299d08faa --- program/src/rrd_diff.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/program/src/rrd_diff.c b/program/src/rrd_diff.c index 3f80a156..c7c11f93 100644 --- a/program/src/rrd_diff.c +++ b/program/src/rrd_diff.c @@ -7,6 +7,10 @@ ***************************************************************************** * $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 @@ -38,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 */ @@ -93,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; } -- 2.30.2