# -*- shell-script -*- # gdb-like "watch" debugger command # # Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008 Rocky Bernstein # rocky@gnu.org # # 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. _Dbg_help_add watch \ 'watch [ARITH?] EXP Set or clear a watch expression.' _Dbg_alias_add W watch proc _Dbg_do_watch { typeset -a a global a := '('$_Dbg_args) typeset first=$(a[0]) if [[ $first == '' ]] { _Dbg_do_watch_internal 0 } elif ! _Dbg_defined $first { _Dbg_errmsg "Can't set watch: no such variable $first." } else { unset a first _Dbg_do_watch_internal 0 "\$$_Dbg_args" } return $? } _Dbg_help_add watche \ 'watche [EXP] -- Set or clear a watch expression.' _Dbg_alias_add We proc _Dbg_do_watche { _Dbg_do_watch_internal 1 $_Dbg_args return $? } # Set or list watch command proc _Dbg_do_watch_internal { if test -z $2 { _Dbg_clear_watch } else { typeset -i n=_Dbg_watch_max++ _Dbg_watch_arith[$n]="$1" shift _Dbg_watch_exp[$n]="$1" _Dbg_watch_val[$n]=$[_Dbg_get_watch_exp_eval $n] _Dbg_watch_enable[$n]=1 _Dbg_watch_count[$n]=0 _Dbg_printf '%2d: %s==%s arith: %d' $n \ "($(_Dbg_watch_exp[$n]))" $(_Dbg_watch_val[$n]) \ $(_Dbg_watch_arith[$n]) } return 0 } (CommandList children: [ (C {(_Dbg_help_add)} {(watch)} {(SQ <"watch [ARITH?] EXP\n"> <"\n"> <"Set or clear a watch expression.">)} ) (C {(_Dbg_alias_add)} {(W)} {(watch)}) (FuncDef name: _Dbg_do_watch body: (BraceGroup children: [ (C {(typeset)} {(-a)} {(a)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:a) op: Equal rhs: {(ArrayLiteralPart words:[{($ VSub_Name "$_Dbg_args")}])} spids: [94] ) ] spids: [94] ) (C {(typeset)} {(Lit_VarLike "first=") (BracedVarSub token: bracket_op: (ArrayIndex expr:(ArithWord w:{(Lit_Digits 0)})) spids: [103 108] ) } ) (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id:BoolBinary_GlobDEqual left:{($ VSub_Name "$first")} right:{(SQ )}) ) terminator: ) ] action: [(C {(_Dbg_do_watch_internal)} {(0)})] spids: [-1 126] ) (if_arm cond: [ (Sentence child: (Pipeline children: [(C {(_Dbg_defined)} {(DQ ($ VSub_Name "$first"))})] negated: True ) terminator: ) ] action: [ (C {(_Dbg_errmsg)} {(DQ ("Can't set watch: no such variable ") ($ VSub_Name "$first") (.))} ) ] spids: [134 146] ) ] else_action: [ (C {(unset)} {(a)} {(first)}) (C {(_Dbg_do_watch_internal)} {(0)} { (DQ (EscapedLiteralPart token:) ($ VSub_Name "$_Dbg_args")) } ) ] spids: [158 178] ) (ControlFlow token: arg_word:{($ VSub_QMark "$?")}) ] spids: [84] ) spids: [80 83] ) (C {(_Dbg_help_add)} {(watche)} {(SQ <"watche [EXP] -- Set or clear a watch expression.">)}) (C {(_Dbg_alias_add)} {(We)}) (FuncDef name: _Dbg_do_watche body: (BraceGroup children: [ (C {(_Dbg_do_watch_internal)} {(1)} {(DQ ($ VSub_Name "$_Dbg_args"))}) (ControlFlow token: arg_word:{($ VSub_QMark "$?")}) ] spids: [208] ) spids: [204 207] ) (FuncDef name: _Dbg_do_watch_internal body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {(-z)} {(DQ ($ VSub_Number "$2"))} {(Lit_Other "]")}) terminator: ) ] action: [(C {(_Dbg_clear_watch)})] spids: [-1 250] ) ] else_action: [ (C {(typeset)} {(-i)} {(Lit_VarLike "n=") (_Dbg_watch_max) (Lit_Other "+") (Lit_Other "+")} ) (C {(_Dbg_watch_arith) (Lit_Other "[") ($ VSub_Name "$n") (Lit_Other "]") (Lit_Other "=") (DQ ($ VSub_Number "$1")) } ) (C {(shift)}) (C {(_Dbg_watch_exp) (Lit_Other "[") ($ VSub_Name "$n") (Lit_Other "]") (Lit_Other "=") (DQ ($ VSub_Number "$1")) } ) (C {(_Dbg_watch_val) (Lit_Other "[") ($ VSub_Name "$n") (Lit_Other "]") (Lit_Other "=") (CommandSubPart command_list: (CommandList children: [(C {(_Dbg_get_watch_exp_eval)} {($ VSub_Name "$n")})] ) left_token: spids: [299 303] ) } ) (C {(_Dbg_watch_enable) (Lit_Other "[") ($ VSub_Name "$n") (Lit_Other "]") (Lit_Other "=") (1) } ) (C {(_Dbg_watch_count) (Lit_Other "[") ($ VSub_Name "$n") (Lit_Other "]") (Lit_Other "=") (0) } ) (C {(_Dbg_printf)} {(SQ <"%2d: %s==%s arith: %d">)} {($ VSub_Name "$n")} { (DQ ("(") (BracedVarSub token: bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name "$n")})) spids: [334 339] ) (")") ) } { (BracedVarSub token: bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name "$n")})) spids: [343 348] ) } { (BracedVarSub token: bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name "$n")})) spids: [352 357] ) } ) ] spids: [257 360] ) (ControlFlow token: arg_word:{(0)}) ] spids: [234] ) spids: [230 233] ) ] )