+/****************************************************************************
+ * RRDtool 1.2.x Copyright Tobias Oetiker, 1997 - 2005
+ ****************************************************************************
+ * rrd_graph_helper.c commandline parser functions
+ * this code was probably writtenn by Alex van den Bogaerdt
+ ****************************************************************************/
+
#include "rrd_graph.h"
#define dprintf if (gdp->debug) printf
int rrd_parse_find_gf (char *, unsigned int *, graph_desc_t *);
int rrd_parse_legend (char *, unsigned int *, graph_desc_t *);
int rrd_parse_color (char *, graph_desc_t *);
-int rrd_parse_CF (char *, unsigned int *, graph_desc_t *);
+int rrd_parse_CF (char *, unsigned int *, graph_desc_t *, enum cf_en *);
int rrd_parse_print (char *, unsigned int *, graph_desc_t *, image_desc_t *);
int rrd_parse_shift (char *, unsigned int *, graph_desc_t *, image_desc_t *);
int rrd_parse_xport (char *, unsigned int *, graph_desc_t *, image_desc_t *);
}
int
-rrd_parse_CF(char *line, unsigned int *eaten, graph_desc_t *gdp) {
+rrd_parse_CF(char *line, unsigned int *eaten, graph_desc_t *gdp, enum cf_en *cf) {
char symname[CF_NAM_SIZE];
int i=0;
(*eaten)+=i;
dprintf("- using CF '%s'\n",symname);
- if ((int)(gdp->cf = cf_conv(symname))==-1) {
+ if ((int)(*cf = cf_conv(symname))==-1) {
rrd_set_error("Unknown CF '%s' in '%s'",symname,line);
return 1;
}
case GF_DEF:
case GF_CDEF:
dprintf("- vname is of type DEF or CDEF, looking for CF\n");
- if (rrd_parse_CF(line,eaten,gdp)) return 1;
+ if (rrd_parse_CF(line,eaten,gdp,&gdp->cf)) return 1;
break;
case GF_VDEF:
dprintf("- vname is of type VDEF\n");
}
if (rrd_parse_legend(line,eaten,gdp)) return 1;
-
- /* Why is there a separate structure member "format" ??? */
+ /* for *PRINT the legend itself gets renderd later. We only
+ get the format at this juncture */
strcpy(gdp->format,gdp->legend);
-
+ gdp->legend[0]='\0';
return 0;
}
if (colorfound) { /* no legend if no color */
if (gdp->gf == GF_TICK) {
dprintf("- looking for optional number\n");
- sscanf(&line[*eaten],"%lf:%n",&gdp->yrule,&j);
+ sscanf(&line[*eaten],"%lf%n",&gdp->yrule,&j);
if (j) {
dprintf("- found number %f\n",gdp->yrule);
(*eaten)+=j;
rrd_set_error("Tick factor should be <= 1.0");
return 1;
}
+ if (line[*eaten] == ':')
+ (*eaten)++;
} else {
dprintf("- not found, defaulting to 0.1\n");
gdp->yrule=0.1;
}
dprintf("- looking for optional legend\n");
dprintf("- in '%s'\n",&line[*eaten]);
+ /* the legend for a graph item must start with "m " the first
+ m will then be over drawn with a color box. Since there
+ is ample space I overwrite the first few characters of the line
+ with the material that I want to see in the legend */
+ if (line[*eaten] != '\0' && line[*eaten] != ':'){
+ *eaten = *eaten - 2;
+ line[*eaten] = 'm';
+ line[*eaten+1] = ' ';
+ }
if (rrd_parse_legend(line, eaten, gdp)) return 1;
}
return 1;
}
}
-
return 0;
}
int
rrd_parse_def(char *line, unsigned int *eaten, graph_desc_t *gdp, image_desc_t *im) {
int i=0;
- char command[6]; /* step, start, end */
+ char command[7]; /* step, start, end, reduce */
char tmpstr[256];
struct rrd_time_value start_tv,end_tv;
time_t start_tmp=0,end_tmp=0;
(*eaten)+=i;
dprintf("- using DS '%s'\n",gdp->ds_nam);
- if (rrd_parse_CF(line,eaten,gdp)) return 1;
-
+ if (rrd_parse_CF(line,eaten,gdp,&gdp->cf)) return 1;
+ gdp->cf_reduce = gdp->cf;
+
if (line[*eaten]=='\0') return 0;
while (1) {
dprintf("- optional parameter follows: %s\n", &line[*eaten]);
i=0;
- sscanf(&line[*eaten], "%5[a-z]=%n", command, &i);
+ sscanf(&line[*eaten], "%6[a-z]=%n", command, &i);
if (!i) {
rrd_set_error("Parse error in '%s'",line);
return 1;
}
(*eaten)+=i;
dprintf("- processing '%s'\n",command);
- if (!strcmp("step",command)) {
+ if (!strcmp("reduce",command)) {
+ if (rrd_parse_CF(line,eaten,gdp,&gdp->cf_reduce)) return 1;
+ if (line[*eaten] != '\0')
+ (*eaten)--;
+ } else if (!strcmp("step",command)) {
i=0;
sscanf(&line[*eaten],"%lu%n",&gdp->step,&i);
(*eaten)+=i;