X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=d785331f21df4c0115c1a725802f041b4a6b71e8;hb=3882bb0c2d15f97298aaa7602d6353a1888f5547;hp=9a0c46063222dc78c6fef81547a0e03901f47720;hpb=a41958ea789dd5de85f96c1600525019ff6c5487;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 9a0c460..d785331 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.2.13 Copyright by Tobi Oetiker, 1997-2006 + * RRDtool 1.2.16 Copyright by Tobi Oetiker, 1997-2006 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -7,9 +7,12 @@ #include +#ifdef WIN32 +#include "strftime.h" +#endif #include "rrd_tool.h" -#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) +#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) #include #include #endif @@ -48,17 +51,19 @@ xlab_t xlab[] = { {10, 0, TMT_MINUTE,5, TMT_MINUTE,20, TMT_MINUTE,20, 0,"%H:%M"}, {30, 0, TMT_MINUTE,10, TMT_HOUR,1, TMT_HOUR,1, 0,"%H:%M"}, {60, 0, TMT_MINUTE,30, TMT_HOUR,2, TMT_HOUR,2, 0,"%H:%M"}, + {60, 24*3600, TMT_MINUTE,30, TMT_HOUR,2, TMT_HOUR,4, 0,"%a %H:%M"}, {180, 0, TMT_HOUR,1, TMT_HOUR,6, TMT_HOUR,6, 0,"%H:%M"}, - {180, 1*24*3600, TMT_HOUR,1, TMT_HOUR,6, TMT_HOUR,6, 0,"%a %H:%M"}, + {180, 24*3600, TMT_HOUR,1, TMT_HOUR,6, TMT_HOUR,12, 0,"%a %H:%M"}, /*{300, 0, TMT_HOUR,3, TMT_HOUR,12, TMT_HOUR,12, 12*3600,"%a %p"}, this looks silly*/ {600, 0, TMT_HOUR,6, TMT_DAY,1, TMT_DAY,1, 24*3600,"%a"}, - {600, 1*24*3600, TMT_HOUR,6, TMT_DAY,1, TMT_DAY,1, 24*3600,"%a %d"}, - {1800, 0, TMT_HOUR,12, TMT_DAY,1, TMT_DAY,2, 24*3600,"%a"}, - {1800, 1*24*3600, TMT_HOUR,12, TMT_DAY,1, TMT_DAY,2, 24*3600,"%a %d"}, - {3600, 0, TMT_DAY,1, TMT_WEEK,1, TMT_WEEK,1, 7*24*3600,"Week %V"}, - {3*3600, 0, TMT_WEEK,1, TMT_MONTH,1, TMT_WEEK,2, 7*24*3600,"Week %V"}, + {1200, 0, TMT_HOUR,6, TMT_DAY,1, TMT_DAY,1, 24*3600,"%d"}, + {1800, 0, TMT_HOUR,12, TMT_DAY,1, TMT_DAY,2, 24*3600,"%a %d"}, + {2400, 0, TMT_HOUR,12, TMT_DAY,1, TMT_DAY,2, 24*3600,"%a"}, + {3600, 0, TMT_DAY,1, TMT_WEEK,1, TMT_WEEK,1, 7*24*3600,"Week %V"}, + {3*3600, 0, TMT_WEEK,1, TMT_MONTH,1, TMT_WEEK,2, 7*24*3600,"Week %V"}, {6*3600, 0, TMT_MONTH,1, TMT_MONTH,1, TMT_MONTH,1, 30*24*3600,"%b"}, {48*3600, 0, TMT_MONTH,1, TMT_MONTH,3, TMT_MONTH,3, 30*24*3600,"%b"}, + {315360, 0, TMT_MONTH,3, TMT_YEAR,1, TMT_YEAR,1, 365*24*3600,"%Y"}, {10*24*3600, 0, TMT_YEAR,1, TMT_YEAR,1, TMT_YEAR,1, 365*24*3600,"%y"}, {-1,0,TMT_MONTH,0,TMT_MONTH,0,TMT_MONTH,0,0,""} }; @@ -713,7 +718,7 @@ data_fetch(image_desc_t *im ) break; } if (! skip) { - unsigned long ft_step = im->gdes[i].step ; + unsigned long ft_step = im->gdes[i].step ; /* ft_step will record what we got from fetch */ if((rrd_fetch_fn(im->gdes[i].rrd, im->gdes[i].cf, @@ -726,7 +731,6 @@ data_fetch(image_desc_t *im ) return -1; } im->gdes[i].data_first = 1; - im->gdes[i].step = im->step; if (ft_step < im->gdes[i].step) { reduce_data(im->gdes[i].cf_reduce, @@ -1060,8 +1064,9 @@ data_proc( image_desc_t *im ){ ** relevant for min and max */ if (finite(paintval) && im->gdes[ii].gf != GF_TICK ) { - if (isnan(minval) || paintval < minval) - minval = paintval; + if ((isnan(minval) || paintval < minval ) && + ! (im->logarithmic && paintval <= 0.0)) + minval = paintval; if (isnan(maxval) || paintval > maxval) maxval = paintval; } @@ -1441,6 +1446,19 @@ leg_place(image_desc_t *im) } else { prt_fctn = '\0'; } + /* only valid control codes */ + if (prt_fctn != 'l' && + prt_fctn != 'r' && + prt_fctn != 'j' && + prt_fctn != 'c' && + prt_fctn != 't' && + prt_fctn != '\0' && + prt_fctn != 'g' ) { + free(legspace); + rrd_set_error("Unknown control code at the end of '%s\\%c'",im->gdes[i].legend,prt_fctn); + return -1; + + } /* remove exess space */ while (prt_fctn=='g' && leg_cc > 0 && @@ -1710,6 +1728,35 @@ double frexp10(double x, double *e) { return mnt; } +static int AlmostEqual2sComplement (float A, float B, int maxUlps) +{ + + int aInt = *(int*)&A; + int bInt = *(int*)&B; + int intDiff; + /* Make sure maxUlps is non-negative and small enough that the + default NAN won't compare as equal to anything. */ + + /* assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024); */ + + /* Make aInt lexicographically ordered as a twos-complement int */ + + if (aInt < 0) + aInt = 0x80000000l - aInt; + + /* Make bInt lexicographically ordered as a twos-complement int */ + + if (bInt < 0) + bInt = 0x80000000l - bInt; + + intDiff = abs(aInt - bInt); + + if (intDiff <= maxUlps) + return 1; + + return 0; +} + /* logaritmic horizontal grid */ int horizontal_log_grid(image_desc_t *im) @@ -1719,7 +1766,8 @@ horizontal_log_grid(image_desc_t *im) {1.0, 5.0, 10., 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, {1.0, 2.0, 5.0, 7.0, 10., 0.0, 0.0, 0.0, 0.0, 0.0}, {1.0, 2.0, 4.0, 6.0, 8.0, 10., 0.0, 0.0, 0.0, 0.0}, - {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.}}; + {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.}, + {0,0,0,0,0, 0,0,0,0,0} /* last line */ }; int i, j, val_exp, min_exp; double nex; /* number of decades in data */ @@ -1728,7 +1776,7 @@ horizontal_log_grid(image_desc_t *im) int mid = -1; /* row in yloglab for major grid */ double mspac; /* smallest major grid spacing (pixels) */ int flab; /* first value in yloglab to use */ - double value, tmp; + double value, tmp, pre_value; double X0,X1,Y0; char graph_label[100]; @@ -1747,11 +1795,11 @@ horizontal_log_grid(image_desc_t *im) mid++; for(i = 0; yloglab[mid][i + 1] < 10.0; i++); mspac = logscale * log10(10.0 / yloglab[mid][i]); - } while(mspac > 2 * im->text_prop[TEXT_PROP_LEGEND].size && mid < 5); + } while(mspac > 2 * im->text_prop[TEXT_PROP_LEGEND].size && yloglab[mid][0] > 0); if(mid) mid--; /* find first value in yloglab */ - for(flab = 0; frexp10(im->minval, &tmp) > yloglab[mid][flab]; flab++); + for(flab = 0; yloglab[mid][flab] < 10 && frexp10(im->minval, &tmp) > yloglab[mid][flab] ; flab++); if(yloglab[mid][flab] == 10.0) { tmp += 1.0; flab = 0; @@ -1763,8 +1811,13 @@ horizontal_log_grid(image_desc_t *im) X1=im->xorigin+im->xsize; /* draw grid */ - while(1) { + pre_value = DNAN; + while(1) { + value = yloglab[mid][flab] * pow(10.0, val_exp); + if ( AlmostEqual2sComplement(value,pre_value,4) ) break; /* it seems we are not converging */ + + pre_value = value; Y0 = ytr(im, value); if(Y0 <= im->yorigin - im->ysize) break; @@ -2484,34 +2537,6 @@ graph_size_location(image_desc_t *im, int elements /* yes we are loosing precision by doing tos with floats instead of doubles but it seems more stable this way. */ -static int AlmostEqual2sComplement (float A, float B, int maxUlps) -{ - - int aInt = *(int*)&A; - int bInt = *(int*)&B; - int intDiff; - /* Make sure maxUlps is non-negative and small enough that the - default NAN won't compare as equal to anything. */ - - /* assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024); */ - - /* Make aInt lexicographically ordered as a twos-complement int */ - - if (aInt < 0) - aInt = 0x80000000l - aInt; - - /* Make bInt lexicographically ordered as a twos-complement int */ - - if (bInt < 0) - bInt = 0x80000000l - bInt; - - intDiff = abs(aInt - bInt); - - if (intDiff <= maxUlps) - return 1; - - return 0; -} /* draw that picture thing ... */ int