From 665bff371384dafbbc328fabee9b564260561e44 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 20 May 2010 21:56:48 -0700 Subject: [PATCH] sys-file-reader: Variable attributes record uses long variable names. Michel Boaventura provided a system file for which PSPP complained about bad variable attributes records. I found out that this was because the variables were specified using long names, not short names. This commit allows PSPP to read these variable attributes properly. --- doc/dev/system-file-format.texi | 3 ++- src/data/sys-file-reader.c | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/doc/dev/system-file-format.texi b/doc/dev/system-file-format.texi index 757867ca..972b1331 100644 --- a/doc/dev/system-file-format.texi +++ b/doc/dev/system-file-format.texi @@ -1087,7 +1087,8 @@ element. In record type 18, this field contains a sequence of one or more variable attribute sets. If more than one variable attribute set is present, each one after the first is delimited from the previous by -@code{/}. Each variable attribute set consists of a variable name, +@code{/}. Each variable attribute set consists of a (potentially +long) variable name, followed by @code{:}, followed by an attribute set with the same syntax as on record type 17. diff --git a/src/data/sys-file-reader.c b/src/data/sys-file-reader.c index 48a5188f..03234c2d 100644 --- a/src/data/sys-file-reader.c +++ b/src/data/sys-file-reader.c @@ -133,6 +133,10 @@ static void text_warn (struct sfm_reader *r, struct text_record *text, static char *text_get_token (struct text_record *, struct substring delimiters, char *delimiter); static bool text_match (struct text_record *, char c); +static bool text_read_variable_name (struct sfm_reader *, struct dictionary *, + struct text_record *, + struct substring delimiters, + struct variable **); static bool text_read_short_name (struct sfm_reader *, struct dictionary *, struct text_record *, struct substring delimiters, @@ -1697,7 +1701,7 @@ read_variable_attributes (struct sfm_reader *r, for (;;) { struct variable *var; - if (!text_read_short_name (r, dict, text, ss_cstr (":"), &var)) + if (!text_read_variable_name (r, dict, text, ss_cstr (":"), &var)) break; read_attributes (r, text, var != NULL ? var_get_attributes (var) : NULL); } @@ -2131,6 +2135,27 @@ read_variable_to_value_pair (struct sfm_reader *r, struct dictionary *dict, } } +static bool +text_read_variable_name (struct sfm_reader *r, struct dictionary *dict, + struct text_record *text, struct substring delimiters, + struct variable **var) +{ + char *name; + + name = text_get_token (text, delimiters, NULL); + if (name == NULL) + return false; + + *var = dict_lookup_var (dict, name); + if (*var != NULL) + return true; + + text_warn (r, text, _("Dictionary record refers to unknown variable %s."), + name); + return false; +} + + static bool text_read_short_name (struct sfm_reader *r, struct dictionary *dict, struct text_record *text, struct substring delimiters, -- 2.30.2