- rrd_set_error("start (%ld) should be less than end (%ld)",
- start_tmp, end_tmp);
- return -1;
- }
-
- im.start = start_tmp;
- im.end = end_tmp;
-
-
- for(i=optind+1;i<argc;i++){
- int argstart=0;
- int strstart=0;
- char varname[30],*rpnex;
- gdes_alloc(&im);
- if(sscanf(argv[i],"%10[A-Z0-9]:%n",symname,&argstart)==1){
- if((im.gdes[im.gdes_c-1].gf=gf_conv(symname))==-1){
- im_free(&im);
- rrd_set_error("unknown function '%s'",symname);
- return -1;
- }
- } else {
- rrd_set_error("can't parse '%s'",argv[i]);
- im_free(&im);
- return -1;
- }
-
- /* reset linepass if a non LINE/STACK/AREA operator gets parsed
-
- if (im.gdes[im.gdes_c-1].gf != GF_LINE1 &&
- im.gdes[im.gdes_c-1].gf != GF_LINE2 &&
- im.gdes[im.gdes_c-1].gf != GF_LINE3 &&
- im.gdes[im.gdes_c-1].gf != GF_AREA &&
- im.gdes[im.gdes_c-1].gf != GF_STACK) {
- linepass = 0;
- }
- */
-
- switch(im.gdes[im.gdes_c-1].gf){
- case GF_PRINT:
- im.prt_c++;
- case GF_GPRINT:
- strstart=0;
- sscanf(&argv[i][argstart], DEF_NAM_FMT ":%n"
- ,varname
- ,&strstart
- );
-
- if (strstart==0) {
- im_free(&im);
- rrd_set_error("can't parse vname in '%s'",&argv[i][argstart]);
- return -1;
- };
-
- if ((im.gdes[im.gdes_c-1].vidx=find_var(&im,varname))==-1){
- im_free(&im);
- rrd_set_error("Unknown variable '%s' in (G)PRINT",varname);
- return -1;
- } else {
- int n=0;
-
- sscanf(&argv[i][argstart+strstart],CF_NAM_FMT ":%n"
- ,symname
- ,&n
- );
- if (im.gdes[im.gdes[im.gdes_c-1].vidx].gf==GF_VDEF) {
- /* No consolidation function should be present */
- if (n != 0) {
- rrd_set_error("(G)PRINT of VDEF needs no CF");
- im_free(&im);
- return -1;
- }
- } else {
- /* A consolidation function should follow */
- if (n==0) {
- im_free(&im);
- rrd_set_error("Missing or incorrect CF in (G)PRINTing '%s' (%s)",varname,&argv[i][argstart]);
- return -1;
- };
- if((im.gdes[im.gdes_c-1].cf=cf_conv(symname))==-1){
- im_free(&im);
- return -1;
- };
- strstart+=n;
- };
- };
-
- scan_for_col(
- &argv[i][argstart+strstart]
- ,FMT_LEG_LEN
- ,im.gdes[im.gdes_c-1].format
- );
- break;
- case GF_COMMENT:
- if(strlen(&argv[i][argstart])>FMT_LEG_LEN) argv[i][argstart+FMT_LEG_LEN-3]='\0' ;
- strcpy(im.gdes[im.gdes_c-1].legend, &argv[i][argstart]);
- break;
- case GF_HRULE:
- /* scan for either "HRULE:vname#..." or "HRULE:num#..."
- *
- * If a vname is used, the value NaN is set; this is catched
- * when graphing. Setting value NaN from the script is not
- * permitted
- */
- strstart=0;
- sscanf(&argv[i][argstart], "%lf#%n"
- ,&im.gdes[im.gdes_c-1].yrule
- ,&strstart
- );
- if (strstart==0) { /* no number, should be vname */
- sscanf(&argv[i][argstart], DEF_NAM_FMT "#%n"
- ,varname
- ,&strstart
- );
- if (strstart) {
- im.gdes[im.gdes_c-1].yrule = DNAN;/* signal use of vname */
- if((im.gdes[im.gdes_c-1].vidx=find_var(&im,varname))==-1){
- im_free(&im);
- rrd_set_error("unknown variable '%s' in HRULE",varname);
- return -1;
- }
- if(im.gdes[im.gdes[im.gdes_c-1].vidx].gf != GF_VDEF) {
- im_free(&im);
- rrd_set_error("Only VDEF is allowed in HRULE",varname);
- return -1;
- }
- }
- } else {
-printf("DEBUG: matched HRULE:num\n");
-printf("DEBUG: strstart==%i\n",strstart);
- };
- if (strstart==0) {
- im_free(&im);
- rrd_set_error("can't parse '%s'",&argv[i][argstart]);
- return -1;
- } else {
- int n=0;
- if(sscanf(
- &argv[i][argstart+strstart],
- "%2x%2x%2x:%n",
- &col_red,
- &col_green,
- &col_blue,
- &n)>=3) {
- im.gdes[im.gdes_c-1].col.red = col_red;
- im.gdes[im.gdes_c-1].col.green = col_green;
- im.gdes[im.gdes_c-1].col.blue = col_blue;
- if (n==0) {
- im.gdes[im.gdes_c-1].legend[0] = '\0';
- } else {
- scan_for_col(&argv[i][argstart+strstart+n],FMT_LEG_LEN,im.gdes[im.gdes_c-1].legend);
- }
- } else {
- im_free(&im);
- rrd_set_error("can't parse '%s'",&argv[i][argstart]);
- return -1;
- }
- }
-
- break;
- case GF_VRULE:
- /* scan for either "VRULE:vname#..." or "VRULE:num#..."
- *
- * If a vname is used, the value 0 is set; this is catched
- * when graphing. Setting value 0 from the script is not
- * permitted
- */
- strstart=0;
- sscanf(&argv[i][argstart], "%lu#%n"
- ,(long unsigned int *)&im.gdes[im.gdes_c-1].xrule
- ,&strstart
- );
- if (strstart==0) { /* no number, should be vname */
- sscanf(&argv[i][argstart], DEF_NAM_FMT "#%n"
- ,varname
- ,&strstart
- );
- if (strstart!=0) { /* vname matched */
- im.gdes[im.gdes_c-1].xrule = 0;/* signal use of vname */
- if((im.gdes[im.gdes_c-1].vidx=find_var(&im,varname))==-1){
- im_free(&im);
- rrd_set_error("unknown variable '%s' in VRULE",varname);
- return -1;
- }
- if(im.gdes[im.gdes[im.gdes_c-1].vidx].gf != GF_VDEF) {
- im_free(&im);
- rrd_set_error("Only VDEF is allowed in VRULE",varname);
- return -1;
- }
- }
- } else {
- if (im.gdes[im.gdes_c-1].xrule==0)
- strstart=0;
- }
-
- if (strstart==0) {
- im_free(&im);
- rrd_set_error("can't parse '%s'",&argv[i][argstart]);
- return -1;
- } else {
- int n=0;
- if(sscanf(
- &argv[i][argstart+strstart],
- "%2x%2x%2x:%n",
- &col_red,
- &col_green,
- &col_blue,
- &n)>=3) {
- im.gdes[im.gdes_c-1].col.red = col_red;
- im.gdes[im.gdes_c-1].col.green = col_green;
- im.gdes[im.gdes_c-1].col.blue = col_blue;
- if (n==0) {
- im.gdes[im.gdes_c-1].legend[0] = '\0';
- } else {
- scan_for_col(&argv[i][argstart+strstart+n],FMT_LEG_LEN,im.gdes[im.gdes_c-1].legend);
- }
- } else {
- im_free(&im);
- rrd_set_error("can't parse '%s'",&argv[i][argstart]);
- return -1;
- }
- }
- break;
- case GF_TICK:
- if((scancount=sscanf(
- &argv[i][argstart],
- "%29[^:#]#%2x%2x%2x:%lf:%n",
- varname,
- &col_red,
- &col_green,
- &col_blue,
- &(im.gdes[im.gdes_c-1].yrule),
- &strstart))>=1)
- {
- im.gdes[im.gdes_c-1].col.red = col_red;
- im.gdes[im.gdes_c-1].col.green = col_green;
- im.gdes[im.gdes_c-1].col.blue = col_blue;
- if(strstart <= 0){
- im.gdes[im.gdes_c-1].legend[0] = '\0';
- } else {
- scan_for_col(&argv[i][argstart+strstart],FMT_LEG_LEN,im.gdes[im.gdes_c-1].legend);
- }
- if((im.gdes[im.gdes_c-1].vidx=find_var(&im,varname))==-1){
- im_free(&im);
- rrd_set_error("unknown variable '%s'",varname);
- return -1;
- }
- if (im.gdes[im.gdes_c-1].yrule <= 0.0 || im.gdes[im.gdes_c-1].yrule > 1.0)
- {
- im_free(&im);
- rrd_set_error("Tick mark scaling factor out of range");
- return -1;
- }
- if (scancount < 4)
- im.gdes[im.gdes_c-1].col.red = -1;
- if (scancount < 5)
- /* default tick marks: 10% of the y-axis */
- im.gdes[im.gdes_c-1].yrule = 0.1;
-
- } else {
- im_free(&im);
- rrd_set_error("can't parse '%s'",&argv[i][argstart]);
- return -1;
- } /* endif sscanf */
- break;
- case GF_STACK:
- if(linepass == 0){
- im_free(&im);
- rrd_set_error("STACK must follow AREA, LINE or STACK");
- return -1;
- }
- case GF_LINE1:
- case GF_LINE2:
- case GF_LINE3:
- case GF_AREA:
- linepass = 1;
- if((scancount=sscanf(
- &argv[i][argstart],
- "%29[^:#]#%2x%2x%2x:%n",
- varname,
- &col_red,
- &col_green,
- &col_blue,
- &strstart))>=1){
- im.gdes[im.gdes_c-1].col.red = col_red;
- im.gdes[im.gdes_c-1].col.green = col_green;
- im.gdes[im.gdes_c-1].col.blue = col_blue;
- if(strstart <= 0){
- im.gdes[im.gdes_c-1].legend[0] = '\0';
- } else {
- scan_for_col(&argv[i][argstart+strstart],FMT_LEG_LEN,im.gdes[im.gdes_c-1].legend);
- }
- if((im.gdes[im.gdes_c-1].vidx=find_var(&im,varname))==-1){
- im_free(&im);
- rrd_set_error("unknown variable '%s'",varname);
- return -1;
- }
- if (scancount < 4)
- im.gdes[im.gdes_c-1].col.red = -1;
-
- } else {
- im_free(&im);
- rrd_set_error("can't parse '%s'",&argv[i][argstart]);
- return -1;
- }
- break;
- case GF_CDEF:
- if((rpnex = malloc(strlen(&argv[i][argstart])*sizeof(char)))==NULL){
- rrd_set_error("malloc for CDEF");
- return -1;
- }
- if(sscanf(
- &argv[i][argstart],
- DEF_NAM_FMT "=%[^: ]",
- im.gdes[im.gdes_c-1].vname,
- rpnex) != 2){
- im_free(&im);
- free(rpnex);
- rrd_set_error("can't parse CDEF '%s'",&argv[i][argstart]);
- return -1;
- }
- /* checking for duplicate variable names */
- if(find_var(&im,im.gdes[im.gdes_c-1].vname) != -1){
- im_free(&im);
- rrd_set_error("duplicate variable '%s'",
- im.gdes[im.gdes_c-1].vname);
- return -1;
- }
- if((im.gdes[im.gdes_c-1].rpnp =
- rpn_parse((void*)&im,rpnex,&find_var_wrapper))== NULL){
- rrd_set_error("invalid rpn expression '%s'", rpnex);
- im_free(&im);
- return -1;
- }
- free(rpnex);
- break;
- case GF_VDEF:
- /*
- * strstart is set to zero and will NOT be changed
- * if the comma is not matched. This means that it
- * remains zero. Although strstart is initialized to
- * zero at the beginning of this loop, we do it again
- * here just in case someone changes the code...
- *
- * According to the docs we cannot rely on the
- * returned value from sscanf; it can be 2 or 3,
- * depending on %n incrementing it or not.
- */
- strstart=0;
- sscanf(
- &argv[i][argstart],
- DEF_NAM_FMT "=" DEF_NAM_FMT ",%n",
- im.gdes[im.gdes_c-1].vname,
- varname,
- &strstart);
- if (strstart){
- /* checking both variable names */
- if (find_var(&im,im.gdes[im.gdes_c-1].vname) != -1){
- im_free(&im);
- rrd_set_error("duplicate variable '%s'",
- im.gdes[im.gdes_c-1].vname);
- return -1;
- } else {
- if ((im.gdes[im.gdes_c-1].vidx=find_var(&im,varname)) == -1){
- im_free(&im);
- rrd_set_error("variable '%s' not known in VDEF '%s'",
- varname,
- im.gdes[im.gdes_c-1].vname);
- return -1;
- } else {
- if(im.gdes[im.gdes[im.gdes_c-1].vidx].gf != GF_DEF
- && im.gdes[im.gdes[im.gdes_c-1].vidx].gf != GF_CDEF){
- rrd_set_error("variable '%s' not DEF nor CDEF in VDEF '%s'",
- varname,
- im.gdes[im.gdes_c-1].vname);
- im_free(&im);
- return -1;
- }
- }
- /* parsed upto and including the first comma. Now
- * see what function is requested. This function
- * sets the error string.
- */
- if (vdef_parse(&im.gdes[im.gdes_c-1],&argv[i][argstart+strstart])<0) {
- im_free(&im);
- return -1;
- };
- }
- } else {
- im_free(&im);
- rrd_set_error("can't parse VDEF '%s'",&argv[i][argstart]);
- return -1;
- }
- break;
- case GF_DEF:
- if (sscanf(
- &argv[i][argstart],
- DEF_NAM_FMT "=%n",
- im.gdes[im.gdes_c-1].vname,
- &strstart)== 1 && strstart){ /* is the = did not match %n returns 0 */
- if(sscanf(&argv[i][argstart
- +strstart
- +scan_for_col(&argv[i][argstart+strstart],
- MAXPATH,im.gdes[im.gdes_c-1].rrd)],
- ":" DS_NAM_FMT ":" CF_NAM_FMT,
- im.gdes[im.gdes_c-1].ds_nam,
- symname) != 2){
- im_free(&im);
- rrd_set_error("can't parse DEF '%s' -2",&argv[i][argstart]);
- return -1;
- }
- } else {
- im_free(&im);
- rrd_set_error("can't parse DEF '%s'",&argv[i][argstart]);
- return -1;
- }
-
- /* checking for duplicate DEF CDEFS */
- if (find_var(&im,im.gdes[im.gdes_c-1].vname) != -1){
- im_free(&im);
- rrd_set_error("duplicate variable '%s'",
- im.gdes[im.gdes_c-1].vname);
- return -1;
- }
- if((im.gdes[im.gdes_c-1].cf=cf_conv(symname))==-1){
- im_free(&im);
- rrd_set_error("unknown cf '%s'",symname);
- return -1;
- }
- break;
- }
-
- }
-
- if (im.gdes_c==0){
- rrd_set_error("can't make a graph without contents");
- im_free(&im);
- return(-1);
- }
-
- /* parse rest of arguments containing information on what to draw*/
- if (graph_paint(&im,prdata)==-1){
- im_free(&im);
- return -1;
- }
-
- *xsize=im.xgif;
- *ysize=im.ygif;
- if (im.imginfo){
- char *filename;
- if (! (*prdata)) {
- /* maybe prdata is not allocated yet ... lets do it now */
- if((*prdata = calloc(2,sizeof(char *)))==NULL){
- rrd_set_error("malloc imginfo");
- return -1;
- };
- }
- if(((*prdata)[0] = malloc((strlen(im.imginfo)+200+strlen(im.graphfile))*sizeof(char)))
- ==NULL){
- rrd_set_error("malloc imginfo");
- return -1;
- }
- filename=im.graphfile+strlen(im.graphfile);
- while(filename > im.graphfile){
- if (*(filename-1)=='/' || *(filename-1)=='\\' ) break;
- filename--;
- }
-
- sprintf((*prdata)[0],im.imginfo,filename,im.xgif,im.ygif);