#include "data/file-handle-def.h"
#include "data/settings.h"
#include "language/data-io/data-reader.h"
+#include "libpspp/intern.h"
#include "libpspp/message.h"
#include "libpspp/str.h"
#include "output/pivot-table.h"
/* Data parser for textual data like that read by DATA LIST. */
struct data_parser
{
- const struct dictionary *dict; /*Dictionary of destination */
+ struct dictionary *dict; /* Dictionary of destination */
enum data_parser_type type; /* Type of data to parse. */
int skip_records; /* Records to skip before first real data. */
/* Creates and returns a new data parser. */
struct data_parser *
-data_parser_create (const struct dictionary *dict)
+data_parser_create (struct dictionary *dict)
{
struct data_parser *parser = xmalloc (sizeof *parser);
parser->fields = NULL;
parser->field_cnt = 0;
parser->field_allocated = 0;
- parser->dict = dict;
+ parser->dict = dict_ref (dict);
parser->span = true;
parser->empty_line_has_field = false;
{
size_t i;
+ dict_unref (parser->dict);
for (i = 0; i < parser->field_cnt; i++)
free (parser->fields[i].name);
free (parser->fields);
parse_error (const struct dfm_reader *reader, const struct field *field,
int first_column, int last_column, char *error)
{
- struct msg m = {
+ int line_number = dfm_get_line_number (reader);
+ struct msg_location *location = xmalloc (sizeof *location);
+ *location = (struct msg_location) {
+ .file_name = intern_new (dfm_get_file_name (reader)),
+ .start = { .line = line_number, .column = first_column },
+ .end = { .line = line_number, .column = last_column - 1 },
+ };
+ struct msg *m = xmalloc (sizeof *m);
+ *m = (struct msg) {
.category = MSG_C_DATA,
.severity = MSG_S_WARNING,
- .file_name = CONST_CAST (char *, dfm_get_file_name (reader)),
- .first_line = dfm_get_line_number (reader),
- .last_line = m.first_line + 1,
- .first_column = first_column,
- .last_column = last_column,
+ .location = location,
.text = xasprintf (_("Data for variable %s is not valid as format %s: %s"),
field->name, fmt_name (field->format.type), error),
};
- msg_emit (&m);
+ msg_emit (m);
free (error);
}
f->format.w);
union value *value = case_data_rw_idx (c, f->case_idx);
char *error = data_in (s, input_encoding, f->format.type,
+ settings_get_fmt_settings (),
value, fmt_var_width (&f->format),
output_encoding);
if (error == NULL)
data_in_imply_decimals (s, input_encoding, f->format.type,
- f->format.d, value);
+ f->format.d, settings_get_fmt_settings (),
+ value);
else
parse_error (reader, f, f->first_column,
f->first_column + f->format.w, error);
const char *input_encoding = dfm_reader_get_encoding (reader);
error = data_in (s, input_encoding, f->format.type,
+ settings_get_fmt_settings (),
case_data_rw_idx (c, f->case_idx),
fmt_var_width (&f->format), output_encoding);
if (error != NULL)
const char *input_encoding = dfm_reader_get_encoding (reader);
error = data_in (s, input_encoding, f->format.type,
+ settings_get_fmt_settings (),
case_data_rw_idx (c, f->case_idx),
fmt_var_width (&f->format), output_encoding);
if (error != NULL)
parser->records_per_case),
parser->records_per_case, fh_get_name (fh));
struct pivot_table *table = pivot_table_create__ (
- pivot_value_new_user_text (title, -1));
+ pivot_value_new_user_text (title, -1), "Fixed Data Records");
free (title);
pivot_dimension_create (
int first_column = f->first_column;
int last_column = f->first_column + f->format.w - 1;
- char *columns = xasprintf ("%3d-%3d", first_column, last_column);
+ char *columns = xasprintf ("%d-%d", first_column, last_column);
pivot_table_put2 (table, 1, variable_idx,
pivot_value_new_user_text (columns, -1));
free (columns);
{
struct pivot_table *table = pivot_table_create__ (
pivot_value_new_text_format (N_("Reading free-form data from %s."),
- fh_get_name (fh)));
+ fh_get_name (fh)),
+ "Free-Form Data Records");
pivot_dimension_create (
table, PIVOT_AXIS_COLUMN, N_("Attributes"), N_("Format"));
}
static void
-data_parser_casereader_destroy (struct casereader *reader UNUSED, void *r_)
+data_parser_casereader_destroy (struct casereader *reader, void *r_)
{
struct data_parser_casereader *r = r_;
if (dfm_reader_error (r->reader))
casereader_force_error (reader);
- data_parser_destroy (r->parser);
dfm_close_reader (r->reader);
caseproto_unref (r->proto);
+ data_parser_destroy (r->parser);
free (r);
}