X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph.c;h=258eb528dc3ea0e1af1d045a54ef17f7d557998a;hp=594c9f6df525375f6dda0d5deea4d780c21172c2;hb=c502ca0c6ed02387134193d215f6af0b3e29afe1;hpb=afdc1dabafc566180b57ec64c9c5504c2c8e2775 diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 594c9f6..258eb52 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -7,31 +7,27 @@ #include -/* for basename */ -#ifdef HAVE_LIBGEN_H -# include -#eles -#include "plbasename.h" -#endif - #ifdef WIN32 #include "strftime.h" #endif #include "rrd_tool.h" +/* for basename */ +#ifdef HAVE_LIBGEN_H +# include +#else +#include "plbasename.h" +#endif + #if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) #include #include #endif -#ifdef HAVE_TIME_H #include -#endif -#ifdef HAVE_LOCALE_H #include -#endif #include "rrd_graph.h" #include "rrd_client.h" @@ -56,7 +52,7 @@ text_prop_t text_prop[] = { , /* unit */ {8.0, RRD_DEFAULT_FONT,NULL} /* legend */ , - {5.5, RRD_DEFAULT_FONT,NULL} /* watermark */ + {5.5, RRD_DEFAULT_FONT,NULL} /* watermark */ }; xlab_t xlab[] = { @@ -357,7 +353,7 @@ int im_free( if (status) fprintf(stderr, "OOPS: Cairo has issues it can't even die: %s\n", cairo_status_to_string(status)); - + return 0; } @@ -581,8 +577,8 @@ void apply_gridfit( ytr(im, DNAN); /* reset precalc */ log10_range = log10(im->maxval) - log10(im->minval); } - /* make sure first y=10^x gridline is located on - integer pixel position by moving scale slightly + /* make sure first y=10^x gridline is located on + integer pixel position by moving scale slightly downwards (sub-pixel movement) */ ypix = ytr(im, ya) + im->ysize; /* add im->ysize so it always is positive */ ypixfrac = ypix - floor(ypix); @@ -802,7 +798,7 @@ void reduce_data( } -/* get the data required for the graphs from the +/* get the data required for the graphs from the relevant rrds ... */ int data_fetch( @@ -919,7 +915,7 @@ int data_fetch( /* evaluate the expressions in the CDEF functions */ /************************************************************* - * CDEF stuff + * CDEF stuff *************************************************************/ long find_var_wrapper( @@ -1207,7 +1203,7 @@ int data_proc( { long i, ii; double pixstep = (double) (im->end - im->start) - / (double) im->xsize; /* how much time + / (double) im->xsize; /* how much time passes in one pixel */ double paintval; double minval = DNAN, maxval = DNAN; @@ -1252,7 +1248,7 @@ int data_proc( } else if (((long int) gr_time >= (long int) im->gdes[vidx].start) - && ((long int) gr_time <= + && ((long int) gr_time < (long int) im->gdes[vidx].end)) { value = im->gdes[vidx].data[(unsigned long) floor((double) @@ -1305,7 +1301,7 @@ int data_proc( minval = 0.0; /* catching this right away below */ maxval = 5.1; } - /* in logarithm mode, where minval is smaller or equal + /* in logarithm mode, where minval is smaller or equal to 0 make the beast just way smaller than maxval */ if (minval <= 0) { minval = maxval / 10e8; @@ -1685,7 +1681,7 @@ int leg_place( } - if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) { + if (!(im->extra_flags & NOLEGEND) && !(im->extra_flags & ONLY_GRAPH)) { if ((legspace = (int*)malloc(im->gdes_c * sizeof(int))) == NULL) { rrd_set_error("malloc for legspace"); return -1; @@ -1987,7 +1983,7 @@ int draw_horizontal_grid( double MaxY; double second_axis_magfact = 0; char *second_axis_symb = ""; - + scaledstep = im->ygrid_scale.gridstep / (double) im->magfact * (double) im->viewfactor; @@ -2047,8 +2043,8 @@ int draw_horizontal_grid( auto_scale(im,&dummy,&second_axis_symb,&second_axis_magfact); } sval /= second_axis_magfact; - - if(MaxY < 10) { + + if(MaxY < 10) { sprintf(graph_label_right,"%5.1f %s",sval,second_axis_symb); } else { sprintf(graph_label_right,"%5.0f %s",sval,second_axis_symb); @@ -2056,7 +2052,7 @@ int draw_horizontal_grid( } else { sprintf(graph_label_right,im->second_axis_format,sval); - } + } gfx_text ( im, X1+7, Y0, im->graph_col[GRC_FONT], @@ -2064,7 +2060,7 @@ int draw_horizontal_grid( im->tabwidth,0.0, GFX_H_LEFT, GFX_V_CENTER, graph_label_right ); } - + gfx_text(im, X0 - im-> @@ -2242,7 +2238,7 @@ int horizontal_log_grid( else symbol = '?'; sprintf(graph_label, "%3.0f %c", pvalue, symbol); - } else { + } else { sprintf(graph_label, "%3.0e", value); } if (im->second_axis_scale != 0){ @@ -2255,14 +2251,14 @@ int horizontal_log_grid( auto_scale(im,&sval,&symb,&mfac); sprintf(graph_label_right,"%4.0f %s", sval,symb); } - else { + else { sprintf(graph_label_right,"%3.0e", sval); } } else { sprintf(graph_label_right,im->second_axis_format,sval); - } - + } + gfx_text ( im, X1+7, Y0, im->graph_col[GRC_FONT], @@ -2270,7 +2266,7 @@ int horizontal_log_grid( im->tabwidth,0.0, GFX_H_LEFT, GFX_V_CENTER, graph_label_right ); } - + gfx_text(im, X0 - im-> @@ -2588,7 +2584,7 @@ void axis_paint( gfx_line ( im, im->xorigin+im->xsize,im->yorigin+4, im->xorigin+im->xsize,im->yorigin-im->ysize-4, MGRIDWIDTH, im->graph_col[GRC_AXIS]); - gfx_new_area ( im, + gfx_new_area ( im, im->xorigin+im->xsize-2, im->yorigin-im->ysize-2, im->xorigin+im->xsize+3, im->yorigin-im->ysize-2, im->xorigin+im->xsize, im->yorigin-im->ysize-7, /* LINEOFFSET */ @@ -2606,20 +2602,23 @@ void grid_paint( double X0, Y0; /* points for filled graph and more */ struct gfx_color_t water_color; - /* draw 3d border */ - gfx_new_area(im, 0, im->yimg, - 2, im->yimg - 2, 2, 2, im->graph_col[GRC_SHADEA]); - gfx_add_point(im, im->ximg - 2, 2); - gfx_add_point(im, im->ximg, 0); - gfx_add_point(im, 0, 0); - gfx_close_path(im); - gfx_new_area(im, 2, im->yimg - 2, - im->ximg - 2, - im->yimg - 2, im->ximg - 2, 2, im->graph_col[GRC_SHADEB]); - gfx_add_point(im, im->ximg, 0); - gfx_add_point(im, im->ximg, im->yimg); - gfx_add_point(im, 0, im->yimg); - gfx_close_path(im); + if (im->draw_3d_border > 0) { + /* draw 3d border */ + i = im->draw_3d_border; + gfx_new_area(im, 0, im->yimg, + i, im->yimg - i, i, i, im->graph_col[GRC_SHADEA]); + gfx_add_point(im, im->ximg - i, i); + gfx_add_point(im, im->ximg, 0); + gfx_add_point(im, 0, 0); + gfx_close_path(im); + gfx_new_area(im, i, im->yimg - i, + im->ximg - i, + im->yimg - i, im->ximg - i, i, im->graph_col[GRC_SHADEB]); + gfx_add_point(im, im->ximg, 0); + gfx_add_point(im, im->ximg, im->yimg); + gfx_add_point(im, 0, im->yimg); + gfx_close_path(im); + } if (im->draw_x_grid == 1) vertical_grid(im); if (im->draw_y_grid == 1) { @@ -2660,16 +2659,16 @@ void grid_paint( } if (im->second_axis_legend[0] != '\0'){ gfx_text( im, - im->xOriginLegendY2+10, + im->xOriginLegendY2+10, im->yOriginLegendY2, im->graph_col[GRC_FONT], im->text_prop[TEXT_PROP_UNIT].font_desc, - im->tabwidth, + im->tabwidth, RRDGRAPH_YLEGEND_ANGLE, GFX_H_CENTER, GFX_V_CENTER, im->second_axis_legend); - } - + } + /* graph title */ gfx_text(im, im->xOriginTitle, im->yOriginTitle+6, @@ -2689,7 +2688,7 @@ void grid_paint( text_prop[TEXT_PROP_WATERMARK]. font_desc, im->tabwidth, -90, GFX_H_LEFT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER"); - } + } /* graph watermark */ if (im->watermark[0] != '\0') { water_color = im->graph_col[GRC_FONT]; @@ -2704,7 +2703,7 @@ void grid_paint( } /* graph labels */ - if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) { + if (!(im->extra_flags & NOLEGEND) && !(im->extra_flags & ONLY_GRAPH)) { for (i = 0; i < im->gdes_c; i++) { if (im->gdes[i].legend[0] == '\0') continue; @@ -2734,41 +2733,63 @@ void grid_paint( boxV = boxH; /* shift the box up a bit */ Y0 -= boxV * 0.4; - /* make sure transparent colors show up the same way as in the graph */ - gfx_new_area(im, - X0, Y0 - boxV, - X0, Y0, X0 + boxH, Y0, im->graph_col[GRC_BACK]); - gfx_add_point(im, X0 + boxH, Y0 - boxV); - gfx_close_path(im); - gfx_new_area(im, X0, Y0 - boxV, X0, - Y0, X0 + boxH, Y0, im->gdes[i].col); - gfx_add_point(im, X0 + boxH, Y0 - boxV); - gfx_close_path(im); - cairo_save(im->cr); - cairo_new_path(im->cr); - cairo_set_line_width(im->cr, 1.0); - X1 = X0 + boxH; - Y1 = Y0 - boxV; - gfx_line_fit(im, &X0, &Y0); - gfx_line_fit(im, &X1, &Y1); - cairo_move_to(im->cr, X0, Y0); - cairo_line_to(im->cr, X1, Y0); - cairo_line_to(im->cr, X1, Y1); - cairo_line_to(im->cr, X0, Y1); - cairo_close_path(im->cr); - cairo_set_source_rgba(im->cr, - im-> - graph_col - [GRC_FRAME]. - red, - im-> - graph_col - [GRC_FRAME]. - green, - im-> - graph_col - [GRC_FRAME]. - blue, im->graph_col[GRC_FRAME].alpha); + + if (im->dynamic_labels && im->gdes[i].gf == GF_HRULE) { /* [-] */ + cairo_save(im->cr); + cairo_new_path(im->cr); + cairo_set_line_width(im->cr, 1.0); + gfx_line(im, + X0, Y0 - boxV / 2, + X0 + boxH, Y0 - boxV / 2, + 1.0, im->gdes[i].col); + gfx_close_path(im); + } else if (im->dynamic_labels && im->gdes[i].gf == GF_VRULE) { /* [|] */ + cairo_save(im->cr); + cairo_new_path(im->cr); + cairo_set_line_width(im->cr, 1.0); + gfx_line(im, + X0 + boxH / 2, Y0, + X0 + boxH / 2, Y0 - boxV, + 1.0, im->gdes[i].col); + gfx_close_path(im); + } else if (im->dynamic_labels && im->gdes[i].gf == GF_LINE) { /* [/] */ + cairo_save(im->cr); + cairo_new_path(im->cr); + cairo_set_line_width(im->cr, im->gdes[i].linewidth); + gfx_line(im, + X0, Y0, + X0 + boxH, Y0 - boxV, + im->gdes[i].linewidth, im->gdes[i].col); + gfx_close_path(im); + } else { + /* make sure transparent colors show up the same way as in the graph */ + gfx_new_area(im, + X0, Y0 - boxV, + X0, Y0, X0 + boxH, Y0, im->graph_col[GRC_BACK]); + gfx_add_point(im, X0 + boxH, Y0 - boxV); + gfx_close_path(im); + gfx_new_area(im, X0, Y0 - boxV, X0, + Y0, X0 + boxH, Y0, im->gdes[i].col); + gfx_add_point(im, X0 + boxH, Y0 - boxV); + gfx_close_path(im); + cairo_save(im->cr); + cairo_new_path(im->cr); + cairo_set_line_width(im->cr, 1.0); + X1 = X0 + boxH; + Y1 = Y0 - boxV; + gfx_line_fit(im, &X0, &Y0); + gfx_line_fit(im, &X1, &Y1); + cairo_move_to(im->cr, X0, Y0); + cairo_line_to(im->cr, X1, Y0); + cairo_line_to(im->cr, X1, Y1); + cairo_line_to(im->cr, X0, Y1); + cairo_close_path(im->cr); + cairo_set_source_rgba(im->cr, + im->graph_col[GRC_FRAME].red, + im->graph_col[GRC_FRAME].green, + im->graph_col[GRC_FRAME].blue, + im->graph_col[GRC_FRAME].alpha); + } if (im->gdes[i].dash) { /* make box borders in legend dashed if the graph is dashed */ double dashes[] = { @@ -2827,9 +2848,9 @@ int graph_size_location( /* The actual size of the image to draw is determined from ** several sources. The size given on the command line is ** the graph area but we need more as we have to draw labels - ** and other things outside the graph area. If the option - ** --full-size-mode is selected the size defines the total - ** image size and the size available for the graph is + ** and other things outside the graph area. If the option + ** --full-size-mode is selected the size defines the total + ** image size and the size available for the graph is ** calculated. */ @@ -2838,7 +2859,7 @@ int graph_size_location( ** | +---+-------------------------------+ ** | a | y | | ** | x | | | - ** | i | a | | + ** | i | a | | ** | s | x | main graph area | ** | | i | | ** | t | s | | @@ -2915,8 +2936,8 @@ int graph_size_location( Xylabel += Xspacing; /* If the legend is printed besides the graph the width has to be - ** calculated first. Placing the legend north or south of the - ** graph requires the width calculation first, so the legend is + ** calculated first. Placing the legend north or south of the + ** graph requires the width calculation first, so the legend is ** skipped for the moment. */ im->legendheight = 0; @@ -2982,7 +3003,7 @@ int graph_size_location( else{ Ymain -= Yxlabel; } - + /* reserve space for the title *or* some padding above the graph */ Ymain -= Ytitle; @@ -3034,12 +3055,12 @@ int graph_size_location( } } } - + im->yimg = Ymain + Yxlabel; if( (im->legendposition == NORTH || im->legendposition == SOUTH) && !(im->extra_flags & NOLEGEND) ){ im->yimg += im->legendheight; } - + /* reserve space for the title *or* some padding above the graph */ if (Ytitle) { im->yimg += Ytitle; @@ -3057,9 +3078,9 @@ int graph_size_location( } - /* In case of putting the legend in west or east position the first - ** legend calculation might lead to wrong positions if some items - ** are not aligned on the left hand side (e.g. centered) as the + /* In case of putting the legend in west or east position the first + ** legend calculation might lead to wrong positions if some items + ** are not aligned on the left hand side (e.g. centered) as the ** legendwidth wight have been increased after the item was placed. ** In this case the positions have to be recalculated. */ @@ -3072,7 +3093,7 @@ int graph_size_location( } /* After calculating all dimensions - ** it is now possible to calculate + ** it is now possible to calculate ** all offsets. */ switch(im->legendposition){ @@ -3213,8 +3234,8 @@ int graph_paint( return -1; /* calculate and PRINT and GPRINT definitions. We have to do it at * this point because it will affect the length of the legends - * if there are no graph elements (i==0) we stop here ... - * if we are lazy, try to quit ... + * if there are no graph elements (i==0) we stop here ... + * if we are lazy, try to quit ... */ i = print_calc(im); if (i < 0) @@ -3395,13 +3416,13 @@ int graph_paint( } /* for */ /* ******************************************************* - a ___. (a,t) + a ___. (a,t) | | ___ ____| | | | | |___| - -------|--t-1--t-------------------------------- + -------|--t-1--t-------------------------------- - if we know the value at time t was a then + if we know the value at time t was a then we draw a square from t-1 to t with the value a. ********************************************************* */ @@ -3708,7 +3729,7 @@ int graph_paint( /***************************************************** - * graph stuff + * graph stuff *****************************************************/ int gdes_alloc( @@ -3873,9 +3894,10 @@ rrd_info_t *rrd_graph_v( { image_desc_t im; rrd_info_t *grinfo; + char *old_locale; rrd_graph_init(&im); /* a dummy surface so that we can measure text sizes for placements */ - + old_locale = setlocale(LC_NUMERIC, "C"); rrd_graph_options(argc, argv, &im); if (rrd_test_error()) { rrd_info_free(im.grinfo); @@ -3905,6 +3927,8 @@ rrd_info_t *rrd_graph_v( } rrd_graph_script(argc, argv, &im, 1); + setlocale(LC_NUMERIC, old_locale); /* reenable locale for rendering the graph */ + if (rrd_test_error()) { rrd_info_free(im.grinfo); im_free(&im); @@ -3952,15 +3976,15 @@ rrd_info_t *rrd_graph_v( return grinfo; } -static void +static void rrd_set_font_desc ( image_desc_t *im,int prop,char *font, double size ){ if (font){ - strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1); - im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0'; - im->text_prop[prop].font_desc = pango_font_description_from_string( font ); + strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1); + im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0'; + im->text_prop[prop].font_desc = pango_font_description_from_string( font ); }; - if (size > 0){ + if (size > 0){ im->text_prop[prop].size = size; }; if (im->text_prop[prop].font_desc && im->text_prop[prop].size ){ @@ -3980,16 +4004,13 @@ void rrd_graph_init( #ifdef HAVE_TZSET tzset(); #endif -#ifdef HAVE_SETLOCALE - setlocale(LC_TIME, ""); -#ifdef HAVE_MBSTOWCS - setlocale(LC_CTYPE, ""); -#endif -#endif + im->base = 1000; im->daemon_addr = NULL; im->draw_x_grid = 1; im->draw_y_grid = 1; + im->draw_3d_border = 2; + im->dynamic_labels = 0; im->extra_flags = 0; im->font_options = cairo_font_options_create(); im->forceleftspace = 0; @@ -4040,7 +4061,7 @@ void rrd_graph_init( im->second_axis_scale = 0; /* 0 disables it */ im->second_axis_shift = 0; /* no shift by default */ im->second_axis_legend[0] = '\0'; - im->second_axis_format[0] = '\0'; + im->second_axis_format[0] = '\0'; im->yorigin = 0; im->yOriginLegend = 0; im->yOriginLegendY = 0; @@ -4049,7 +4070,7 @@ void rrd_graph_init( im->ysize = 100; im->zoom = 1; - im->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10); + im->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10); im->cr = cairo_create(im->surface); for (i = 0; i < DIM(text_prop); i++) { @@ -4100,7 +4121,6 @@ void rrd_graph_options( long long_tmp; rrd_time_value_t start_tv, end_tv; long unsigned int color; - char *old_locale = ""; /* defines for long options without a short equivalent. should be bytes, and may not collide with (the ASCII value of) short options */ @@ -4108,55 +4128,58 @@ void rrd_graph_options( /* *INDENT-OFF* */ struct option long_options[] = { - { "start", required_argument, 0, 's'}, - { "end", required_argument, 0, 'e'}, - { "x-grid", required_argument, 0, 'x'}, - { "y-grid", required_argument, 0, 'y'}, - { "vertical-label", required_argument, 0, 'v'}, - { "width", required_argument, 0, 'w'}, - { "height", required_argument, 0, 'h'}, - { "full-size-mode", no_argument, 0, 'D'}, - { "interlaced", no_argument, 0, 'i'}, - { "upper-limit", required_argument, 0, 'u'}, - { "lower-limit", required_argument, 0, 'l'}, - { "rigid", no_argument, 0, 'r'}, + { "alt-autoscale", no_argument, 0, 'A'}, + { "imgformat", required_argument, 0, 'a'}, + { "font-smoothing-threshold", required_argument, 0, 'B'}, { "base", required_argument, 0, 'b'}, - { "logarithmic", no_argument, 0, 'o'}, { "color", required_argument, 0, 'c'}, - { "font", required_argument, 0, 'n'}, - { "title", required_argument, 0, 't'}, + { "full-size-mode", no_argument, 0, 'D'}, + { "daemon", required_argument, 0, 'd'}, + { "slope-mode", no_argument, 0, 'E'}, + { "end", required_argument, 0, 'e'}, + { "force-rules-legend", no_argument, 0, 'F'}, { "imginfo", required_argument, 0, 'f'}, - { "imgformat", required_argument, 0, 'a'}, - { "lazy", no_argument, 0, 'z'}, - { "zoom", required_argument, 0, 'm'}, + { "graph-render-mode", required_argument, 0, 'G'}, { "no-legend", no_argument, 0, 'g'}, - { "legend-position", required_argument, 0, 1005}, - { "legend-direction", required_argument, 0, 1006}, - { "force-rules-legend", no_argument, 0, 'F'}, - { "only-graph", no_argument, 0, 'j'}, - { "alt-y-grid", no_argument, 0, 'Y'}, - {"disable-rrdtool-tag", no_argument, 0, 1001}, - {"right-axis", required_argument, 0, 1002}, - {"right-axis-label", required_argument, 0, 1003}, - {"right-axis-format", required_argument, 0, 1004}, - { "no-minor", no_argument, 0, 'I'}, - { "slope-mode", no_argument, 0, 'E'}, - { "alt-autoscale", no_argument, 0, 'A'}, + { "height", required_argument, 0, 'h'}, + { "no-minor", no_argument, 0, 'I'}, + { "interlaced", no_argument, 0, 'i'}, { "alt-autoscale-min", no_argument, 0, 'J'}, + { "only-graph", no_argument, 0, 'j'}, + { "units-length", required_argument, 0, 'L'}, + { "lower-limit", required_argument, 0, 'l'}, { "alt-autoscale-max", no_argument, 0, 'M'}, + { "zoom", required_argument, 0, 'm'}, { "no-gridfit", no_argument, 0, 'N'}, - { "units-exponent", required_argument, 0, 'X'}, - { "units-length", required_argument, 0, 'L'}, - { "units", required_argument, 0, LONGOPT_UNITS_SI}, + { "font", required_argument, 0, 'n'}, + { "logarithmic", no_argument, 0, 'o'}, + { "pango-markup", no_argument, 0, 'P'}, + { "font-render-mode", required_argument, 0, 'R'}, + { "rigid", no_argument, 0, 'r'}, { "step", required_argument, 0, 'S'}, + { "start", required_argument, 0, 's'}, { "tabwidth", required_argument, 0, 'T'}, - { "font-render-mode", required_argument, 0, 'R'}, - { "graph-render-mode", required_argument, 0, 'G'}, - { "font-smoothing-threshold", required_argument, 0, 'B'}, + { "title", required_argument, 0, 't'}, + { "upper-limit", required_argument, 0, 'u'}, + { "vertical-label", required_argument, 0, 'v'}, { "watermark", required_argument, 0, 'W'}, + { "width", required_argument, 0, 'w'}, + { "units-exponent", required_argument, 0, 'X'}, + { "x-grid", required_argument, 0, 'x'}, + { "alt-y-grid", no_argument, 0, 'Y'}, + { "y-grid", required_argument, 0, 'y'}, + { "lazy", no_argument, 0, 'z'}, + { "units", required_argument, 0, LONGOPT_UNITS_SI}, { "alt-y-mrtg", no_argument, 0, 1000}, /* this has no effect it is just here to save old apps from crashing when they use it */ - { "pango-markup", no_argument, 0, 'P'}, - { "daemon", required_argument, 0, 'd'}, + { "disable-rrdtool-tag",no_argument, 0, 1001}, + { "right-axis", required_argument, 0, 1002}, + { "right-axis-label", required_argument, 0, 1003}, + { "right-axis-format", required_argument, 0, 1004}, + { "legend-position", required_argument, 0, 1005}, + { "legend-direction", required_argument, 0, 1006}, + { "border", required_argument, 0, 1007}, + { "grid-dash", required_argument, 0, 1008}, + { "dynamic-labels", no_argument, 0, 1009}, { 0, 0, 0, 0} }; /* *INDENT-ON* */ @@ -4171,7 +4194,7 @@ void rrd_graph_options( int col_start, col_end; opt = getopt_long(argc, argv, - "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:kPd:", + "Aa:B:b:c:Dd:Ee:Ff:G:gh:IiJjL:l:Nn:Bb:oPR:rS:s:T:t:u:v:W:w:X:x:Yy:z", long_options, &option_index); if (opt == EOF) break; @@ -4226,11 +4249,10 @@ void rrd_graph_options( break; case 1001: im->extra_flags |= NO_RRDTOOL_TAG; - break; + break; case LONGOPT_UNITS_SI: if (im->extra_flags & FORCE_UNITS) { rrd_set_error("--units can only be used once!"); - setlocale(LC_NUMERIC, old_locale); return; } if (strcmp(optarg, "si") == 0) @@ -4248,14 +4270,10 @@ void rrd_graph_options( im->forceleftspace = 1; break; case 'T': - old_locale = setlocale(LC_NUMERIC, "C"); im->tabwidth = atof(optarg); - setlocale(LC_NUMERIC, old_locale); break; case 'S': - old_locale = setlocale(LC_NUMERIC, "C"); im->step = atoi(optarg); - setlocale(LC_NUMERIC, old_locale); break; case 'N': im->gridfit = 0; @@ -4319,9 +4337,7 @@ void rrd_graph_options( im->draw_y_grid = 0; break; }; - old_locale = setlocale(LC_NUMERIC, "C"); if (sscanf(optarg, "%lf:%d", &im->ygridstep, &im->ylabfact) == 2) { - setlocale(LC_NUMERIC, old_locale); if (im->ygridstep <= 0) { rrd_set_error("grid step must be > 0"); return; @@ -4330,11 +4346,25 @@ void rrd_graph_options( return; } } else { - setlocale(LC_NUMERIC, old_locale); rrd_set_error("invalid y-grid format"); return; } break; + case 1007: + im->draw_3d_border = atoi(optarg); + break; + case 1008: /* grid-dash */ + if(sscanf(optarg, + "%lf:%lf", + &im->grid_dash_on, + &im->grid_dash_off) != 2) { + rrd_set_error("expected grid-dash format float:float"); + return; + } + break; + case 1009: /* enable dynamic labels */ + im->dynamic_labels = 1; + break; case 1002: /* right y axis */ if(sscanf(optarg, @@ -4367,14 +4397,10 @@ void rrd_graph_options( im->ylegend[150] = '\0'; break; case 'u': - old_locale = setlocale(LC_NUMERIC, "C"); im->maxval = atof(optarg); - setlocale(LC_NUMERIC, old_locale); break; case 'l': - old_locale = setlocale(LC_NUMERIC, "C"); im->minval = atof(optarg); - setlocale(LC_NUMERIC, old_locale); break; case 'b': im->base = atol(optarg); @@ -4479,20 +4505,18 @@ void rrd_graph_options( double size = 1; int end; - old_locale = setlocale(LC_NUMERIC, "C"); if (sscanf(optarg, "%10[A-Z]:%lf%n", prop, &size, &end) >= 2) { int sindex, propidx; - setlocale(LC_NUMERIC, old_locale); if ((sindex = text_prop_conv(prop)) != -1) { for (propidx = sindex; propidx < TEXT_PROP_LAST; propidx++) { if (size > 0) { - rrd_set_font_desc(im,propidx,NULL,size); + rrd_set_font_desc(im,propidx,NULL,size); } if ((int) strlen(optarg) > end+2) { if (optarg[end] == ':') { - rrd_set_font_desc(im,propidx,optarg + end + 1,0); + rrd_set_font_desc(im,propidx,optarg + end + 1,0); } else { rrd_set_error ("expected : after font size in '%s'", @@ -4510,16 +4534,13 @@ void rrd_graph_options( return; } } else { - setlocale(LC_NUMERIC, old_locale); rrd_set_error("invalid text property format"); return; } break; } case 'm': - old_locale = setlocale(LC_NUMERIC, "C"); im->zoom = atof(optarg); - setlocale(LC_NUMERIC, old_locale); if (im->zoom <= 0.0) { rrd_set_error("zoom factor must be > 0"); return; @@ -4598,7 +4619,7 @@ void rrd_graph_options( int status = rrdc_connect(im->daemon_addr); if (status != 0) return; } - + pango_cairo_context_set_font_options(pango_layout_get_context(im->layout), im->font_options); pango_layout_context_changed(im->layout); @@ -4742,12 +4763,9 @@ int vdef_parse( double param; char func[30]; int n; - char *old_locale; n = 0; - old_locale = setlocale(LC_NUMERIC, "C"); sscanf(str, "%le,%29[A-Z]%n", ¶m, func, &n); - setlocale(LC_NUMERIC, old_locale); if (n == (int) strlen(str)) { /* matched */ ; } else { @@ -4867,7 +4885,7 @@ int vdef_calc( array[step] = data[step * src->ds_cnt]; } qsort(array, step, sizeof(double), vdef_percent_compar); - field = (steps - 1) * dst->vf.param / 100; + field = round((dst->vf.param * (double)(steps - 1)) / 100.0); dst->vf.val = array[field]; dst->vf.when = 0; /* no time component */ free(array); @@ -4900,7 +4918,7 @@ int vdef_calc( } } qsort(array, nancount, sizeof(double), vdef_percent_compar); - field = (nancount - 1) * dst->vf.param / 100; + field = round( dst->vf.param * (double)(nancount - 1) / 100.0); dst->vf.val = array[field]; dst->vf.when = 0; /* no time component */ free(array);