projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
lex_get_text_buffer_read: Avoid potential buffer overflow.
[pspp]
/
src
/
output
/
csv.c
diff --git
a/src/output/csv.c
b/src/output/csv.c
index 3fbf53d963448b041d403c81f2e4cd13fe6ad227..c8619a9a7d403ebc84ebc55d9c307976a49b734b 100644
(file)
--- a/
src/output/csv.c
+++ b/
src/output/csv.c
@@
-44,7
+44,10
@@
struct csv_driver
struct output_driver driver;
char *separator; /* Field separator (usually comma or tab). */
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. */
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. */
@@
-73,13
+76,18
@@
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", ","));
- 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;
csv->file_name = xstrdup (file_name);
csv->file = fn_open (csv->file_name, "w");
csv->n_items = 0;
@@
-122,18
+130,18
@@
csv_output_field (struct csv_driver *csv, const char *field)
while (*field == ' ')
field++;
while (*field == ' ')
field++;
- if (field[strcspn (field, csv->quote_set)])
+ if (
csv->quote &&
field[strcspn (field, csv->quote_set)])
{
const char *p;
{
const char *p;
- putc (
'"'
, csv->file);
+ putc (
csv->quote
, csv->file);
for (p = field; *p != '\0'; p++)
{
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 (*p, csv->file);
}
- putc (
'"'
, csv->file);
+ putc (
csv->quote
, csv->file);
}
else
fputs (field, csv->file);
}
else
fputs (field, csv->file);
@@
-181,7
+189,7
@@
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, "Table: %s", caption);
putc ('\n', csv->file);
{
csv_output_field_format (csv, "Table: %s", caption);
putc ('\n', csv->file);