Use the msg function to report errors wherever possible.
[pspp] / src / output / csv.c
index 3fbf53d963448b041d403c81f2e4cd13fe6ad227..9b51ed79d34de5e959876367bb0ca5bae59d3217 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2012 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -31,7 +31,6 @@
 #include "output/table-item.h"
 #include "output/table-provider.h"
 
-#include "gl/error.h"
 #include "gl/xalloc.h"
 #include "gl/xvasprintf.h"
 
@@ -44,7 +43,10 @@ struct csv_driver
     struct output_driver driver;
 
     char *separator;            /* Field separator (usually comma or tab). */
+    int quote;                  /* Quote character (usually ' or ") or 0. */
     char *quote_set;            /* Characters that force quoting. */
+    bool captions;              /* Print table captions? */
+
     char *file_name;            /* Output file name. */
     char *command_name;         /* Current command. */
     FILE *file;                 /* Output file. */
@@ -73,20 +75,25 @@ csv_create (const char *file_name, enum settings_output_devices device_type,
 {
   struct output_driver *d;
   struct csv_driver *csv;
+  char *quote;
 
   csv = xzalloc (sizeof *csv);
   d = &csv->driver;
   output_driver_init (&csv->driver, &csv_driver_class, file_name, device_type);
 
   csv->separator = parse_string (opt (d, o, "separator", ","));
-  csv->quote_set = xasprintf ("\"\n\r\t%s", csv->separator);
+  quote = parse_string (opt (d, o, "quote", "\""));
+  csv->quote = quote[0];
+  free (quote);
+  csv->quote_set = xasprintf ("\n\r\t%s%c", csv->separator, csv->quote);
+  csv->captions = parse_boolean (opt (d, o, "captions", "true"));
   csv->file_name = xstrdup (file_name);
   csv->file = fn_open (csv->file_name, "w");
   csv->n_items = 0;
 
   if (csv->file == NULL)
     {
-      error (0, errno, _("error opening output file `%s'"), csv->file_name);
+      msg_error (errno, _("error opening output file `%s'"), csv->file_name);
       output_driver_destroy (d);
       return NULL;
     }
@@ -122,18 +129,18 @@ csv_output_field (struct csv_driver *csv, const char *field)
   while (*field == ' ')
     field++;
 
-  if (field[strcspn (field, csv->quote_set)])
+  if (csv->quote && field[strcspn (field, csv->quote_set)])
     {
       const char *p;
 
-      putc ('"', csv->file);
+      putc (csv->quote, csv->file);
       for (p = field; *p != '\0'; p++)
         {
-          if (*p == '"')
-            putc ('"', csv->file);
+          if (*p == csv->quote)
+            putc (csv->quote, csv->file);
           putc (*p, csv->file);
         }
-      putc ('"', csv->file);
+      putc (csv->quote, csv->file);
     }
   else
     fputs (field, csv->file);
@@ -181,7 +188,7 @@ csv_submit (struct output_driver *driver,
 
       csv_put_separator (csv);
 
-      if (caption != NULL)
+      if (csv->captions && caption != NULL)
         {
           csv_output_field_format (csv, "Table: %s", caption);
           putc ('\n', csv->file);
@@ -247,7 +254,7 @@ csv_submit (struct output_driver *driver,
     }
 }
 
-struct output_driver_factory csv_driver_factory = { "csv", csv_create };
+struct output_driver_factory csv_driver_factory = { "csv", "-", csv_create };
 
 static const struct output_driver_class csv_driver_class =
   {