DEBUG EVALUATE: Eliminate VAR_NAME_LEN limit.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 1 Jan 2011 19:15:33 +0000 (11:15 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 5 Feb 2011 21:18:13 +0000 (13:18 -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/expressions/evaluate.c

index 79b52159528d020d065034f1ef5c0a3f6dc59ec6..6ac0572185619dc83977cb81655957cf437f6581 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 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
@@ -116,6 +116,8 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED)
 
   struct dataset *ds = NULL;
 
+  char *name = NULL;
+
   struct expression *expr;
 
   for (;;)
@@ -127,14 +129,13 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED)
         dump_postfix = 1;
       else if (lex_match (lexer, T_LPAREN))
         {
-          char name[VAR_NAME_LEN + 1];
           struct variable *v;
           size_t old_value_cnt;
           int width;
 
           if (!lex_force_id (lexer))
             goto done;
-          strcpy (name, lex_tokcstr (lexer));
+          name = xstrdup (lex_tokcstr (lexer));
 
           lex_get (lexer);
           if (!lex_force_match (lexer, T_EQUALS))
@@ -163,6 +164,8 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED)
               msg (SE, _("Duplicate variable name %s."), name);
               goto done;
             }
+          free (name);
+          name = NULL;
 
           if (c == NULL)
             c = case_create (dict_get_proto (d));
@@ -242,6 +245,8 @@ cmd_debug_evaluate (struct lexer *lexer, struct dataset *dsother UNUSED)
 
   case_unref (c);
 
+  free (name);
+
   return retval;
 }