From: Ben Pfaff Date: Sun, 2 Jan 2011 00:42:06 +0000 (-0800) Subject: por-file-reader: Remove dependency on VAR_NAME_LEN. X-Git-Tag: v0.7.7~60 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp-builds.git;a=commitdiff_plain;h=42004e91dc5a76f746b9bf902130182318806291 por-file-reader: Remove dependency on VAR_NAME_LEN. 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. --- diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c index adf177be..bee1008e 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 #include -#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)); }