new options to tune how fontsmoothing works:
[rrdtool.git] / src / rrd_graph_helper.c
index 4847812..595486a 100644 (file)
@@ -1,8 +1,8 @@
 /****************************************************************************
- * RRDtool 1.2.x  Copyright Tobias Oetiker, 1997 - 2005
+ * RRDtool 1.2.1  Copyright by Tobi Oetiker, 1997-2005
  ****************************************************************************
  * rrd_graph_helper.c  commandline parser functions 
- *                     this code was probably writtenn by Alex van den Bogaerdt
+ *                     this code initially written by Alex van den Bogaerdt
  ****************************************************************************/
 
 #include "rrd_graph.h"
@@ -34,7 +34,7 @@ int rrd_parse_cdef    (char *, unsigned int *, graph_desc_t *, image_desc_t *);
 
 int
 rrd_parse_find_gf(char *line, unsigned int *eaten, graph_desc_t *gdp) {
-    char funcname[11],c1=0,c2=0;
+    char funcname[11],c1=0;
     int i=0;
 
     sscanf(&line[*eaten], "DEBUG%n", &i);
@@ -44,7 +44,7 @@ rrd_parse_find_gf(char *line, unsigned int *eaten, graph_desc_t *gdp) {
        i=0;
        dprintf("Scanning line '%s'\n",&line[*eaten]);
     }
-    sscanf(&line[*eaten], "%10[A-Z]%n%c%c", funcname, &i, &c1, &c2);
+    sscanf(&line[*eaten], "%10[A-Z]%n%c", funcname, &i, &c1);
     if (!i) {
        rrd_set_error("Could not make sense out of '%s'",line);
        return 1;
@@ -54,12 +54,22 @@ rrd_parse_find_gf(char *line, unsigned int *eaten, graph_desc_t *gdp) {
        return 1;
     }
     if (gdp->gf == GF_LINE) {
-       if (c1 < '1' || c1 > '3' || c2 != ':') {
-           rrd_set_error("Malformed LINE command: %s",line);
-           return 1;
+       if (c1 == ':'){
+               gdp->linewidth=1;
+       } else {
+               double width;
+               *eaten+=i;
+               if (sscanf(&line[*eaten],"%lf%n:",&width,&i)){
+                       if (width < 0 || isnan(width) || isinf(width) ){
+                               rrd_set_error("LINE width is %lf. It must be finite and >= 0 though",width);
+                               return 1;
+                       }
+                       gdp->linewidth=width;
+               } else {
+                       rrd_set_error("LINE width: %s",line);
+                       return 1;
+               }
        }
-       gdp->linewidth=c1-'0';
-       i++;
     } else {
        if (c1 != ':') {
            rrd_set_error("Malformed %s command: %s",funcname,line);
@@ -97,9 +107,9 @@ rrd_parse_color(char *string, graph_desc_t *gdp) {
     sscanf(string, "#%02x%02x%02x%n%02x%n%*s%n",
                                &r,&g,&b,&i1,&a,&i2,&i3);
 
-    if (i3) return 1; /* garbage after color */
-    if (!i2) a=0xFF;
-    if (!i1) return 1; /* no color after '#' */
+    if (i3) return 1;  /* garbage after color */
+    if (!i2) a=0xFF;   /* default no transparency */
+    if (!i1) return 1; /* no color after '#' */
     gdp->col = r<<24|g<<16|b<<8|a;
     return 0;
 }
@@ -163,10 +173,10 @@ rrd_parse_print(char *line, unsigned int *eaten, graph_desc_t *gdp, image_desc_t
     }
 
     if (rrd_parse_legend(line,eaten,gdp)) return 1;
-
-    /* Why is there a separate structure member "format" ??? */
+    /* for *PRINT the legend itself gets rendered later. We only
+       get the format at this juncture */
     strcpy(gdp->format,gdp->legend);
-
+    gdp->legend[0]='\0';       
     return 0;
 }
 
@@ -175,7 +185,7 @@ rrd_parse_shift(char *line, unsigned int *eaten, graph_desc_t *gdp, image_desc_t
        char    *l = strdup(line + *eaten), *p;
        int     rc = 1;
 
-       p = strchr(l, ',');
+       p = strchr(l, ':');
        if (p == NULL) {
                rrd_set_error("Invalid SHIFT syntax");
                goto out;
@@ -347,7 +357,9 @@ rrd_parse_PVHLAST(char *line, unsigned int *eaten, graph_desc_t *gdp, image_desc
     /* PART, HRULE, VRULE and TICK cannot be stacked.  We're finished */
     if (   (gdp->gf == GF_HRULE)
        || (gdp->gf == GF_VRULE)
+#ifdef WITH_PIECHART
        || (gdp->gf == GF_PART)
+#endif
        || (gdp->gf == GF_TICK)
        ) return 0;
 
@@ -368,6 +380,10 @@ rrd_parse_PVHLAST(char *line, unsigned int *eaten, graph_desc_t *gdp, image_desc
            return 1;
        }
     }
+    /* have simpler code in the drawing section */
+    if ( gdp->gf == GF_STACK ){
+           gdp->stack=1;
+    }
     return 0;
 }
 
@@ -587,12 +603,14 @@ rrd_graph_script(int argc, char *argv[], image_desc_t *im, int optno) {
             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_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;