struct _output_fields {
gboolean print_header;
gchar separator;
+ gchar occurrence;
gchar aggregator;
GPtrArray* fields;
GHashTable* field_indicies;
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);
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++) {
fprintf(fh, "</structure>\n\n");
- structure_written = TRUE;
+ write_headers = FALSE;
}
fprintf(fh, "<packet>\n");
void
write_csv_preamble(FILE *fh _U_)
{
-
+ write_headers = TRUE;
}
void
gint i;
/* if this is the first packet, we have to write the CSV header */
- if(edt->pi.fd->num == 1) {
+ if(write_headers) {
for(i=0; i < edt->pi.cinfo->num_cols - 1; i++)
fprintf(fh, "\"%s\",", edt->pi.cinfo->col_title[i]);
fprintf(fh, "\"%s\"\n", edt->pi.cinfo->col_title[i]);
+
+ write_headers = FALSE;
}
for(i=0; i < edt->pi.cinfo->num_cols - 1; i++)
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) {
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);
output_fields_t* fields = g_new(output_fields_t, 1);
fields->print_header = FALSE;
fields->separator = '\t';
+ fields->occurrence = 'a';
fields->aggregator = ',';
fields->fields = NULL; /*Do lazy initialisation */
fields->field_indicies = NULL;
return TRUE;
}
+ if(0 == strcmp(option_name, "occurrence")) {
+ switch(NULL == option_value ? '\0' : *option_value) {
+ case 'f':
+ case 'l':
+ case 'a':
+ info->occurrence = *option_value;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
+
if(0 == strcmp(option_name,"aggregator")) {
switch(NULL == option_value ? '\0' : *option_value) {
case '\0':
void output_fields_list_options(FILE *fh)
{
fprintf(fh, "TShark: The available options for field output \"E\" are:\n");
- fputs("header=y|n Print field abbreviations as first line of output (def: N: no)\n", fh);
- fputs("separator=/t|/s|<character> Set the separator to use; \"/t\" = tab,\n \"/s\" = space (def: /t: tab)\n", fh);
- fputs("quote=d|s|n Print either d: double-quotes, s: single quotes or n: no quotes around field values (def: n: none)\n", fh);
+ fputs("header=y|n Print field abbreviations as first line of output (def: N: no)\n", fh);
+ fputs("separator=/t|/s|<character> Set the separator to use;\n \"/t\" = tab, \"/s\" = space (def: /t: tab)\n", fh);
+ fputs("occurrence=f|l|a Select the occurrence of a field to use;\n \"f\" = first, \"l\" = last, \"a\" = all (def: a: all)\n", fh);
+ fputs("aggregator=,|/s|<character> Set the aggregator to use;\n \",\" = comma, \"/s\" = space (def: ,: comma)\n", fh);
+ fputs("quote=d|s|n Print either d: double-quotes, s: single quotes or \n n: no quotes around field values (def: n: none)\n", fh);
}
guint actual_index;
actual_index = GPOINTER_TO_UINT(field_index);
/* Unwrap change made to disambiguiate zero / null */
- if (call_data->fields->field_values[actual_index - 1] == NULL ) {
+ if ( call_data->fields->field_values[actual_index - 1] == NULL ) {
call_data->fields->field_values[actual_index - 1] = ep_strbuf_new(value);
- } else {
+ } else if ( call_data->fields->occurrence == 'l' ) {
+ /* print only the value of the last occurrence of the field */
+ ep_strbuf_printf(call_data->fields->field_values[actual_index - 1],"%s",value);
+ } else if ( call_data->fields->occurrence == 'a' ) {
+ /* print the value of all accurrences of the field */
ep_strbuf_append_printf(call_data->fields->field_values[actual_index - 1],
"%c%s",call_data->fields->aggregator,value);
}