pspp-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[VAR_NAME_LEN 10/17] DEBUG EVALUATE: Eliminate VAR_NAME_LEN limit.


From: Ben Pfaff
Subject: [VAR_NAME_LEN 10/17] DEBUG EVALUATE: Eliminate VAR_NAME_LEN limit.
Date: Sat, 5 Feb 2011 13:25:52 -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 |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/language/expressions/evaluate.c 
b/src/language/expressions/evaluate.c
index 79b5215..6ac0572 100644
--- a/src/language/expressions/evaluate.c
+++ b/src/language/expressions/evaluate.c
@@ -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;
 }
 
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]