#include <stdlib.h>
#include "data/file-name.h"
+#include "data/file-handle-def.h"
#include "libpspp/assertion.h"
#include "libpspp/compiler.h"
#include "libpspp/message.h"
int quote; /* Quote character (usually ' or ") or 0. */
char *quote_set; /* Characters that force quoting. */
bool titles; /* Print table titles? */
+ bool captions; /* Print table captions? */
- char *file_name; /* Output file name. */
+ struct file_handle *handle;
char *command_name; /* Current command. */
FILE *file; /* Output file. */
int n_items; /* Number of items output so far. */
}
static struct output_driver *
-csv_create (const char *file_name, enum settings_output_devices device_type,
+csv_create (struct file_handle *fh, enum settings_output_devices device_type,
struct string_map *o)
{
struct output_driver *d;
csv = xzalloc (sizeof *csv);
d = &csv->driver;
- output_driver_init (&csv->driver, &csv_driver_class, file_name, device_type);
+ output_driver_init (&csv->driver, &csv_driver_class, fh_get_file_name (fh), device_type);
csv->separator = parse_string (opt (d, o, "separator", ","));
quote = parse_string (opt (d, o, "quote", "\""));
free (quote);
csv->quote_set = xasprintf ("\n\r\t%s%c", csv->separator, csv->quote);
csv->titles = parse_boolean (opt (d, o, "titles", "true"));
- csv->file_name = xstrdup (file_name);
- csv->file = fn_open (csv->file_name, "w");
+ csv->captions = parse_boolean (opt (d, o, "captions", "true"));
+ csv->handle = fh;
+ csv->file = fn_open (fh, "w");
csv->n_items = 0;
if (csv->file == NULL)
{
- msg_error (errno, _("error opening output file `%s'"), csv->file_name);
+ msg_error (errno, _("error opening output file `%s'"), fh_get_file_name (fh));
output_driver_destroy (d);
return NULL;
}
struct csv_driver *csv = csv_driver_cast (driver);
if (csv->file != NULL)
- fn_close (csv->file_name, csv->file);
+ fn_close (csv->handle, csv->file);
free (csv->separator);
free (csv->quote_set);
- free (csv->file_name);
+ fh_unref (csv->handle);
free (csv);
}
{
const struct table *t = table_item_get_table (item);
const char *title = table_item_get_title (item);
+ const char *caption = table_item_get_caption (item);
int y, x;
if (csv->titles && title != NULL)
table_cell_free (&cell);
}
}
+
+ if (csv->captions && caption != NULL)
+ {
+ csv_output_field_format (csv, "Caption: %s", caption);
+ putc ('\n', csv->file);
+ }
}
static void
{
struct table_item *table_item = to_table_item (output_item);
const char *title = table_item_get_title (table_item);
+ const char *caption = table_item_get_caption (table_item);
const struct table *t = table_item_get_table (table_item);
int footnote_idx;
int x, y;
putc ('\n', csv->file);
}
+ if (csv->captions && caption != NULL)
+ {
+ csv_output_field_format (csv, "Caption: %s", caption);
+ putc ('\n', csv->file);
+ }
+
if (footnote_idx)
{
size_t i;