- if (rrd_graph_check_vname(im,varname,arg)) return;
- if (scancount < 4)
- gdp->col.red = -1;
- } else {
- im_free(im);
- rrd_set_error("can't parse '%s'",&arg[argstart]);
- return;
- }
- break;
- case GF_CDEF:
- if((rpnex = malloc(strlen(&arg[argstart])*sizeof(char)))==NULL){
- free(im);
- rrd_set_error("malloc for CDEF");
- return;
- }
- strstart=parse_vname1(&arg[argstart],im,"CDEF");
- argstart+=strstart;
- /* parse_vname1() did free(im) and rrd_set_error() */
- if (strstart==0) return;
-
- strstart=0;
- sscanf(&arg[argstart],"%[^: ]%n",rpnex,&strstart);
- if (strstart==0) {
- rrd_set_error("can't parse RPN in CDEF:%s=%s",
- gdp->vname,
- &arg[argstart]);
- free(im);
- return;
- }
- if((gdp->rpnp =
- rpn_parse((void*)im,rpnex,&find_var_wrapper))== NULL){
- rrd_set_error("invalid rpn expression '%s'", rpnex);
- im_free(im);
- return;
- }
- free(rpnex);
- break;
- case GF_VDEF:
- strstart=parse_vname1(&arg[argstart],im,"VDEF");
- argstart+=strstart;
- /* parse_vname1() did free(im) and rrd_set_error() */
- if (strstart==0) return;
-
- strstart=0;
- sscanf(&arg[argstart],DEF_NAM_FMT ",%n",varname,&strstart);
- if (strstart==0) {
- im_free(im);
- rrd_set_error("Cannot parse '%s' in VDEF '%s'",
- &arg[argstart],
- gdp->vname);
- return;
- }
- if (rrd_graph_check_vname(im,varname,arg)) return;
- if ( im->gdes[gdp->vidx].gf != GF_DEF
- && im->gdes[gdp->vidx].gf != GF_CDEF) {
- rrd_set_error("variable '%s' not DEF nor CDEF in VDEF '%s'",
- varname,gdp->vname);
- im_free(im);
- return;
- };
-
- /* parsed upto and including the first comma. Now
- * see what function is requested. This function
- * sets the error string.
- */
- if (vdef_parse(gdp,&arg[argstart+strstart])<0) {
- im_free(im);
- return;
- };
- break;
- case GF_DEF:
- strstart=parse_vname1(&arg[argstart],im,"DEF");
- argstart+=strstart;
- /* parse_vname1() did free(im) and rrd_set_error() */
- if (strstart==0) return;
-
- argstart+=scan_for_col(&arg[argstart],MAXPATH,gdp->rrd);
- if(sscanf(&arg[argstart], ":" DS_NAM_FMT ":" CF_NAM_FMT,
- gdp->ds_nam, symname) != 2){
- im_free(im);
- rrd_set_error("can't parse DEF '%s' -2",&arg[argstart]);
- return;
- }
-
- if (rrd_graph_check_CF(im,symname,arg)) return;
- break;
+ if (find_var(im,gdp->vname)!=-1) {
+ rrd_set_error("Variable '%s' in line '%s' already in use\n",
+ gdp->vname,line);
+ break;
+ }
+ argstart+=j;
+ switch (gdp->gf) {
+ case GF_DEF:
+ argstart+=scan_for_col(&line[argstart],MAXPATH,gdp->rrd);
+ j=k=0;
+ sscanf(&line[argstart],
+ ":" DS_NAM_FMT ":" CF_NAM_FMT "%n%*s%n",
+ gdp->ds_nam, symname, &j, &k);
+ if ((j==0)||(k!=0)) {
+ rrd_set_error("Cannot parse DS or CF in '%s'",line);
+ break;
+ }
+ rrd_graph_check_CF(im,symname,line);
+ break;
+ case GF_VDEF:
+ j=0;
+ sscanf(&line[argstart],DEF_NAM_FMT ",%n",vname,&j);
+ if (j==0) {
+ rrd_set_error("Cannot parse vname in line '%s'",line);
+ break;
+ }
+ argstart+=j;
+ if (rrd_graph_check_vname(im,vname,line)) return;
+ if ( im->gdes[gdp->vidx].gf != GF_DEF
+ && im->gdes[gdp->vidx].gf != GF_CDEF) {
+ rrd_set_error("variable '%s' not DEF nor "
+ "CDEF in VDEF '%s'", vname,gdp->vname);
+ break;
+ }
+ vdef_parse(gdp,&line[argstart+strstart]);
+ break;
+ case GF_CDEF:
+ if (strstr(&line[argstart],":")!=NULL) {
+ rrd_set_error("Error in RPN, line: %s",line);
+ break;
+ }
+ if ((gdp->rpnp = rpn_parse(
+ (void *)im,
+ &line[argstart],
+ &find_var_wrapper)
+ )==NULL)
+ rrd_set_error("invalid rpn expression in: %s",line);
+ break;
+ default: break;
+ }
+ break;
+ default: rrd_set_error("Big oops");
+ }
+ if (rrd_test_error()) {
+ im_free(im);
+ return;