pspp-dev
[Top][All Lists]
Advanced

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

[VAR_NAME_LEN 17/17] por-file-reader: Remove dependency on VAR_NAME_LEN.


From: Ben Pfaff
Subject: [VAR_NAME_LEN 17/17] por-file-reader: Remove dependency on VAR_NAME_LEN.
Date: Sat, 5 Feb 2011 13:25:59 -0800

VAR_NAME_LEN wasn't really needed here because we knew that the name we
started from was no more than 8 bytes long.  Also, we know that we can
come up with a unique name within ULONG_MAX tries since we'd run out of
memory before running out of values to try.

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/data/por-file-reader.c |   17 ++++++++---------
 1 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c
index adf177b..bee1008 100644
--- a/src/data/por-file-reader.c
+++ b/src/data/por-file-reader.c
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 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
@@ -42,8 +42,9 @@
 #include <libpspp/pool.h>
 #include <libpspp/str.h>
 
-#include "minmax.h"
-#include "xalloc.h"
+#include "gl/intprops.h"
+#include "gl/minmax.h"
+#include "gl/xalloc.h"
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -690,17 +691,15 @@ read_variables (struct pfm_reader *r, struct dictionary 
*dict)
       v = dict_create_var (dict, name, width);
       if (v == NULL)
         {
-          int i;
-          for (i = 1; i < 100000; i++)
+          unsigned long int i;
+          for (i = 1; ; i++)
             {
-              char try_name[VAR_NAME_LEN + 1];
-              sprintf (try_name, "%.*s_%d", VAR_NAME_LEN - 6, name, i);
+              char try_name[8 + 1 + INT_STRLEN_BOUND (i) + 1];
+              sprintf (try_name, "%s_%lu", name, i);
               v = dict_create_var (dict, try_name, width);
               if (v != NULL)
                 break;
             }
-          if (v == NULL)
-            error (r, _("Duplicate variable name %s in position %d."), name, 
i);
           warning (r, _("Duplicate variable name %s in position %d renamed "
                         "to %s."), name, i, var_get_name (v));
         }
-- 
1.7.1




reply via email to

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