f5657aa76e
Jimtcl commit 1843b79a03dd ("expr: TIP 526, only support a single arg") drops the support for multi-argument syntax for the TCL command 'expr'. In the TCL scripts distributed with OpenOCD there are 1700+ lines that should be modified before switching to jimtcl 0.81. Apply the script below on every script in tcl folder. It fixes more than 92% of the lines %<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<--- #!/usr/bin/perl -Wpi my $re_sym = qr{[a-z_][a-z0-9_]*}i; my $re_var = qr{(?:\$|\$::)$re_sym}; my $re_const = qr{0x[0-9a-f]+|[0-9]+|[0-9]*\.[0-9]*}i; my $re_item = qr{(?:~\s*)?(?:$re_var|$re_const)}; my $re_op = qr{<<|>>|[+\-*/&|]}; my $re_expr = qr{( (?:\(\s*(?:$re_item|(?-1))\s*\)|$re_item) \s*$re_op\s* (?:$re_item|(?-1)|\(\s*(?:$re_item|(?-1))\s*\)) )}x; # [expr [dict get $regsC100 SYM] + HEXNUM] s/\[expr (\[dict get $re_var $re_sym\s*\] \+ *$re_const)\]/\[expr \{$1\}\]/; # [ expr (EXPR) ] # [ expr EXPR ] # note: $re_expr captures '$3' s/\[(\s*expr\s*)\((\s*$re_expr\s*)\)(\s*)\]/\[$1\{$2\}$4\]/; s/\[(\s*expr\s*)($re_expr)(\s*)\]/\[$1\{$2\}$4\]/; %<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<--- Change-Id: I0d6bddc6abf6dd29062f2b4e72b5a2b5080293b9 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/6159 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
73 lines
1.6 KiB
Tcl
73 lines
1.6 KiB
Tcl
|
|
proc proc_exists { NAME } {
|
|
set n [info commands $NAME]
|
|
set l [string length $n]
|
|
return [expr $l != 0]
|
|
}
|
|
|
|
# Give: REGISTER name - must be a global variable.
|
|
proc show_mmr32_reg { NAME } {
|
|
|
|
global $NAME
|
|
# we want $($NAME)
|
|
set a [set [set NAME]]
|
|
|
|
if ![catch { set v [memread32 $a] } msg ] {
|
|
echo [format "%15s: (0x%08x): 0x%08x" $NAME $a $v]
|
|
|
|
# Was a helper defined?
|
|
set fn show_${NAME}_helper
|
|
if [ proc_exists $fn ] {
|
|
# Then call it
|
|
$fn $NAME $a $v
|
|
}
|
|
return $v;
|
|
} else {
|
|
error [format "%s (%s)" $msg $NAME ]
|
|
}
|
|
}
|
|
|
|
|
|
# Give: NAMES - an array of names accessible
|
|
# in the callers symbol-scope.
|
|
# VAL - the bits to display.
|
|
|
|
proc show_mmr32_bits { NAMES VAL } {
|
|
|
|
upvar $NAMES MYNAMES
|
|
|
|
set w 5
|
|
foreach {IDX N} $MYNAMES {
|
|
set l [string length $N]
|
|
if { $l > $w } { set w $l }
|
|
}
|
|
|
|
for { set x 24 } { $x >= 0 } { incr x -8 } {
|
|
echo -n " "
|
|
for { set y 7 } { $y >= 0 } { incr y -1 } {
|
|
set s $MYNAMES([expr {$x + $y}])
|
|
echo -n [format "%2d: %-*s | " [expr {$x + $y}] $w $s ]
|
|
}
|
|
echo ""
|
|
|
|
echo -n " "
|
|
for { set y 7 } { $y >= 0 } { incr y -1 } {
|
|
echo -n [format " %d%*s | " [expr !!($VAL & (1 << ($x + $y)))] [expr {$w -1}] ""]
|
|
}
|
|
echo ""
|
|
}
|
|
}
|
|
|
|
|
|
proc show_mmr_bitfield { MSB LSB VAL FIELDNAME FIELDVALUES } {
|
|
set width [expr {(($MSB - $LSB + 1) + 7) / 4}]
|
|
set nval [show_normalize_bitfield $VAL $MSB $LSB ]
|
|
set name0 [lindex $FIELDVALUES 0 ]
|
|
if [ string compare $name0 _NUMBER_ ] {
|
|
set sval [lindex $FIELDVALUES $nval]
|
|
} else {
|
|
set sval ""
|
|
}
|
|
echo [format "%-15s: %d (0x%0*x) %s" $FIELDNAME $nval $width $nval $sval ]
|
|
}
|