new = xmalloc (sizeof *new);
new->name = xstrdup (old->name);
- new->label = old->label != NULL ? xstrdup (old->label) : NULL;
+ new->label = xstrdup_if_nonnull (old->label);
new->type = old->type;
new->vars = xmemdup (old->vars, old->n_vars * sizeof *old->vars);
new->n_vars = old->n_vars;
}
}
-/* Returns true if the UTF-8 encoded NAME is a valid name for a multiple
- response set in a dictionary encoded in DICT_ENCODING, false otherwise. If
- ISSUE_ERROR is true, issues an explanatory error message on failure. */
-bool
-mrset_is_valid_name (const char *name, const char *dict_encoding,
- bool issue_error)
+/* Checks whether the UTF-8 encoded NAME is a valid name for a multiple
+ response set in a dictionary encoded in DICT_ENCODING. Return NULL if it
+ is, otherwise an error message that the caller must free(). */
+char * WARN_UNUSED_RESULT
+mrset_is_valid_name__ (const char *name, const char *dict_encoding)
{
- if (!id_is_valid (name, dict_encoding, issue_error))
- return false;
+ char *error = id_is_valid__ (name, dict_encoding);
+ if (error)
+ return error;
if (name[0] != '$')
+ return xasprintf (_("%s is not a valid name for a multiple response "
+ "set. Multiple response set names must begin with "
+ "`$'."), name);
+
+ return NULL;
+}
+
+static bool
+error_to_bool (char *error)
+{
+ if (error)
{
- if (issue_error)
- msg (SE, _("%s is not a valid name for a multiple response "
- "set. Multiple response set names must begin with "
- "`$'."), name);
+ free (error);
return false;
}
+ else
+ return true;
+}
- return true;
+/* Returns true if the UTF-8 encoded NAME is a valid name for a multiple
+ response set in a dictionary encoded in DICT_ENCODING, false otherwise. */
+bool
+mrset_is_valid_name (const char *name, const char *dict_encoding)
+{
+ return error_to_bool (mrset_is_valid_name__ (name, dict_encoding));
}
/* Checks various constraints on MRSET:
size_t i;
if (mrset->name == NULL
- || !mrset_is_valid_name (mrset->name, dict_get_encoding (dict), false)
+ || !mrset_is_valid_name (mrset->name, dict_get_encoding (dict))
|| (mrset->type != MRSET_MD && mrset->type != MRSET_MC)
|| mrset->vars == NULL
|| mrset->n_vars < 2)