X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcsv.c;h=9b51ed79d34de5e959876367bb0ca5bae59d3217;hb=85686ff9b5292a10af71b72c57a87df199e1a4ad;hp=d168fd9534140230f2e4fb9c15646aa779c0a7e2;hpb=5deb8ead72bb5b6058594894bec297768692d780;p=pspp diff --git a/src/output/csv.c b/src/output/csv.c index d168fd9534..9b51ed79d3 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -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,6 +43,7 @@ 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? */ @@ -75,13 +75,17 @@ 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"); @@ -89,7 +93,7 @@ csv_create (const char *file_name, enum settings_output_devices device_type, 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; } @@ -125,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); @@ -250,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 = {