#include <stdlib.h>
#include "data/attributes.h"
+#include "data/dataset.h"
#include "data/dictionary.h"
-#include "data/procedure.h"
#include "data/variable.h"
#include "language/command.h"
#include "language/lexer/lexer.h"
struct dictionary *dict = dataset_dict (ds);
const char *dict_encoding = dict_get_encoding (dict);
- do
+ do
{
struct variable **vars;
struct attrset **sets;
parse_attribute_name (struct lexer *lexer, const char *dict_encoding,
size_t *index)
{
- char *name;
-
- if (!lex_force_id (lexer)
- || !id_is_valid (lex_tokcstr (lexer), dict_encoding, true))
+ if (!lex_force_id (lexer))
return NULL;
- name = xstrdup (lex_tokcstr (lexer));
+ char *error = id_is_valid__ (lex_tokcstr (lexer), dict_encoding);
+ if (error)
+ {
+ lex_error (lexer, "%s", error);
+ free (error);
+ return NULL;
+ }
+ char *name = xstrdup (lex_tokcstr (lexer));
lex_get (lexer);
if (lex_match (lexer, T_LBRACK))
{
- if (!lex_force_int (lexer))
+ if (!lex_force_int_range (lexer, NULL, 1, 65535))
goto error;
- if (lex_integer (lexer) < 1 || lex_integer (lexer) > 65535)
- {
- msg (SE, _("Attribute array index must be between 1 and 65535."));
- goto error;
- }
*index = lex_integer (lexer);
lex_get (lexer);
if (!lex_force_match (lexer, T_RBRACK))
static bool
add_attribute (struct lexer *lexer, const char *dict_encoding,
- struct attrset **sets, size_t n)
+ struct attrset **sets, size_t n)
{
const char *value;
size_t index, i;
for (i = 0; i < n; i++)
{
struct attribute *attr = attrset_lookup (sets[i], name);
- if (attr == NULL)
+ if (attr == NULL)
{
attr = attribute_create (name);
- attrset_add (sets[i], attr);
+ attrset_add (sets[i], attr);
}
attribute_set_value (attr, index ? index - 1 : 0, value);
}
static bool
delete_attribute (struct lexer *lexer, const char *dict_encoding,
- struct attrset **sets, size_t n)
+ struct attrset **sets, size_t n)
{
size_t index, i;
char *name;
if (name == NULL)
return false;
- for (i = 0; i < n; i++)
+ for (i = 0; i < n; i++)
{
struct attrset *set = sets[i];
if (index == 0)
else
{
struct attribute *attr = attrset_lookup (set, name);
- if (attr != NULL)
+ if (attr != NULL)
{
attribute_del_value (attr, index - 1);
if (attribute_get_n_values (attr) == 0)
- attrset_delete (set, name);
+ attrset_delete (set, name);
}
}
}
static enum cmd_result
parse_attributes (struct lexer *lexer, const char *dict_encoding,
- struct attrset **sets, size_t n)
+ struct attrset **sets, size_t n)
{
enum { UNKNOWN, ADD, DELETE } command = UNKNOWN;
- do
+ do
{
if (lex_match_phrase (lexer, "ATTRIBUTE="))
command = ADD;
command = DELETE;
else if (command == UNKNOWN)
{
- lex_error (lexer, _("expecting %s or %s"), "ATTRIBUTE=", "DELETE=");
+ lex_error_expecting (lexer, "ATTRIBUTE=", "DELETE=");
return CMD_FAILURE;
}