projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added the MATRIX DATA procedure.
[pspp]
/
src
/
output
/
csv.c
diff --git
a/src/output/csv.c
b/src/output/csv.c
index 2784b24998757649e96c7f863f709753873abd6c..455584914e7c4a470e8c506640880d6b94bad1f7 100644
(file)
--- a/
src/output/csv.c
+++ b/
src/output/csv.c
@@
-20,6
+20,7
@@
#include <stdlib.h>
#include "data/file-name.h"
#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"
#include "libpspp/assertion.h"
#include "libpspp/compiler.h"
#include "libpspp/message.h"
@@
-47,8
+48,9
@@
struct csv_driver
int quote; /* Quote character (usually ' or ") or 0. */
char *quote_set; /* Characters that force quoting. */
bool titles; /* Print table titles? */
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. */
char *command_name; /* Current command. */
FILE *file; /* Output file. */
int n_items; /* Number of items output so far. */
@@
-71,7
+73,7
@@
opt (struct output_driver *d, struct string_map *options, const char *key,
}
static struct output_driver *
}
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;
struct string_map *o)
{
struct output_driver *d;
@@
-80,7
+82,7
@@
csv_create (const char *file_name, enum settings_output_devices device_type,
csv = xzalloc (sizeof *csv);
d = &csv->driver;
csv = xzalloc (sizeof *csv);
d = &csv->driver;
- output_driver_init (&csv->driver, &csv_driver_class, f
ile_name
, device_type);
+ output_driver_init (&csv->driver, &csv_driver_class, f
h_get_file_name (fh)
, device_type);
csv->separator = parse_string (opt (d, o, "separator", ","));
quote = parse_string (opt (d, o, "quote", "\""));
csv->separator = parse_string (opt (d, o, "separator", ","));
quote = parse_string (opt (d, o, "quote", "\""));
@@
-88,13
+90,14
@@
csv_create (const char *file_name, enum settings_output_devices device_type,
free (quote);
csv->quote_set = xasprintf ("\n\r\t%s%c", csv->separator, csv->quote);
csv->titles = parse_boolean (opt (d, o, "titles", "true"));
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)
{
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;
}
output_driver_destroy (d);
return NULL;
}
@@
-108,11
+111,11
@@
csv_destroy (struct output_driver *driver)
struct csv_driver *csv = csv_driver_cast (driver);
if (csv->file != NULL)
struct csv_driver *csv = csv_driver_cast (driver);
if (csv->file != NULL)
- fn_close (csv->
file_nam
e, csv->file);
+ fn_close (csv->
handl
e, csv->file);
free (csv->separator);
free (csv->quote_set);
free (csv->separator);
free (csv->quote_set);
- f
ree (csv->file_nam
e);
+ f
h_unref (csv->handl
e);
free (csv);
}
free (csv);
}
@@
-190,6
+193,7
@@
csv_output_subtable (struct csv_driver *csv, struct string *s,
{
const struct table *t = table_item_get_table (item);
const char *title = table_item_get_title (item);
{
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)
int y, x;
if (csv->titles && title != NULL)
@@
-239,6
+243,12
@@
csv_output_subtable (struct csv_driver *csv, struct string *s,
table_cell_free (&cell);
}
}
table_cell_free (&cell);
}
}
+
+ if (csv->captions && caption != NULL)
+ {
+ csv_output_field_format (csv, "Caption: %s", caption);
+ putc ('\n', csv->file);
+ }
}
static void
}
static void
@@
-260,6
+270,7
@@
csv_submit (struct output_driver *driver,
{
struct table_item *table_item = to_table_item (output_item);
const char *title = table_item_get_title (table_item);
{
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;
const struct table *t = table_item_get_table (table_item);
int footnote_idx;
int x, y;
@@
-327,6
+338,12
@@
csv_submit (struct output_driver *driver,
putc ('\n', csv->file);
}
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;
if (footnote_idx)
{
size_t i;