/****************************************************************************
- * RRDtool 1.2.12 Copyright by Tobi Oetiker, 1997-2005
+ * RRDtool 1.2.19 Copyright by Tobi Oetiker, 1997-2007
****************************************************************************
* rrd_graph_helper.c commandline parser functions
* this code initially written by Alex van den Bogaerdt
rrd_set_error("Malformed '%s' command in line '%s'\n",&line[*eaten],line);
return 1;
}
+ if (line[*eaten] == '\0') {
+ rrd_set_error("Expected some arguments after '%s'\n",line);
+ return 1;
+ }
return 0;
}
rrd_parse_print(const char *const line, unsigned int *const eaten, graph_desc_t *const gdp, image_desc_t *const im) {
/* vname:CF:format in case of DEF-based vname
** vname:CF:format in case of CDEF-based vname
- ** vname:format in case of VDEF-based vname
+ ** vname:format[:strftime] in case of VDEF-based vname
*/
if ((gdp->vidx=rrd_parse_find_vname(line,eaten,gdp,im))<0) return 1;
get the format at this juncture */
strcpy(gdp->format,gdp->legend);
gdp->legend[0]='\0';
+ /* this is a very crud test, parsing :style flags should be in a function */
+ if (im->gdes[gdp->vidx].gf == GF_VDEF && strcmp(line+(*eaten),":strftime")==0){
+ gdp->strftm = 1;
+ (*eaten)+=strlen(":strftime");
+ }
return 0;
}
dprintf("- from line '%s'\n",line);
if (rrd_parse_make_vname(line,eaten,gdp,im)) return 1;
- i=scan_for_col(&line[*eaten],254,gdp->rrd);
+ i=scan_for_col(&line[*eaten],sizeof(gdp->rrd)-1,gdp->rrd);
if (line[*eaten+i]!=':') {
rrd_set_error("Problems reading database name");
return 1;
void
rrd_graph_script(int argc, char *argv[], image_desc_t *const im, int optno) {
int i;
+ /* save state for STACK backward compat function */
+ enum gf_en last_gf=GF_PRINT;
+ float last_linewidth=0.0;
for (i=optind+optno;i<argc;i++) {
graph_desc_t *gdp;
#endif
if (rrd_parse_find_gf(argv[i],&eaten,gdp)) return;
-
+
switch (gdp->gf) {
case GF_SHIFT: /* vname:value */
if (rrd_parse_shift(argv[i],&eaten,gdp,im)) return;
case GF_COMMENT: /* text */
if (rrd_parse_legend(argv[i],&eaten,gdp)) return;
break;
- case GF_STACK: /* vname-or-value[#color[:legend]] */
#ifdef WITH_PIECHART
case GF_PART: /* value[#color[:legend]] */
#endif
case GF_LINE: /* vname-or-value[#color[:legend]][:STACK] */
case GF_AREA: /* vname-or-value[#color[:legend]][:STACK] */
case GF_TICK: /* vname#color[:num[:legend]] */
- if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im)) return;
+ if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im))return;
+ last_gf = gdp->gf;
+ last_linewidth = gdp->linewidth;
+ break;
+ 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){
+ gdp->gf = last_gf;
+ gdp->linewidth = last_linewidth;
+ } else {
+ rrd_set_error("STACK must follow LINE or AREA! command:\n%s",
+ &argv[i][eaten],argv[i]);
+ return;
+ }
break;
/* data acquisition */
case GF_DEF: /* vname=x:DS:CF:[:step=#][:start=#][:end=#] */