# -*- shell-script -*- # hist.sh - Bourne Again Shell Debugger history routines # # Copyright (C) 2002-2003, 2006-2008, 2011, 2015 Rocky Bernstein # # # 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 2, 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; see the file COPYING. If not, write to # the Free Software Foundation, 59 Temple Place, Suite 330, Boston, # MA 02111 USA. typeset -i _Dbg_hi_last_stop=0 typeset -i _Dbg_hi=0 # Current next history entry to store into. typeset -a _Dbg_history; setglobal _Dbg_history = ''() typeset -i _Dbg_set_history=1 typeset -i _Dbg_history_length=$(HISTSIZE:-256) # gdb's default value typeset _Dbg_histfile=$(HOME:-.)/.bashdb_hist # Set to rerun history item, or print history if command is of the form # !n:p. If command is "history" then $1 is number of history item. # the history command index to run is returned or $_Dbg_hi if # there's nothing to run. # Return value in $history_num proc _Dbg_history_parse { setglobal history_num = $1 sh-expr 'history_num < 0)'&& sh-expr 'history_num=${#_Dbg_history[@]}-1+$1' setglobal _Dbg_hi = $(#_Dbg_history[@]) [[ -z $history_num ]] && let history_num=$_Dbg_hi-1 if [[ $_Dbg_cmd == h* ]] { if [[ $history_num != $int_pat ]] { if [[ $history_num == -$int_pat ]] { setglobal history_num = "$_Dbg_hi+$history_num" } else { _Dbg_errmsg "Invalid history number skipped: $history_num" setglobal history_num = '-1' } } } else { # Handle ! form. May need to parse number out number and modifier # case $_Dbg_cmd in # \!\-${int_pat}:p ) # typeset -a word1 # word1=($(_Dbg_split '!' $_Dbg_cmd)) # local -a word2 # word2=($(_Dbg_split ':' ${word1[0]})) # typeset -i num=_Dbg_hi+${word2[0]} # _Dbg_do_history_list $num $num # history_num=-1 # ;; # [!]${int_pat}:p ) # local -a word1 # word1=($(_Dbg_split '!' $_Dbg_cmd)) # local -a word2 # word2=($(_Dbg_split ':' ${word1[0]})) # _Dbg_do_history_list ${word2[0]} ${word2[0]} # history_num=-1 # ;; # \!\-$int_pat ) # local -a word # word=($(_Dbg_split '!' $_Dbg_cmd)) # history_num=$_Dbg_hi+${word[0]} # ;; # \!$int_pat ) # local -a word # word=($(_Dbg_split '!' $_Dbg_cmd)) # history_num=${word[0]} # ;; # '!' ) # if [[ $history_num != $int_pat ]] ; then # if [[ $history_num == -$int_pat ]] ; then # history_num=$_Dbg_hi+$history_num # else # _Dbg_msg "Invalid history number skipped: $history_num" # history_num=-1 # fi # fi # ;; # * ) # _Dbg_errmsg "Invalid history number skipped: $_Dbg_cmd" # history_num=-1 # esac : } } proc _Dbg_history_read { if [[ -r $_Dbg_histfile ]] { history -r $_Dbg_histfile typeset -a last_history; setglobal last_history = ''($(history 1)) typeset -i max_history=$(last_history[0]) if sh-expr ' max_history > _Dbg_history_length )' { setglobal max_history = $_Dbg_history_length } local OLD_HISTTIMEFORMAT=$(HISTTIMEFORMAT) local hist setglobal HISTTIMEFORMAT = '''' local -i i for (( i=1; (( i <= max_history )) ; i++ )) ; do last_history=($(history $i)) hist=${last_history}[1] # _Dbg_history[$i]=$hist done setglobal HISTTIMEFORMAT = $(OLD_HISTTIMEFORMAT) } } # Save history file proc _Dbg_history_write { sh-expr ' _Dbg_history_length > 0 && _Dbg_set_history)) '&& history -w $_Dbg_histfile } # Remove the last command from the history list. proc _Dbg_history_remove_item { setglobal _Dbg_hi = "$(#_Dbg_history[@])-1" unset _Dbg_history[$_Dbg_hi] } # _Dbg_history_read