projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
psppire-var-sheet: Hard-code size of pixbuf cells.
[pspp]
/
src
/
output
/
csv.c
diff --git
a/src/output/csv.c
b/src/output/csv.c
index 626dc2fa5ad2c7a7b9a15898908338bed37ba378..b57eb7c2d04eb7cdfb0e478a771d0495288de362 100644
(file)
--- a/
src/output/csv.c
+++ b/
src/output/csv.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* 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
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
@@
-43,7
+43,11
@@
struct csv_driver
{
struct output_driver driver;
{
struct output_driver driver;
- char *separator; /* Comma or tab. */
+ 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. */
char *file_name; /* Output file name. */
char *command_name; /* Current command. */
FILE *file; /* Output file. */
@@
-72,19
+76,25
@@
csv_create (const char *file_name, enum settings_output_devices device_type,
{
struct output_driver *d;
struct csv_driver *csv;
{
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 = 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", ","));
+ 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)
{
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);
+ error (0, errno, _("error opening output file
`%s'
"), csv->file_name);
output_driver_destroy (d);
return NULL;
}
output_driver_destroy (d);
return NULL;
}
@@
-101,6
+111,7
@@
csv_destroy (struct output_driver *driver)
fn_close (csv->file_name, csv->file);
free (csv->separator);
fn_close (csv->file_name, csv->file);
free (csv->separator);
+ free (csv->quote_set);
free (csv->file_name);
free (csv);
}
free (csv->file_name);
free (csv);
}
@@
-114,34
+125,34
@@
csv_flush (struct output_driver *driver)
}
static void
}
static void
-csv_output_field (
FILE *file
, const char *field)
+csv_output_field (
struct csv_driver *csv
, const char *field)
{
while (*field == ' ')
field++;
{
while (*field == ' ')
field++;
- if (
field[strcspn (field, "\"\n\r,\t"
)])
+ if (
csv->quote && field[strcspn (field, csv->quote_set
)])
{
const char *p;
{
const char *p;
- putc (
'"',
file);
+ putc (
csv->quote, csv->
file);
for (p = field; *p != '\0'; p++)
{
for (p = field; *p != '\0'; p++)
{
- if (*p ==
'"'
)
- putc (
'"',
file);
- putc (*p, file);
+ if (*p ==
csv->quote
)
+ putc (
csv->quote, csv->
file);
+ putc (*p,
csv->
file);
}
}
- putc (
'"',
file);
+ putc (
csv->quote, csv->
file);
}
else
}
else
- fputs (field, file);
+ fputs (field,
csv->
file);
}
static void
}
static void
-csv_output_field_format (
FILE *file
, const char *format, ...)
+csv_output_field_format (
struct csv_driver *csv
, const char *format, ...)
PRINTF_FORMAT (2, 3);
static void
PRINTF_FORMAT (2, 3);
static void
-csv_output_field_format (
FILE *file
, const char *format, ...)
+csv_output_field_format (
struct csv_driver *csv
, const char *format, ...)
{
va_list args;
char *s;
{
va_list args;
char *s;
@@
-150,7
+161,7
@@
csv_output_field_format (FILE *file, const char *format, ...)
s = xvasprintf (format, args);
va_end (args);
s = xvasprintf (format, args);
va_end (args);
- csv_output_field (
file
, s);
+ csv_output_field (
csv
, s);
free (s);
}
free (s);
}
@@
-178,9
+189,9
@@
csv_submit (struct output_driver *driver,
csv_put_separator (csv);
csv_put_separator (csv);
- if (caption != NULL)
+ if (c
sv->captions && c
aption != NULL)
{
{
- csv_output_field_format (csv
->file
, "Table: %s", caption);
+ csv_output_field_format (csv, "Table: %s", caption);
putc ('\n', csv->file);
}
putc ('\n', csv->file);
}
@@
-196,9
+207,9
@@
csv_submit (struct output_driver *driver,
fputs (csv->separator, csv->file);
if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0])
fputs (csv->separator, csv->file);
if (x != cell.d[TABLE_HORZ][0] || y != cell.d[TABLE_VERT][0])
- csv_output_field (csv
->file
, "");
+ csv_output_field (csv, "");
else
else
- csv_output_field (csv
->file
, cell.contents);
+ csv_output_field (csv, cell.contents);
table_cell_free (&cell);
}
table_cell_free (&cell);
}
@@
-219,15
+230,15
@@
csv_submit (struct output_driver *driver,
switch (type)
{
case TEXT_ITEM_TITLE:
switch (type)
{
case TEXT_ITEM_TITLE:
- csv_output_field_format (csv
->file
, "Title: %s", text);
+ csv_output_field_format (csv, "Title: %s", text);
break;
case TEXT_ITEM_SUBTITLE:
break;
case TEXT_ITEM_SUBTITLE:
- csv_output_field_format (csv
->file
, "Subtitle: %s", text);
+ csv_output_field_format (csv, "Subtitle: %s", text);
break;
default:
break;
default:
- csv_output_field (csv
->file
, text);
+ csv_output_field (csv, text);
break;
}
putc ('\n', csv->file);
break;
}
putc ('\n', csv->file);
@@
-238,13
+249,13
@@
csv_submit (struct output_driver *driver,
const struct msg *msg = message_item_get_msg (message_item);
char *s = msg_to_string (msg, csv->command_name);
csv_put_separator (csv);
const struct msg *msg = message_item_get_msg (message_item);
char *s = msg_to_string (msg, csv->command_name);
csv_put_separator (csv);
- csv_output_field (csv
->file
, s);
+ csv_output_field (csv, s);
free (s);
putc ('\n', csv->file);
}
}
free (s);
putc ('\n', csv->file);
}
}
-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 =
{
static const struct output_driver_class csv_driver_class =
{