X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph_helper.c;h=25943a272cc385a63677e9432842fe1bf0f03f88;hp=f9c01871b514afa665da4baa8ba81a6cf5b6a76e;hb=0b3205462f58dc3d59fe016563629e0bd03f8ae3;hpb=a4c8bc0c3fe53c713819358f506aa5d24bae5754 diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c index f9c0187..25943a2 100644 --- a/src/rrd_graph_helper.c +++ b/src/rrd_graph_helper.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.3rc4 Copyright by Tobi Oetiker, 1997-2008 + * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010 **************************************************************************** * rrd_graph_helper.c commandline parser functions * this code initially written by Alex van den Bogaerdt @@ -516,10 +516,10 @@ int rrd_parse_textalign( } -/* Parsing of PART, VRULE, HRULE, LINE, AREA, STACK and TICK +/* Parsing of VRULE, HRULE, LINE, AREA, STACK and TICK ** is done in one function. ** -** Stacking PART, VRULE, HRULE or TICK is not allowed. +** Stacking VRULE, HRULE or TICK is not allowed. ** ** If a number (which is valid to enter) is more than a ** certain amount of characters, it is caught as an error. @@ -532,7 +532,7 @@ int rrd_parse_PVHLAST( graph_desc_t *const gdp, image_desc_t *const im) { - int i, j, k; + int i, j, k, j2; int colorfound = 0; char tmpstr[MAX_VNAME_LEN + 10]; /* vname#RRGGBBAA\0 */ static int spacecnt = 0; @@ -541,18 +541,12 @@ int rrd_parse_PVHLAST( float one_space = gfx_get_text_width(im, 0, im-> text_prop[TEXT_PROP_LEGEND]. - font, - im-> - text_prop[TEXT_PROP_LEGEND]. - size, + font_desc, im->tabwidth, " ") / 4.0; float target_space = gfx_get_text_width(im, 0, im-> text_prop - [TEXT_PROP_LEGEND].font, - im-> - text_prop - [TEXT_PROP_LEGEND].size, + [TEXT_PROP_LEGEND].font_desc, im->tabwidth, "oo"); spacecnt = target_space / one_space; @@ -573,10 +567,22 @@ int rrd_parse_PVHLAST( rrd_set_error("Cannot parse line '%s'", line); return 1; } - - j = i; + + j = i; while (j > 0 && tmpstr[j] != '#') j--; + //see if there is a second color + j2 = j-1; + while (j2 > 0 && tmpstr[j2] != '#') + j2--; + if (j && j2) { //yes, swap j and j2, so that j is first color, j2 is second + int tmp = j; + j = j2; + j2 = tmp; + tmpstr[j2] = '\0'; + } else { + j2 = 0; + } if (j) { tmpstr[j] = '\0'; @@ -584,8 +590,10 @@ int rrd_parse_PVHLAST( /* We now have: * tmpstr[0] containing vname * tmpstr[j] if j!=0 then containing color - * i size of vname + color + * tmpstr[j2] if j2!=0 then containing second color + * i size of vname * j if j!=0 then size of vname + * j2 if j2!=0 then size of vname + first color */ /* Number or vname ? @@ -650,6 +658,33 @@ int rrd_parse_PVHLAST( dprintf("- parsed color %0.0f,%0.0f,%0.0f,%0.0f\n", gdp->col.red, gdp->col.green, gdp->col.blue, gdp->col.alpha); colorfound = 1; + if (j2) { //second color? + j2++; + dprintf("- examining second color '%s'\n", &tmpstr[j2]); + //TODO: maybe rrd_parse_color should take a pointer to gdp->col instead of gdp + struct gfx_color_t firstcol = gdp->col; + if (rrd_parse_color(&tmpstr[j2], gdp)) { + rrd_set_error("Could not parse color in '%s'", &tmpstr[j2]); + return 1; + } + dprintf("- parsed color %0.0f,%0.0f,%0.0f,%0.0f\n", gdp->col.red, + gdp->col.green, gdp->col.blue, gdp->col.alpha); + gdp->col2 = gdp->col; + gdp->col = firstcol; + //we now have a mandatory grid height + (*eaten) += i; + if (line[*eaten] != '\0') { + (*eaten)++; + } + dprintf("- examining gradient height\n"); + i = scan_for_col(&line[*eaten], MAX_VNAME_LEN + 9, tmpstr); + sscanf(tmpstr, "%lf%n", &gdp->gradheight, &j); + if (i != j) { + rrd_set_error("Could not parse gradient height in '%s'", tmpstr); + return 1; + } + dprintf("- parsed gradientheight %0.0f\n", gdp->gradheight); + } } else { dprintf("- no color present in '%s'\n", tmpstr); } @@ -739,7 +774,7 @@ int rrd_parse_PVHLAST( } (*eaten)++; /* after colon */ - /* PART, HRULE, VRULE and TICK cannot be stacked. */ + /* HRULE, VRULE and TICK cannot be stacked. */ if ((gdp->gf != GF_HRULE) && (gdp->gf != GF_VRULE) && (gdp->gf != GF_TICK)) { @@ -868,6 +903,10 @@ int rrd_parse_make_vname( rrd_set_error("Cannot parse vname from '%s'", line); return 1; } + if (line[*eaten+i] == '\0') { + rrd_set_error("String ends after the = sign on '%s'", line); + return 1; + } dprintf("- found candidate '%s'\n", tmpstr); if ((gdp->vidx = find_var(im, tmpstr)) >= 0) { @@ -889,7 +928,7 @@ int rrd_parse_def( int i = 0; char command[7]; /* step, start, end, reduce */ char tmpstr[256]; - struct rrd_time_value start_tv, end_tv; + rrd_time_value_t start_tv, end_tv; time_t start_tmp = 0, end_tmp = 0; char *parsetime_error = NULL; @@ -951,7 +990,7 @@ int rrd_parse_def( } else if (!strcmp("start", command)) { i = scan_for_col(&line[*eaten], 255, tmpstr); (*eaten) += i; - if ((parsetime_error = parsetime(tmpstr, &start_tv))) { + if ((parsetime_error = rrd_parsetime(tmpstr, &start_tv))) { rrd_set_error("start time: %s", parsetime_error); return 1; } @@ -959,11 +998,16 @@ int rrd_parse_def( } else if (!strcmp("end", command)) { i = scan_for_col(&line[*eaten], 255, tmpstr); (*eaten) += i; - if ((parsetime_error = parsetime(tmpstr, &end_tv))) { + if ((parsetime_error = rrd_parsetime(tmpstr, &end_tv))) { rrd_set_error("end time: %s", parsetime_error); return 1; } dprintf("- done parsing: '%s'\n", &line[*eaten]); + } else if (!strcmp("daemon", command)) { + i = scan_for_col(&line[*eaten], + sizeof (gdp->daemon), gdp->daemon); + (*eaten) += i; + dprintf("- using daemon '%s'\n", gdp->daemon); } else { rrd_set_error("Parse error in '%s'", line); return 1; @@ -978,8 +1022,8 @@ int rrd_parse_def( } (*eaten)++; } - if (proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { - /* error string is set in parsetime.c */ + if (rrd_proc_start_end(&start_tv, &end_tv, &start_tmp, &end_tmp) == -1) { + /* error string is set in rrd_parsetime.c */ return 1; } if (start_tmp < 3600 * 24 * 365 * 10) { @@ -1115,6 +1159,7 @@ void rrd_graph_script( case GF_HRULE: /* value#color[:legend] */ case GF_LINE: /* vname-or-value[#color[:legend]][:STACK] */ case GF_AREA: /* vname-or-value[#color[:legend]][:STACK] */ + case GF_GRAD: /* vname-or-value[#color[:legend][#color[:gradientheight]]][:STACK] */ case GF_TICK: /* vname#color[:num[:legend]] */ if (rrd_parse_PVHLAST(argv[i], &eaten, gdp, im)) return; @@ -1124,7 +1169,7 @@ void rrd_graph_script( case GF_STACK: /* vname-or-value[#color[:legend]] */ if (rrd_parse_PVHLAST(argv[i], &eaten, gdp, im)) return; - if (last_gf == GF_LINE || last_gf == GF_AREA) { + if (last_gf == GF_LINE || last_gf == GF_AREA || last_gf == GF_GRAD) { gdp->gf = last_gf; gdp->linewidth = last_linewidth; } else {