badformat parser fixed ... for good this time I hope
[rrdtool.git] / src / rrd_graph.c
index 135a8a0..17ec03a 100644 (file)
@@ -6,6 +6,9 @@
 
 
 #include <sys/stat.h>
+
+#include "rrd_tool.h"
+
 #ifdef WIN32
 #include <io.h>
 #include <fcntl.h>
@@ -19,8 +22,6 @@
 #include <locale.h>
 #endif
 
-#include "rrd_tool.h"
-
 #include "rrd_graph.h"
 #include "rrd_graph_helper.h"
 
@@ -194,6 +195,7 @@ enum gfx_if_en if_conv(char *string){
     conv_if(PNG,IF_PNG)
     conv_if(SVG,IF_SVG)
     conv_if(EPS,IF_EPS)
+    conv_if(PDF,IF_PDF)
 
     return (-1);
 }
@@ -1569,16 +1571,18 @@ int draw_horizontal_grid(image_desc_t *im)
                              im->text_prop[TEXT_PROP_AXIS].size,
                              im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER,
                              graph_label );
-              gfx_new_line ( im->canvas,
+              gfx_new_dashed_line ( im->canvas,
                              X0-2,Y0,
                              X1+2,Y0,
-                             MGRIDWIDTH, im->graph_col[GRC_MGRID] );          
+                             MGRIDWIDTH, im->graph_col[GRC_MGRID],
+                             im->grid_dash_on, im->grid_dash_off);            
               
            } else {            
-              gfx_new_line ( im->canvas,
+              gfx_new_dashed_line ( im->canvas,
                              X0-1,Y0,
                              X1+1,Y0,
-                             GRIDWIDTH, im->graph_col[GRC_GRID] );            
+                             GRIDWIDTH, im->graph_col[GRC_GRID],
+                             im->grid_dash_on, im->grid_dash_off);            
               
            }       
        }       
@@ -1629,10 +1633,11 @@ horizontal_log_grid(image_desc_t   *im)
        while(yloglab[minoridx][++i] > 0){          
           Y0 = ytr(im,value * yloglab[minoridx][i]);
           if (Y0 <= im->yorigin - im->ysize) break;
-          gfx_new_line ( im->canvas,
+          gfx_new_dashed_line ( im->canvas,
                          X0-1,Y0,
                          X1+1,Y0,
-                         GRIDWIDTH, im->graph_col[GRC_GRID] );
+                         GRIDWIDTH, im->graph_col[GRC_GRID],
+                         im->grid_dash_on, im->grid_dash_off);
        }
     }
 
@@ -1646,10 +1651,11 @@ horizontal_log_grid(image_desc_t   *im)
        while(yloglab[majoridx][++i] > 0){          
           Y0 = ytr(im,value * yloglab[majoridx][i]);    
           if (Y0 <= im->yorigin - im->ysize) break;
-          gfx_new_line ( im->canvas,
+          gfx_new_dashed_line ( im->canvas,
                          X0-2,Y0,
                          X1+2,Y0,
-                         MGRIDWIDTH, im->graph_col[GRC_MGRID] );
+                         MGRIDWIDTH, im->graph_col[GRC_MGRID],
+                         im->grid_dash_on, im->grid_dash_off);
           
           sprintf(graph_label,"%3.0e",value * yloglab[majoridx][i]);
           gfx_new_text ( im->canvas,
@@ -1670,7 +1676,7 @@ vertical_grid(
     image_desc_t   *im )
 {   
     int xlab_sel;              /* which sort of label and grid ? */
-    time_t ti, tilab;
+    time_t ti, tilab, timajor;
     long factor;
     char graph_label[100];
     double X0,Y0,Y1; /* points for filled graph and more*/
@@ -1703,14 +1709,24 @@ vertical_grid(
     /* paint the minor grid */
     for(ti = find_first_time(im->start,
                            im->xlab_user.gridtm,
-                           im->xlab_user.gridst);
+                           im->xlab_user.gridst),
+        timajor = find_first_time(im->start,
+                           im->xlab_user.mgridtm,
+                           im->xlab_user.mgridst);
        ti < im->end; 
        ti = find_next_time(ti,im->xlab_user.gridtm,im->xlab_user.gridst)
        ){
        /* are we inside the graph ? */
        if (ti < im->start || ti > im->end) continue;
+       while (timajor < ti) {
+           timajor = find_next_time(timajor,
+                   im->xlab_user.mgridtm, im->xlab_user.mgridst);
+       }
+       if (ti == timajor) continue; /* skip as falls on major grid line */
        X0 = xtr(im,ti);       
-       gfx_new_line(im->canvas,X0,Y0+1, X0,Y1-1,GRIDWIDTH, im->graph_col[GRC_GRID]);
+       gfx_new_dashed_line(im->canvas,X0,Y0+1, X0,Y1-1,GRIDWIDTH,
+          im->graph_col[GRC_GRID],
+          im->grid_dash_on, im->grid_dash_off);
        
     }
 
@@ -1724,7 +1740,9 @@ vertical_grid(
        /* are we inside the graph ? */
        if (ti < im->start || ti > im->end) continue;
        X0 = xtr(im,ti);
-       gfx_new_line(im->canvas,X0,Y0+2, X0,Y1-2,MGRIDWIDTH, im->graph_col[GRC_MGRID]);
+       gfx_new_dashed_line(im->canvas,X0,Y0+3, X0,Y1-2,MGRIDWIDTH,
+          im->graph_col[GRC_MGRID],
+          im->grid_dash_on, im->grid_dash_off);
        
     }
     /* paint the labels below the graph */
@@ -2605,6 +2623,8 @@ rrd_graph_init(image_desc_t *im)
     im->gdes_c = 0;
     im->gdes = NULL;
     im->canvas = gfx_new_canvas();
+    im->grid_dash_on = 1;
+    im->grid_dash_off = 1;
 
     for(i=0;i<DIM(graph_col);i++)
         im->graph_col[i]=graph_col[i];
@@ -3223,33 +3243,41 @@ rrd_graph_legend(graph_desc_t *gdp, char *line)
 
 
 int bad_format(char *fmt) {
-       char *ptr;
-       int n=0;
-
-       ptr = fmt;
-       while (*ptr != '\0') {
-               if (*ptr == '%') {ptr++;
-                       if (*ptr == '\0') return 1;
-                       while ((*ptr >= '0' && *ptr <= '9') || *ptr == '.') { 
-                               ptr++;
-                       }
-                       if (*ptr == '\0') return 1;
-                       if (*ptr == 'l') {
-                               ptr++;
-                               n++;
-                               if (*ptr == '\0') return 1;
-                               if (*ptr == 'e' || *ptr == 'f') { 
-                                       ptr++; 
-                                       } else { return 1; }
-                       }
-                       else if (*ptr == 's' || *ptr == 'S' || *ptr == '%') { ++ptr; }
-                       else { return 1; }
-               } else {
-                       ++ptr;
-               }
-       }
-       return (n!=1);
+    char *ptr;
+    int n=0;
+    ptr = fmt;
+    while (*ptr != '\0')
+        if (*ptr++ == '%') {
+             /* line cannot end with percent char */
+             if (*ptr == '\0') return 1;
+             /* '%s', '%S' and '%%' are allowed */
+             if (*ptr == 's' || *ptr == 'S' || *ptr == '%') ptr++;
+
+             /* or else '% 6.2lf' and such are allowed */
+             else {
+   
+                 /* optional padding character */
+                 if (*ptr == ' ' || *ptr == '+' || *ptr == '-') ptr++;
+  
+                 /* This should take care of 'm.n' with all three optional */
+                 while (*ptr >= '0' && *ptr <= '9') ptr++;
+                 if (*ptr == '.') ptr++;
+                 while (*ptr >= '0' && *ptr <= '9') ptr++;
+  
+                 /* Either 'le' or 'lf' must follow here */
+                 if (*ptr++ != 'l') return 1;
+                 if (*ptr == 'e' || *ptr == 'f') ptr++;
+                 else return 1;
+                 n++;
+            }
+         }
+      
+      return (n!=1); 
 }
+
+
 int
 vdef_parse(gdes,str)
 struct graph_desc_t *gdes;
@@ -3336,6 +3364,8 @@ char *str;
     };
     return 0;
 }
+
+
 int
 vdef_calc(im,gdi)
 image_desc_t *im;