X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph_helper.c;h=b5be2ef9123eae984e9c78a31cd737e0a373bdf2;hp=fb72b16a0613d811cf6877f348556c647d92e4bb;hb=d4110e29da41ce702bcc3327e86768c6f266915e;hpb=65878d5b2342b37186d9557f314e8a37dbc86de2 diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c index fb72b16..b5be2ef 100644 --- a/src/rrd_graph_helper.c +++ b/src/rrd_graph_helper.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 **************************************************************************** * rrd_graph_helper.c commandline parser functions * this code initially written by Alex van den Bogaerdt @@ -62,7 +62,7 @@ int rrd_parse_color( const char *const, graph_desc_t *const); -int rrd_parse_textalign( +int rrd_parse_textalign( const char *const, unsigned int *const, graph_desc_t *const); @@ -174,7 +174,7 @@ int rrd_parse_find_gf( case GF_LINE: if (c1 == ':') { gdp->linewidth = 1; - dprintf("- - using default width of 1\n"); + dprintf("- using default width of 1\n"); } else { i = 0; sscanf(&line[*eaten], "%lf:%n", &gdp->linewidth, &i); @@ -183,7 +183,7 @@ int rrd_parse_find_gf( &line[*eaten], line); return 1; } else { - dprintf("- - scanned width %f\n", gdp->linewidth); + dprintf("- scanned width %f\n", gdp->linewidth); if (isnan(gdp->linewidth)) { rrd_set_error ("LINE width '%s' is not a number in line '%s'\n", @@ -445,9 +445,12 @@ int rrd_parse_shift( return 1; } } else { + long time_tmp = 0; + rrd_clear_error(); i = 0; - sscanf(&line[*eaten], "%li%n", &gdp->shval, &i); + sscanf(&line[*eaten], "%li%n", &time_tmp, &i); + gdp->shval = time_tmp; if (i != (int) strlen(&line[*eaten])) { rrd_set_error("Not a valid offset: %s in line %s", &line[*eaten], line); @@ -496,17 +499,14 @@ int rrd_parse_textalign( unsigned int *const eaten, graph_desc_t *const gdp) { - if (strcmp(&line[*eaten],"left")==0){ - gdp->txtalign=TXA_LEFT; - } - else if (strcmp(&line[*eaten],"right")==0){ - gdp->txtalign=TXA_RIGHT; - } - else if (strcmp(&line[*eaten],"justified")==0){ - gdp->txtalign=TXA_JUSTIFIED; - } - else if (strcmp(&line[*eaten],"center")==0){ - gdp->txtalign=TXA_CENTER; + if (strcmp(&line[*eaten], "left") == 0) { + gdp->txtalign = TXA_LEFT; + } else if (strcmp(&line[*eaten], "right") == 0) { + gdp->txtalign = TXA_RIGHT; + } else if (strcmp(&line[*eaten], "justified") == 0) { + gdp->txtalign = TXA_JUSTIFIED; + } else if (strcmp(&line[*eaten], "center") == 0) { + gdp->txtalign = TXA_CENTER; } else { rrd_set_error("Unknown alignement type '%s'", &line[*eaten]); return 1; @@ -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. @@ -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; @@ -597,9 +591,6 @@ int rrd_parse_PVHLAST( if ((gdp->vidx = find_var(im, tmpstr)) >= 0) { dprintf("- found vname: '%s' vidx %li\n", tmpstr, gdp->vidx); switch (gdp->gf) { -#ifdef WITH_PIECHART - case GF_PART: -#endif case GF_VRULE: case GF_HRULE: if (im->gdes[gdp->vidx].gf != GF_VDEF) { @@ -611,11 +602,14 @@ int rrd_parse_PVHLAST( default:; } } else { + long time_tmp = 0; + dprintf("- it is not an existing vname\n"); switch (gdp->gf) { case GF_VRULE: k = 0; - sscanf(tmpstr, "%li%n", &gdp->xrule, &k); + sscanf(tmpstr, "%li%n", &time_tmp, &k); + gdp->xrule = time_tmp; if (((j != 0) && (k == j)) || ((j == 0) && (k == i))) { dprintf("- found time: %li\n", gdp->xrule); } else { @@ -629,9 +623,9 @@ int rrd_parse_PVHLAST( k = 0; sscanf(tmpstr, "%lf%n", &gdp->yrule, &k); if (((j != 0) && (k == j)) || ((j == 0) && (k == i))) { - dprintf("- found number: %f\n", gdp->yrule); + dprintf("- found number: %lf\n", gdp->yrule); } else { - dprintf("- is is not a valid number: %li\n", gdp->xrule); + dprintf("- is is not a valid number: %lf\n", gdp->yrule); rrd_set_error ("parameter '%s' does not represent a number in line %s\n", tmpstr, line); @@ -739,29 +733,109 @@ int rrd_parse_PVHLAST( } (*eaten)++; /* after colon */ - /* PART, HRULE, VRULE and TICK cannot be stacked. */ - if ((gdp->gf == GF_HRULE) - || (gdp->gf == GF_VRULE) - || (gdp->gf == GF_TICK) - ) - return 0; + /* HRULE, VRULE and TICK cannot be stacked. */ + if ((gdp->gf != GF_HRULE) + && (gdp->gf != GF_VRULE) + && (gdp->gf != GF_TICK)) { - dprintf("- parsing '%s'\n", &line[*eaten]); - if (line[*eaten] != '\0') { - dprintf("- still more, should be STACK\n"); + dprintf("- parsing '%s', looking for STACK\n", &line[*eaten]); j = scan_for_col(&line[*eaten], 5, tmpstr); - if (line[*eaten + j] != '\0' && line[*eaten + j] != ':') { - /* not 5 chars */ - rrd_set_error("STACK expected and not found"); - return 1; - } if (!strcmp("STACK", tmpstr)) { dprintf("- found STACK\n"); gdp->stack = 1; (*eaten) += j; - } else { - rrd_set_error("STACK expected and not found"); - return 1; + if (line[*eaten] == ':') { + (*eaten) += 1; + } else if (line[*eaten] == '\0') { + dprintf("- done parsing line\n"); + return 0; + } else { + dprintf("- found %s instead of just STACK\n", &line[*eaten]); + rrd_set_error("STACK expected but %s found", &line[*eaten]); + return 1; + } + } else + dprintf("- not STACKing\n"); + } + + dprintf("- still more, should be dashes[=...]\n"); + dprintf("- parsing '%s'\n", &line[*eaten]); + if (line[*eaten] != '\0') { + /* parse dash arguments here. Possible options: + - dashes + - dashes=n_on[,n_off[,n_on,n_off]] + - dashes[=n_on[,n_off[,n_on,n_off]]]:dash-offset=offset + allowing 64 characters for definition of dash style */ + j = scan_for_col(&line[*eaten], 64, tmpstr); + /* start with dashes */ + if (strcmp(tmpstr, "dashes") == 0) { + /* if line was "dashes" or "dashes:dash-offset=xdashes=" + tmpstr will be "dashes" */ + dprintf("- found %s\n", tmpstr); + /* initialise all required variables we need for dashed lines + using default dash length of 5 pixels */ + gdp->dash = 1; + gdp->p_dashes = (double *) malloc(sizeof(double)); + gdp->p_dashes[0] = 5; + gdp->ndash = 1; + gdp->offset = 0; + (*eaten) += j; + } else if (sscanf(tmpstr, "dashes=%s", tmpstr)) { + /* dashes=n_on[,n_off[,n_on,n_off]] */ + char csv[64]; + char *pch; + float dsh; + int count = 0; + char *saveptr; + + strcpy(csv, tmpstr); + + pch = strtok_r(tmpstr, ",", &saveptr); + while (pch != NULL) { + pch = strtok_r(NULL, ",", &saveptr); + count++; + } + dprintf("- %d dash value(s) found: ", count); + if (count > 0) { + gdp->dash = 1; + gdp->ndash = count; + gdp->p_dashes = (double *) malloc(sizeof(double) * count); + pch = strtok_r(csv, ",", &saveptr); + count = 0; + while (pch != NULL) { + if (sscanf(pch, "%f", &dsh)) { + gdp->p_dashes[count] = (double) dsh; + dprintf("%.1f ", gdp->p_dashes[count]); + count++; + } + pch = strtok_r(NULL, ",", &saveptr); + } + dprintf("\n"); + } else + dprintf("- syntax error. No dash lengths found!\n"); + (*eaten) += j; + } else + dprintf("- error: expected dashes[=...], found %s\n", tmpstr); + if (line[*eaten] == ':') { + (*eaten) += 1; + } else if (line[*eaten] == '\0') { + dprintf("- done parsing line\n"); + return 0; + } + /* dashes[=n_on[,n_off[,n_on,n_off]]]:dash-offset=offset + allowing 16 characters for dash-offset=.... + => 4 characters for the offset value */ + j = scan_for_col(&line[*eaten], 16, tmpstr); + if (sscanf(tmpstr, "dash-offset=%lf", &gdp->offset)) { + dprintf("- found dash-offset=%.1f\n", gdp->offset); + gdp->dash = 1; + (*eaten) += j; + if (line[*eaten] == ':') + (*eaten) += 1; + } + if (line[*eaten] == '\0') { + dprintf("- done parsing line\n"); + return 0; } } if (line[*eaten] == '\0') { @@ -809,7 +883,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; @@ -871,7 +945,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; } @@ -879,7 +953,7 @@ 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; } @@ -898,8 +972,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) {