[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[VAR_NAME_LEN 07/17] DATAFILE ATTRIBUTE, VARIABLE ATTRIBUTE: Eliminate V
From: |
Ben Pfaff |
Subject: |
[VAR_NAME_LEN 07/17] DATAFILE ATTRIBUTE, VARIABLE ATTRIBUTE: Eliminate VAR_NAME_LEN limit. |
Date: |
Sat, 5 Feb 2011 13:25:49 -0800 |
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.
---
src/language/dictionary/attributes.c | 48 ++++++++++++++++++++++-----------
1 files changed, 32 insertions(+), 16 deletions(-)
diff --git a/src/language/dictionary/attributes.c
b/src/language/dictionary/attributes.c
index c992ff8..1f9e984 100644
--- a/src/language/dictionary/attributes.c
+++ b/src/language/dictionary/attributes.c
@@ -1,5 +1,5 @@
/* 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
@@ -90,45 +90,57 @@ match_subcommand (struct lexer *lexer, const char *keyword)
return false;
}
-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)
{
+ char *name;
+
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))
- return false;
+ goto error;
if (lex_integer (lexer) < 1 || lex_integer (lexer) > 65535)
{
msg (SE, _("Attribute array index must be between 1 and 65535."));
- return false;
+ goto error;
}
*index = lex_integer (lexer);
lex_get (lexer);
if (!lex_force_match (lexer, T_RBRACK))
- return false;
+ goto error;
}
else
*index = 0;
- return true;
+ return name;
+
+error:
+ free (name);
+ return NULL;
}
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;
+ char *name;
- 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)
return false;
+ 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++)
@@ -143,16 +155,18 @@ add_attribute (struct lexer *lexer, struct attrset
**sets, size_t n)
}
lex_get (lexer);
+ free (name);
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];
size_t index, i;
+ char *name;
- if (!parse_attribute_name (lexer, name, &index))
+ name = parse_attribute_name (lexer, &index);
+ if (name == NULL)
return false;
for (i = 0; i < n; i++)
@@ -171,6 +185,8 @@ delete_attribute (struct lexer *lexer, struct attrset
**sets, size_t n)
}
}
}
+
+ free (name);
return true;
}
--
1.7.1
- [VAR_NAME_LEN 00/17] Eliminate uses of VAR_NAME_LEN, Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 08/17] MODIFY VARIABLES: Eliminate VAR_NAME_LEN limit on variable names., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 05/17] FILE HANDLE: Get rid of VAR_NAME_LEN limit on handle name., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 14/17] FLIP: Eliminate false dependency on VAR_NAME_LEN., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 03/17] vector: Remove VAR_NAME_LEN limit for internal representation of name., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 01/17] dict: Make dict_make_unique_var_name() return an allocated string., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 07/17] DATAFILE ATTRIBUTE, VARIABLE ATTRIBUTE: Eliminate VAR_NAME_LEN limit.,
Ben Pfaff <=
- [VAR_NAME_LEN 06/17] GET DATA /TYPE=TXT: Get rid of VAR_NAME_LEN limit on variable names., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 09/17] VECTOR: Eliminate VAR_NAME_LEN limit for variable names., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 17/17] por-file-reader: Remove dependency on VAR_NAME_LEN., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 02/17] variable: Remove VAR_NAME_LEN limit for internal representation of name., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 10/17] DEBUG EVALUATE: Eliminate VAR_NAME_LEN limit., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 04/17] combine-files: Eliminate VAR_NAME_LEN restriction from combine_files()., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 15/17] REGRESSION: Eliminate restriction to VAR_NAME_LEN in reg_get_name()., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 13/17] DESCRIPTIVES: Eliminate main restriction on Z-score variable name length., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 16/17] text-data-import-dialog: Eliminate VAR_NAME_LEN restriction., Ben Pfaff, 2011/02/05
- [VAR_NAME_LEN 11/17] variable-parser: Rewrite parse_DATA_LIST_vars()., Ben Pfaff, 2011/02/05