- 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;
- break;
- case GF_XPORT:
- if (rrd_parse_xport(argv[i],&eaten,gdp,im)) return;
- break;
- case GF_PRINT: /* vname:CF:format -or- vname:format */
- case GF_GPRINT: /* vname:CF:format -or- vname:format */
- if (rrd_parse_print(argv[i],&eaten,gdp,im)) return;
- break;
- case GF_COMMENT: /* text */
- if (rrd_parse_legend(argv[i],&eaten,gdp)) return;
- break;
-#ifdef WITH_PIECHART
- case GF_PART: /* value[#color[:legend]] */
-#endif
- case GF_VRULE: /* value#color[:legend] */
- case GF_HRULE: /* value#color[:legend] */
- case GF_LINE: /* vname-or-value[#color[:legend]][:STACK] */
- case GF_AREA: /* vname-or-value[#color[:legend]][:STACK] */
- case GF_STACK: /* vname-or-value[#color[:legend]] */
- case GF_TICK: /* vname#color[:num[:legend]] */
- if (rrd_parse_PVHLAST(argv[i],&eaten,gdp,im)) return;
- break;
- /* data acquisition */
- case GF_DEF: /* vname=x:DS:CF:[:step=#][:start=#][:end=#] */
- if (rrd_parse_def(argv[i],&eaten,gdp,im)) return;
- break;
- case GF_CDEF: /* vname=rpn-expression */
- if (rrd_parse_cdef(argv[i],&eaten,gdp,im)) return;
- break;
- case GF_VDEF: /* vname=rpn-expression */
- if (rrd_parse_vdef(argv[i],&eaten,gdp,im)) return;
- break;
- }
- if (gdp->debug) {
- dprintf("used %i out of %i chars\n",eaten,strlen(argv[i]));
- dprintf("parsed line: '%s'\n",argv[i]);
- dprintf("remaining: '%s'\n",&argv[i][eaten]);
- if (eaten >= strlen(argv[i]))
- dprintf("Command finished successfully\n");
+ /* debug output */
+ dprintf("=================================\n");
+ dprintf("TEXTALIGN : %s\n",pa->arg_orig);
+ dprintf("ALIGNMENT : %s (%u)\n",align,gdp->txtalign);
+ dprintf("=================================\n");
+ /* and return */
+ return 0;
+}
+
+int parse_shift(enum gf_en gf,parsedargs_t* pa,image_desc_t *const im) {
+ /* get new graph that we fill */
+ graph_desc_t *gdp=newGraphDescription(im,gf,pa,PARSE_VNAMEREFPOS);
+ if (!gdp) { return -1;}
+ /* and check that it is a CDEF */
+ switch (im->gdes[gdp->vidx].gf) {
+ case GF_DEF:
+ case GF_CDEF:
+ dprintf("- vname is of type DEF or CDEF, OK\n");
+ break;
+ case GF_VDEF:
+ rrd_set_error("Cannot shift a VDEF: '%s' in line '%s'\n",
+ im->gdes[gdp->vidx].vname, pa->arg_orig);
+ return 1;
+ default:
+ rrd_set_error("Encountered unknown type variable '%s' in line '%s'",
+ im->gdes[gdp->vidx].vname, pa->arg_orig);
+ return 1;
+ }
+
+ /* now parse the "shift" */
+ char* shift=getKeyValueArgument("shift",1,pa);
+ if (!shift) {shift=getFirstUnusedArgument(1,pa)->value;}
+ if (!shift) { rrd_set_error("No shift given"); return -1; }
+ /* identify shift */
+ gdp->shidx=find_var(im, shift);
+ if (gdp->shidx>=0) {
+ /* it is a def, so let us check its type*/
+ switch (im->gdes[gdp->shidx].gf) {
+ case GF_DEF:
+ case GF_CDEF:
+ rrd_set_error("Offset cannot be a (C)DEF: '%s' in line '%s'\n",
+ im->gdes[gdp->shidx].vname, pa->arg_orig);
+ return 1;
+ case GF_VDEF:
+ dprintf("- vname is of type VDEF, OK\n");
+ break;
+ default:
+ rrd_set_error
+ ("Encountered unknown type variable '%s' in line '%s'",
+ im->gdes[gdp->vidx].vname, pa->arg_orig);
+ return 1;
+ }
+ } else {
+ /* it is no def, so parse as number */
+ long val;
+ char *x;
+ int f=getLong(shift,&val,&x,10);
+ if (f) { rrd_set_error("error parsing number %s",shift); return -1; }
+ gdp->shval = val;
+ gdp->shidx = -1;
+ }
+
+ /* debug output */
+ dprintf("=================================\n");
+ dprintf("SHIFT : %s\n",pa->arg_orig);
+ dprintf("VNAME : %s (%li)\n",im->gdes[gdp->vidx].vname,gdp->vidx);
+ if (gdp->shidx>=0) {
+ dprintf("SHIFTBY : %s (%i)\n",im->gdes[gdp->shidx].vname,gdp->shidx);
+ } else {
+ dprintf("SHIFTBY : %li\n",gdp->shval);
+ }
+ dprintf("=================================\n");
+ /* and return */
+ return 0;
+}
+int parse_xport(enum gf_en gf,parsedargs_t* pa,image_desc_t *const im) {
+ /* get new graph that we fill */
+ graph_desc_t *gdp=newGraphDescription(im,gf,pa,PARSE_VNAMECOLORLEGEND);
+ if (!gdp) { return -1;}
+ /* check for cdef */
+ /* and check that it is a CDEF */
+ switch (im->gdes[gdp->vidx].gf) {
+ case GF_DEF:
+ case GF_CDEF:
+ dprintf("- vname is of type DEF or CDEF, OK\n");
+ break;
+ case GF_VDEF:
+ rrd_set_error("Cannot shift a VDEF: '%s' in line '%s'\n",
+ im->gdes[gdp->vidx].vname, pa->arg_orig);
+ return 1;
+ default:
+ rrd_set_error("Encountered unknown type variable '%s' in line '%s'",
+ im->gdes[gdp->vidx].vname, pa->arg_orig);
+ return 1;
+ }
+
+ /* debug output */
+ dprintf("=================================\n");
+ dprintf("LINE : %s\n",pa->arg_orig);
+ dprintf("VNAME : %s (%li)\n",gdp->vname,gdp->vidx);
+ dprintf("LEGEND: %s\n",gdp->legend);
+ dprintf("=================================\n");
+
+ return 0;
+}
+
+void rrd_graph_script(
+ int argc,
+ char *argv[],
+ image_desc_t *const im,
+ int optno)
+{
+ int i;
+
+ /* and now handle the things*/
+ parsedargs_t pa;
+ initParsedArguments(&pa);
+
+ /* loop arguments */
+ for (i = optind + optno; i < argc; i++) {
+ /* release parsed args - avoiding late cleanups*/
+ freeParsedArguments(&pa);
+ /* processed parsed args */
+ if (parseArguments(argv[i],&pa)) {
+ return; }
+
+ /* now let us handle the field based on the first command or cmd=...*/
+ char*cmd=NULL;
+ /* and try to get via cmd */
+ char* t=getKeyValueArgument("cmd",1,&pa);
+ if (t) {
+ cmd=t;
+ } else if ((t=getKeyValueArgument("pos0",1,&pa))) {
+ cmd=t;
+ } else {
+ rrd_set_error("no command set in argument %s",pa.arg_orig);
+ freeParsedArguments(&pa);
+ return;