+2015-06-17 Patrick Palka <patrick@parcs.ath.cx>
+
+ PR gdb/16999
+ * NEWS: Mention new GDBHISTSIZE behavior.
+ * top.c (init_history): For null or out-of-range GDBHISTSIZE,
+ set history size to unlimited. Ignore non-numeric GDBHISTSIZE.
+
2015-06-17 Patrick Palka <patrick@parcs.ath.cx>
* NEWS: Mention that GDBHISTSIZE is read instead of HISTSIZE.
* The HISTSIZE environment variable is no longer read when determining
the size of GDB's command history. GDB now instead reads the dedicated
- GDBHISTSIZE environment variable.
+ GDBHISTSIZE environment variable. Setting GDBHISTSIZE to "-1" or to "" now
+ disables truncation of command history. Non-numeric values of GDBHISTSIZE
+ are ignored.
* Guile Scripting
+2015-06-17 Patrick Palka <patrick@parcs.ath.cx>
+
+ PR gdb/16999
+ * gdb.texinfo (Command History): Mention new GDBHISTSIZE
+ behavior.
+
2015-06-17 Patrick Palka <patrick@parcs.ath.cx>
* gdb.texinfo (Command History): Replace occurrences of HISTSIZE
@item set history size @var{size}
@itemx set history size unlimited
Set the number of commands which @value{GDBN} keeps in its history list.
-This defaults to the value of the environment variable
-@code{GDBHISTSIZE}, or to 256 if this variable is not set. If @var{size}
-is @code{unlimited}, the number of commands @value{GDBN} keeps in the
-history list is unlimited.
+This defaults to the value of the environment variable @env{GDBHISTSIZE}, or
+to 256 if this variable is not set. Non-numeric values of @env{GDBHISTSIZE}
+are ignored. If @var{size} is @code{unlimited} or if @env{GDBHISTSIZE} is a
+negative number, the number of commands @value{GDBN} keeps in the history list
+is unlimited.
@end table
History expansion assigns special meaning to the character @kbd{!}.
+2015-06-17 Patrick Palka <patrick@parcs.ath.cx>
+
+ PR gdb/16999
+ * gdb.base/gdbhistsize-history.exp: New test.
+
2015-06-17 Patrick Palka <patrick@parcs.ath.cx>
* gdb.base/gdbinit-history.exp: Replace occurrences of HISTSIZE
--- /dev/null
+# Copyright 2015 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
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the gdb testsuite.
+
+# Test the setting of "history size" via the GDBHISTSIZE environment variable
+
+
+# Check that the history size is properly set to SIZE when the environment
+# variable ENV_VAR is set to GDBHISTSIZE.
+
+proc test_histsize_history_setting { histsize size { env_var "GDBHISTSIZE" } } {
+ global env
+
+ set have_old_gdbhistsize 0
+ if [info exists env($env_var)] {
+ set have_old_gdbhistsize 1
+ set old_gdbhistsize $env($env_var)
+ }
+ set env($env_var) $histsize
+
+ with_test_prefix "histsize=$histsize" {
+ gdb_exit
+ gdb_start
+
+ gdb_test "show history size" "The size of the command history is $size."
+
+ if { $size == "0" } {
+ gdb_test_no_output "show commands"
+ } elseif { $size != "1" } {
+ gdb_test "show commands" \
+ " . show history size\r\n . show commands"
+ }
+
+ if { $have_old_gdbhistsize } {
+ set env($env_var) $old_gdbhistsize
+ } else {
+ unset env($env_var)
+ }
+ }
+}
+
+test_histsize_history_setting "" "unlimited"
+test_histsize_history_setting "0" "0"
+test_histsize_history_setting "20" "20"
+test_histsize_history_setting " 20 " "20"
+test_histsize_history_setting "-5" "unlimited"
+
+# Test defaulting to 256 upon encountering a non-numeric GDBHISTSIZE.
+test_histsize_history_setting "not_an_integer" "256"
+test_histsize_history_setting "10zab" "256"
+test_histsize_history_setting "-5ab" "256"
+
+# A huge number (hopefully larger than INT_MAX)
+test_histsize_history_setting "99999999999999999999999999999999999" "unlimited"
+
+# We no longer read HISTSIZE
+test_histsize_history_setting "50" "256" "HISTSIZE"
tmpenv = getenv ("GDBHISTSIZE");
if (tmpenv)
{
- int var;
-
- var = atoi (tmpenv);
- if (var < 0)
- {
- /* Prefer ending up with no history rather than overflowing
- readline's history interface, which uses signed 'int'
- everywhere. */
- var = 0;
- }
-
- history_size_setshow_var = var;
+ long var;
+ char *endptr;
+
+ tmpenv = skip_spaces (tmpenv);
+ var = strtol (tmpenv, &endptr, 10);
+ endptr = skip_spaces (endptr);
+
+ /* If GDBHISTSIZE is non-numeric then ignore it. If GDBHISTSIZE is the
+ empty string, a negative number or a huge positive number (larger than
+ INT_MAX) then set the history size to unlimited. Otherwise set our
+ history size to the number we have read. This behavior is consistent
+ with how bash handles HISTSIZE. */
+ if (*endptr != '\0')
+ ;
+ else if (*tmpenv == '\0'
+ || var < 0
+ || var > INT_MAX)
+ history_size_setshow_var = -1;
+ else
+ history_size_setshow_var = var;
}
- /* If the init file hasn't set a size yet, pick the default. */
- else if (history_size_setshow_var == -2)
+
+ /* If neither the init file nor GDBHISTSIZE has set a size yet, pick the
+ default. */
+ if (history_size_setshow_var == -2)
history_size_setshow_var = 256;
set_readline_history_size (history_size_setshow_var);