Reported by Andre Müller.
Bug #41863.
- SYSFILE INFO now accepts an ENCODING subcommand to specify the
character encoding of string data in the system file.
+ - Variable labels over 255 bytes long are now accepted without
+ truncation (bug #41863).
+
- System files that contain duplicate variable names may now be
read successfully (bug #41475).
set to the length, in characters, of the variable label. The
documented maximum length varies from 120 to 255 based on SPSS
version, but some files have been seen with longer labels. PSPP
-accepts longer labels and truncates them to 255 bytes on input.
+accepts labels of any length.
@item char label[];
This field is present only if @code{has_var_label} is set to 1. It has
struct variable *var;
char *label
CODE:
- var_set_label (var, label, false);
+ var_set_label (var, label);
void
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
{
char label[256];
read_string (r, label);
- var_set_label (v, label, false); /* XXX */
+ var_set_label (v, label); /* XXX */
}
}
utf8_label = recode_string_pool ("UTF-8", dict_encoding,
rec->label, -1, r->pool);
- var_set_label (var, utf8_label, false);
+ var_set_label (var, utf8_label);
}
/* Set missing values. */
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
static void var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print);
static void var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write);
-static bool var_set_label_quiet (struct variable *v, const char *label, bool issue_warning);
+static void var_set_label_quiet (struct variable *v, const char *label);
static void var_set_name_quiet (struct variable *v, const char *name);
/* Creates and returns a new variable with the given NAME and
mv_destroy (&v->miss);
var_clear_short_names (v);
val_labs_destroy (v->val_labs);
- var_set_label_quiet (v, NULL, false);
+ var_set_label_quiet (v, NULL);
attrset_destroy (var_get_attributes (v));
free (v->name);
ds_destroy (&v->name_and_label);
/* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading
and trailing white space. If LABEL is a null pointer or if LABEL is an
empty string (after stripping white space), then V's variable label (if any)
- is removed.
-
- Variable labels are limited to 255 bytes in V's encoding (as returned by
- var_get_encoding()). If LABEL fits within this limit, this function returns
- true. Otherwise, the variable label is set to a truncated value, this
- function returns false and, if ISSUE_WARNING is true, issues a warning. */
-static bool
-var_set_label_quiet (struct variable *v, const char *label, bool issue_warning)
+ is removed. */
+static void
+var_set_label_quiet (struct variable *v, const char *label)
{
- bool truncated = false;
-
free (v->label);
v->label = NULL;
if (label != NULL && label[strspn (label, CC_SPACES)])
- {
- const char *dict_encoding = var_get_encoding (v);
- struct substring s = ss_cstr (label);
- size_t trunc_len;
-
- if (dict_encoding != NULL)
- {
- enum { MAX_LABEL_LEN = 255 };
-
- trunc_len = utf8_encoding_trunc_len (label, dict_encoding,
- MAX_LABEL_LEN);
- if (ss_length (s) > trunc_len)
- {
- if (issue_warning)
- msg (SW, _("Truncating variable label for variable `%s' to %d "
- "bytes."), var_get_name (v), MAX_LABEL_LEN);
- ss_truncate (&s, trunc_len);
- truncated = true;
- }
- }
-
- v->label = ss_xstrdup (s);
- }
+ v->label = xstrdup (label);
ds_destroy (&v->name_and_label);
ds_init_empty (&v->name_and_label);
-
- return truncated;
}
/* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading
and trailing white space. If LABEL is a null pointer or if LABEL is an
empty string (after stripping white space), then V's variable label (if any)
- is removed.
-
- Variable labels are limited to 255 bytes in V's encoding (as returned by
- var_get_encoding()). If LABEL fits within this limit, this function returns
- true. Otherwise, the variable label is set to a truncated value, this
- function returns false and, if ISSUE_WARNING is true, issues a warning. */
-bool
-var_set_label (struct variable *v, const char *label, bool issue_warning)
+ is removed. */
+void
+var_set_label (struct variable *v, const char *label)
{
struct variable *ov = var_clone (v);
- bool truncated = var_set_label_quiet (v, label, issue_warning);
-
+ var_set_label_quiet (v, label);
dict_var_changed (v, VAR_TRAIT_LABEL, ov);
-
- return truncated;
}
void
var_clear_label (struct variable *v)
{
- var_set_label (v, NULL, false);
+ var_set_label (v, NULL);
}
/* Returns true if V has a variable V,
var_set_print_format_quiet (new_var, var_get_print_format (old_var));
var_set_write_format_quiet (new_var, var_get_write_format (old_var));
var_set_value_labels_quiet (new_var, var_get_value_labels (old_var));
- var_set_label_quiet (new_var, var_get_label (old_var), false);
+ var_set_label_quiet (new_var, var_get_label (old_var));
var_set_measure_quiet (new_var, var_get_measure (old_var));
var_set_role_quiet (new_var, var_get_role (old_var));
var_set_display_width_quiet (new_var, var_get_display_width (old_var));
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Variable labels. */
const char *var_to_string (const struct variable *);
const char *var_get_label (const struct variable *);
-bool var_set_label (struct variable *, const char *label, bool issue_warning);
+void var_set_label (struct variable *, const char *label);
void var_clear_label (struct variable *);
bool var_has_label (const struct variable *);
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
if (var_has_missing_values (dv) && !var_has_missing_values (mv))
var_set_missing_values (mv, var_get_missing_values (dv));
if (var_get_label (dv) && !var_get_label (mv))
- var_set_label (mv, var_get_label (dv), false);
+ var_set_label (mv, var_get_label (dv));
}
else
mv = dict_clone_var_assert (m, dv);
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
if (var_has_label (s))
- var_set_label (t, var_get_label (s), false);
+ var_set_label (t, var_get_label (s));
if (var_has_value_labels (s))
{
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2010, 2011, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
for (i = 0; i < nv; i++)
- var_set_label (v[i], lex_tokcstr (lexer), i == 0);
+ var_set_label (v[i], lex_tokcstr (lexer));
lex_get (lexer);
while (lex_token (lexer) == T_SLASH)
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2008, 2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
free (dest[i]);
if (dest_label[i])
- var_set_label (destvar, dest_label[i], true);
+ var_set_label (destvar, dest_label[i]);
v->dest = destvar;
}
dst_var = dict_create_var_assert (dataset_dict (ds), dv->z_name, 0);
label = xasprintf (_("Z-score of %s"),var_to_string (dv->v));
- var_set_label (dst_var, label, false);
+ var_set_label (dst_var, label);
free (label);
z = &t->z_scores[cnt++];
/* PSPP - a program for statistical analysis.
- Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc
+ Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
var = dict_create_var_assert (d, rs->dest_names[i], 0);
var_set_both_formats (var, &dest_format[rs->rfunc]);
- var_set_label (var, rs->dest_labels[i], false);
+ var_set_label (var, rs->dest_labels[i]);
iv->output_vars[j] = var;
}
break;
case VS_LABEL:
- var_set_label (var, new_text, false);
+ var_set_label (var, new_text);
break;
case VS_VALUES: