An upcoming commit will make the GUI's text import use this code too, in
a context where a dictionary isn't yet available. The data parser only
uses the dictionary for one specific purpose that isn't relevant for the
GUI, so remove the need for it.
struct data_list_trns
{
struct data_parser *parser; /* Parser. */
struct data_list_trns
{
struct data_parser *parser; /* Parser. */
+ struct dictionary *dict; /* Dictionary. */
struct dfm_reader *reader; /* Data file reader. */
struct variable *end; /* Variable specified on END subcommand. */
};
struct dfm_reader *reader; /* Data file reader. */
struct variable *end; /* Variable specified on END subcommand. */
};
dict = (in_input_program ()
? dataset_dict (ds)
: dict_create (get_default_encoding ()));
dict = (in_input_program ()
? dataset_dict (ds)
: dict_create (get_default_encoding ()));
- parser = data_parser_create (dict);
+ parser = data_parser_create ();
reader = NULL;
table = -1; /* Print table if nonzero, -1=undecided. */
reader = NULL;
table = -1; /* Print table if nonzero, -1=undecided. */
{
struct data_list_trns *trns = xmalloc (sizeof *trns);
trns->parser = parser;
{
struct data_list_trns *trns = xmalloc (sizeof *trns);
trns->parser = parser;
+ trns->dict = dict_ref (dict);
trns->reader = reader;
trns->end = end;
add_transformation (ds, &data_list_trns_class, trns);
trns->reader = reader;
trns->end = end;
add_transformation (ds, &data_list_trns_class, trns);
struct data_list_trns *trns = trns_;
data_parser_destroy (trns->parser);
dfm_close_reader (trns->reader);
struct data_list_trns *trns = trns_;
data_parser_destroy (trns->parser);
dfm_close_reader (trns->reader);
+ dict_unref (trns->dict);
free (trns);
return true;
}
free (trns);
return true;
}
enum trns_result retval;
*c = case_unshare (*c);
enum trns_result retval;
*c = case_unshare (*c);
- if (data_parser_parse (trns->parser, trns->reader, *c))
+ if (data_parser_parse (trns->parser, trns->reader, trns->dict, *c))
retval = TRNS_CONTINUE;
else if (dfm_reader_error (trns->reader) || dfm_eof (trns->reader) > 1)
{
retval = TRNS_CONTINUE;
else if (dfm_reader_error (trns->reader) || dfm_eof (trns->reader) > 1)
{
/* Data parser for textual data like that read by DATA LIST. */
struct data_parser
{
/* Data parser for textual data like that read by DATA LIST. */
struct data_parser
{
- 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. */
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 *
/* Creates and returns a new data parser. */
struct data_parser *
-data_parser_create (struct dictionary *dict)
+data_parser_create (void)
{
struct data_parser *parser = xmalloc (sizeof *parser);
{
struct data_parser *parser = xmalloc (sizeof *parser);
parser->fields = NULL;
parser->n_fields = 0;
parser->field_allocated = 0;
parser->fields = NULL;
parser->n_fields = 0;
parser->field_allocated = 0;
- parser->dict = dict_ref (dict);
parser->span = true;
parser->empty_line_has_field = false;
parser->span = true;
parser->empty_line_has_field = false;
- dict_unref (parser->dict);
for (i = 0; i < parser->n_fields; i++)
free (parser->fields[i].name);
free (parser->fields);
for (i = 0; i < parser->n_fields; i++)
free (parser->fields[i].name);
free (parser->fields);
}
\f
static bool parse_delimited_span (const struct data_parser *,
}
\f
static bool parse_delimited_span (const struct data_parser *,
- struct dfm_reader *, struct ccase *);
+ struct dfm_reader *,
+ struct dictionary *, struct ccase *);
static bool parse_delimited_no_span (const struct data_parser *,
static bool parse_delimited_no_span (const struct data_parser *,
- struct dfm_reader *, struct ccase *);
-static bool parse_fixed (const struct data_parser *,
- struct dfm_reader *, struct ccase *);
+ struct dfm_reader *,
+ struct dictionary *, struct ccase *);
+static bool parse_fixed (const struct data_parser *, struct dfm_reader *,
+ struct dictionary *, struct ccase *);
-/* Reads a case from DFM into C, parsing it with PARSER. Returns
- true if successful, false at end of file or on I/O error.
+/* Reads a case from DFM into C, which matches dictionary DICT, parsing it with
+ PARSER. Returns true if successful, false at end of file or on I/O error.
Case C must not be shared. */
bool
data_parser_parse (struct data_parser *parser, struct dfm_reader *reader,
Case C must not be shared. */
bool
data_parser_parse (struct data_parser *parser, struct dfm_reader *reader,
+ struct dictionary *dict, struct ccase *c)
if (parser->type == DP_DELIMITED)
{
if (parser->span)
if (parser->type == DP_DELIMITED)
{
if (parser->span)
- retval = parse_delimited_span (parser, reader, c);
+ retval = parse_delimited_span (parser, reader, dict, c);
- retval = parse_delimited_no_span (parser, reader, c);
+ retval = parse_delimited_no_span (parser, reader, dict, c);
- retval = parse_fixed (parser, reader, c);
+ retval = parse_fixed (parser, reader, dict, c);
-/* Reads a case from READER into C, parsing it according to
- fixed-format syntax rules in PARSER.
- Returns true if successful, false at end of file or on I/O error. */
+/* Reads a case from READER into C, which matches DICT, parsing it according to
+ fixed-format syntax rules in PARSER. Returns true if successful, false at
+ end of file or on I/O error. */
static bool
parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
static bool
parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
+ struct dictionary *dict, struct ccase *c)
{
const char *input_encoding = dfm_reader_get_encoding (reader);
{
const char *input_encoding = dfm_reader_get_encoding (reader);
- const char *output_encoding = dict_get_encoding (parser->dict);
+ const char *output_encoding = dict_get_encoding (dict);
struct field *f;
int row;
struct field *f;
int row;
-/* Reads a case from READER into C, parsing it according to
- free-format syntax rules in PARSER.
- Returns true if successful, false at end of file or on I/O error. */
+/* Reads a case from READER into C, which matches dictionary DICT, parsing it
+ according to free-format syntax rules in PARSER. Returns true if
+ successful, false at end of file or on I/O error. */
static bool
parse_delimited_span (const struct data_parser *parser,
static bool
parse_delimited_span (const struct data_parser *parser,
- struct dfm_reader *reader, struct ccase *c)
+ struct dfm_reader *reader,
+ struct dictionary *dict, struct ccase *c)
- const char *output_encoding = dict_get_encoding (parser->dict);
+ const char *output_encoding = dict_get_encoding (dict);
struct string tmp = DS_EMPTY_INITIALIZER;
struct field *f;
struct string tmp = DS_EMPTY_INITIALIZER;
struct field *f;
-/* Reads a case from READER into C, parsing it according to
- delimited syntax rules with one case per record in PARSER.
+/* Reads a case from READER into C, which matches dictionary DICT, parsing it
+ according to delimited syntax rules with one case per record in PARSER.
Returns true if successful, false at end of file or on I/O error. */
static bool
parse_delimited_no_span (const struct data_parser *parser,
Returns true if successful, false at end of file or on I/O error. */
static bool
parse_delimited_no_span (const struct data_parser *parser,
- struct dfm_reader *reader, struct ccase *c)
+ struct dfm_reader *reader,
+ struct dictionary *dict, struct ccase *c)
- const char *output_encoding = dict_get_encoding (parser->dict);
+ const char *output_encoding = dict_get_encoding (dict);
struct string tmp = DS_EMPTY_INITIALIZER;
struct substring s;
struct field *f, *end;
struct string tmp = DS_EMPTY_INITIALIZER;
struct substring s;
struct field *f, *end;
struct data_parser_casereader
{
struct data_parser *parser; /* Parser. */
struct data_parser_casereader
{
struct data_parser *parser; /* Parser. */
+ struct dictionary *dict; /* Dictionary. */
struct dfm_reader *reader; /* Data file reader. */
struct caseproto *proto; /* Format of cases. */
};
struct dfm_reader *reader; /* Data file reader. */
struct caseproto *proto; /* Format of cases. */
};
void
data_parser_make_active_file (struct data_parser *parser, struct dataset *ds,
struct dfm_reader *reader,
void
data_parser_make_active_file (struct data_parser *parser, struct dataset *ds,
struct dfm_reader *reader,
- struct dictionary *dict,
+ struct dictionary *dict,
struct casereader* (*func)(struct casereader *,
const struct dictionary *,
void *),
struct casereader* (*func)(struct casereader *,
const struct dictionary *,
void *),
r = xmalloc (sizeof *r);
r->parser = parser;
r = xmalloc (sizeof *r);
r->parser = parser;
+ r->dict = dict_ref (dict);
r->reader = reader;
r->proto = caseproto_ref (dict_get_proto (dict));
casereader0 = casereader_create_sequential (NULL, r->proto,
r->reader = reader;
r->proto = caseproto_ref (dict_get_proto (dict));
casereader0 = casereader_create_sequential (NULL, r->proto,
{
struct data_parser_casereader *r = r_;
struct ccase *c = case_create (r->proto);
{
struct data_parser_casereader *r = r_;
struct ccase *c = case_create (r->proto);
- if (data_parser_parse (r->parser, r->reader, c))
+ if (data_parser_parse (r->parser, r->reader, r->dict, c))
casereader_force_error (reader);
dfm_close_reader (r->reader);
caseproto_unref (r->proto);
casereader_force_error (reader);
dfm_close_reader (r->reader);
caseproto_unref (r->proto);
data_parser_destroy (r->parser);
free (r);
}
data_parser_destroy (r->parser);
free (r);
}
};
/* Creating and configuring any parser. */
};
/* Creating and configuring any parser. */
-struct data_parser *data_parser_create (struct dictionary *dict);
+struct data_parser *data_parser_create (void);
void data_parser_destroy (struct data_parser *);
enum data_parser_type data_parser_get_type (const struct data_parser *);
void data_parser_destroy (struct data_parser *);
enum data_parser_type data_parser_get_type (const struct data_parser *);
const char *name,
int record, int first_column);
bool data_parser_any_fields (const struct data_parser *);
const char *name,
int record, int first_column);
bool data_parser_any_fields (const struct data_parser *);
-bool data_parser_parse (struct data_parser *,
- struct dfm_reader *, struct ccase *);
+bool data_parser_parse (struct data_parser *, struct dfm_reader *,
+ struct dictionary *, struct ccase *);
+
/* Uses for a configured parser. */
void data_parser_output_description (struct data_parser *,
/* Uses for a configured parser. */
void data_parser_output_description (struct data_parser *,
if (fh == NULL)
goto error;
if (fh == NULL)
goto error;
- parser = data_parser_create (dict);
+ parser = data_parser_create ();
has_type = false;
data_parser_set_type (parser, DP_DELIMITED);
data_parser_set_span (parser, false);
has_type = false;
data_parser_set_type (parser, DP_DELIMITED);
data_parser_set_span (parser, false);