summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
4d2a668)
Before this commit, although any separator could be specified for cvs
output, the set of characters that triggered quoting was fixed, and only
really suitable for comma and tab separators. This commit fixes the
problem, making sure that whenever the specified separator appears in a
field, that field will be quoted.
Problem noticed during a discussion with Björn Manke <bjoernmanke@gmx.net>
on pspp-users.
{
struct output_driver driver;
{
struct output_driver driver;
- char *separator; /* Comma or tab. */
+ char *separator; /* Field separator (usually comma or tab). */
+ char *quote_set; /* Characters that force quoting. */
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. */
output_driver_init (&csv->driver, &csv_driver_class, file_name, device_type);
csv->separator = parse_string (opt (d, o, "separator", ","));
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);
csv->file_name = xstrdup (file_name);
csv->file = fn_open (csv->file_name, "w");
csv->n_items = 0;
csv->file_name = xstrdup (file_name);
csv->file = fn_open (csv->file_name, "w");
csv->n_items = 0;
fn_close (csv->file_name, csv->file);
free (csv->separator);
fn_close (csv->file_name, csv->file);
free (csv->separator);
free (csv->file_name);
free (csv);
}
free (csv->file_name);
free (csv);
}
-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 (field[strcspn (field, csv->quote_set)])
for (p = field; *p != '\0'; p++)
{
if (*p == '"')
for (p = field; *p != '\0'; p++)
{
if (*p == '"')
- putc ('"', file);
- putc (*p, file);
+ putc ('"', csv->file);
+ putc (*p, csv->file);
+ fputs (field, csv->file);
-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, ...)
s = xvasprintf (format, args);
va_end (args);
s = xvasprintf (format, args);
va_end (args);
- csv_output_field (file, s);
+ csv_output_field (csv, s);
- 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);
}
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, "");
- csv_output_field (csv->file, cell.contents);
+ csv_output_field (csv, cell.contents);
table_cell_free (&cell);
}
table_cell_free (&cell);
}
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);
- csv_output_field (csv->file, text);
+ csv_output_field (csv, text);
break;
}
putc ('\n', csv->file);
break;
}
putc ('\n', csv->file);
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);
}