X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_graph_helper.c;h=25943a272cc385a63677e9432842fe1bf0f03f88;hb=28a2150521548582386dcadda9e25f8124cb0e9a;hp=b5be2ef9123eae984e9c78a31cd737e0a373bdf2;hpb=219fd9224e3117dcf59df8818d4e9e3eab26022a;p=rrdtool.git diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c index b5be2ef..25943a2 100644 --- a/src/rrd_graph_helper.c +++ b/src/rrd_graph_helper.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.3.2 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 @@ -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; @@ -567,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'; @@ -578,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 ? @@ -644,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); } @@ -862,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) { @@ -958,6 +1003,11 @@ int rrd_parse_def( 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; @@ -1109,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; @@ -1118,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 {