From Dirk via bug #5771: Add heuristic dissector for images and HTTP
[obnox/wireshark/wip.git] / print.c
diff --git a/print.c b/print.c
index c734c979412fefbf666174a403b40a97fa37c8c1..aedcb2f88e1d1ed4d44b6f7f4abc46a9c43894cc 100644 (file)
--- a/print.c
+++ b/print.c
@@ -83,6 +83,8 @@ struct _output_fields {
     gchar quote;
 };
 
+static gboolean write_headers = FALSE;
+
 static const gchar* get_field_hex_value(GSList* src_list, field_info *fi);
 static void proto_tree_print_node(proto_node *node, gpointer data);
 static void proto_tree_write_node_pdml(proto_node *node, gpointer data);
@@ -243,10 +245,6 @@ proto_tree_write_pdml(epan_dissect_t *edt, FILE *fh)
        data.src_list = edt->pi.data_src;
        data.edt = edt;
 
-       /* We shouldn't be called with a NULL pointer here because we've
-        * created a visible protocol tree */
-       g_assert(data.src_list);
-
        fprintf(fh, "<packet>\n");
 
        /* Print a "geninfo" protocol as required by PDML */
@@ -571,16 +569,16 @@ write_psml_preamble(FILE *fh)
        fputs("<?xml version=\"1.0\"?>\n", fh);
        fputs("<psml version=\"" PSML_VERSION "\" ", fh);
        fprintf(fh, "creator=\"%s/%s\">\n", PACKAGE, VERSION);
+       write_headers = TRUE;
 }
 
 void
 proto_tree_write_psml(epan_dissect_t *edt, FILE *fh)
 {
        gint    i;
-       static gboolean structure_written = FALSE;
 
        /* if this is the first packet, we have to create the PSML structure output */
-       if(!structure_written) {
+       if(write_headers) {
            fprintf(fh, "<structure>\n");
 
            for(i=0; i < edt->pi.cinfo->num_cols; i++) {
@@ -591,7 +589,7 @@ proto_tree_write_psml(epan_dissect_t *edt, FILE *fh)
 
            fprintf(fh, "</structure>\n\n");
 
-           structure_written = TRUE;
+           write_headers = FALSE;
        }
 
        fprintf(fh, "<packet>\n");
@@ -614,26 +612,46 @@ write_psml_finale(FILE *fh)
 void
 write_csv_preamble(FILE *fh _U_)
 {
+       write_headers = TRUE;
+}
 
+static gchar *csv_massage_str(const gchar *source, const gchar *exceptions)
+{
+    gchar *csv_str;
+    gchar *tmp_str;
+
+    csv_str = g_strescape(source, exceptions);
+    tmp_str = csv_str;
+    while ( (tmp_str = strstr(tmp_str, "\\\"")) != NULL )
+        *tmp_str = '\"';
+    return csv_str;
 }
 
-void
-proto_tree_write_csv(epan_dissect_t *edt, FILE *fh)
+static void csv_write_str(const char *str, char sep, FILE *fh)
 {
-        gint    i;
+    gchar *csv_str;
 
-        /* if this is the first packet, we have to write the CSV header */
-        if(edt->pi.fd->num == 1) {
-            for(i=0; i < edt->pi.cinfo->num_cols - 1; i++)
-               fprintf(fh, "\"%s\",", edt->pi.cinfo->col_title[i]);
+    csv_str = csv_massage_str(str, NULL);
+    fprintf(fh, "\"%s\"%c", csv_str, sep);
+    g_free(csv_str);
+}    
 
-            fprintf(fh, "\"%s\"\n", edt->pi.cinfo->col_title[i]);
-        }
+void
+proto_tree_write_csv(epan_dissect_t *edt, FILE *fh)
+{
+    gint i;
 
+    /* if this is the first packet, we have to write the CSV header */
+    if(write_headers) {
         for(i=0; i < edt->pi.cinfo->num_cols - 1; i++)
-            fprintf(fh, "\"%s\",", edt->pi.cinfo->col_data[i]);
+            csv_write_str(edt->pi.cinfo->col_title[i], ',', fh);
+        csv_write_str(edt->pi.cinfo->col_title[i], '\n', fh);
+        write_headers = FALSE;
+    }
 
-        fprintf(fh, "\"%s\"\n", edt->pi.cinfo->col_data[i]);
+    for(i=0; i < edt->pi.cinfo->num_cols - 1; i++)
+        csv_write_str(edt->pi.cinfo->col_data[i], ',', fh);
+    csv_write_str(edt->pi.cinfo->col_data[i], '\n', fh);
 }
 
 void
@@ -795,10 +813,6 @@ print_hex_data(print_stream_t *stream, epan_dissect_t *edt)
        const guchar *cp;
        guint length;
 
-       /* We shouldn't be called with a NULL pointer here because we've
-        * created a visible protocol tree */
-       g_assert(edt->pi.data_src);
-
        /*
         * Set "multiple_sources" iff this frame has more than one
         * data source; if it does, we need to print the name of
@@ -939,6 +953,11 @@ void ps_clean_string(unsigned char *out, const unsigned char *in,
        int rd, wr;
        char c;
 
+       if (in == NULL) {
+               out[0] = '\0';
+               return;
+       }
+
        for (rd = 0, wr = 0 ; wr < outbuf_size; rd++, wr++ ) {
                c = in[rd];
                switch (c) {
@@ -1128,9 +1147,6 @@ print_preamble_ps(print_stream_t *self, gchar *filename)
 
        print_ps_preamble(output->fh);
 
-       fputs("%% Set the font to 8 point\n", output->fh);
-       fputs("/Courier findfont 8 scalefont setfont\n", output->fh);
-       fputs("\n", output->fh);
        fputs("%% the page title\n", output->fh);
        ps_clean_string(psbuffer, filename, MAX_PS_LINE_LENGTH);
        fprintf(output->fh, "/ws_pagetitle (%s - Wireshark " VERSION "%s) def\n", psbuffer, wireshark_svnversion);