Most uses of VAR_NAME_LEN within PSPP are wrong due to encoding issues:
the limit applies to variable names in the encoding used by the data
set, but most uses of VAR_NAME_LEN actually limit the length of a name
in UTF-8. The UTF-8 representation of a name can be longer or shorter
than its representation in the data set encoding, so it seems best to
eliminate references to VAR_NAME_LEN entirely.
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 2008, 2010 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2010, 2011 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
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 bool
-parse_attribute_name (struct lexer *lexer, char name[VAR_NAME_LEN + 1],
- size_t *index)
+/* Parses an attribute name optionally followed by an index inside square
+ brackets. Returns the attribute name or NULL if there was a parse error.
+ Stores the index into *INDEX. */
+static char *
+parse_attribute_name (struct lexer *lexer, size_t *index)
if (!lex_force_id (lexer))
if (!lex_force_id (lexer))
- return false;
- strcpy (name, lex_tokcstr (lexer));
+ return NULL;
+ name = xstrdup (lex_tokcstr (lexer));
lex_get (lexer);
if (lex_match (lexer, T_LBRACK))
{
if (!lex_force_int (lexer))
lex_get (lexer);
if (lex_match (lexer, T_LBRACK))
{
if (!lex_force_int (lexer))
if (lex_integer (lexer) < 1 || lex_integer (lexer) > 65535)
{
msg (SE, _("Attribute array index must be between 1 and 65535."));
if (lex_integer (lexer) < 1 || lex_integer (lexer) > 65535)
{
msg (SE, _("Attribute array index must be between 1 and 65535."));
}
*index = lex_integer (lexer);
lex_get (lexer);
if (!lex_force_match (lexer, T_RBRACK))
}
*index = lex_integer (lexer);
lex_get (lexer);
if (!lex_force_match (lexer, T_RBRACK))
+ return name;
+
+error:
+ free (name);
+ return NULL;
}
static bool
add_attribute (struct lexer *lexer, struct attrset **sets, size_t n)
{
}
static bool
add_attribute (struct lexer *lexer, struct attrset **sets, size_t n)
{
- char name[VAR_NAME_LEN + 1];
const char *value;
size_t index, i;
const char *value;
size_t index, i;
- if (!parse_attribute_name (lexer, name, &index)
- || !lex_force_match (lexer, T_LPAREN)
- || !lex_force_string (lexer))
+ name = parse_attribute_name (lexer, &index);
+ if (name == NULL)
+ if (!lex_force_match (lexer, T_LPAREN) || !lex_force_string (lexer))
+ {
+ free (name);
+ return false;
+ }
value = lex_tokcstr (lexer);
for (i = 0; i < n; i++)
value = lex_tokcstr (lexer);
for (i = 0; i < n; i++)
return lex_force_match (lexer, T_RPAREN);
}
static bool
delete_attribute (struct lexer *lexer, struct attrset **sets, size_t n)
{
return lex_force_match (lexer, T_RPAREN);
}
static bool
delete_attribute (struct lexer *lexer, struct attrset **sets, size_t n)
{
- char name[VAR_NAME_LEN + 1];
- if (!parse_attribute_name (lexer, name, &index))
+ name = parse_attribute_name (lexer, &index);
+ if (name == NULL)
return false;
for (i = 0; i < n; i++)
return false;
for (i = 0; i < n; i++)