package require Tcl 8.3
#----------------------------------------------------------------------
#
# dumpFile --
#
# Produce a hex/ASCII dump of a file.
#
# Parameters:
# fileName -- Path name of the file
# channel -- (Optional) Channel on which to produce the dump.
# Default is stdout.
#
# Results:
# None.
#
# Side effects:
# The file is opened, dumped to the specified channel, and
# closed again.
#
#----------------------------------------------------------------------
proc dumpFile { fileName { channel stdout } } {
# Open the file, and set up to process it in binary mode.
set f [open $fileName r]
fconfigure $f \
-translation binary \
-encoding binary \
-buffering full -buffersize 16384
while { 1 } {
# Record the seek address. Read 16 bytes from the file.
set addr [tell $f]
set s [read $f 16]
# Convert the data to hex and to characters.
binary scan $s H*@0a* hex ascii
# Replace non-printing characters in the data.
regsub -all {[^[:graph:] ]} $ascii {.} ascii
# Split the 16 bytes into two 8-byte chunks
set hex1 [string range $hex 0 15]
set hex2 [string range $hex 16 31]
set ascii1 [string range $ascii 0 7]
set ascii2 [string range $ascii 8 16]
# Convert the hex to pairs of hex digits
regsub -all {..} $hex1 {& } hex1
regsub -all {..} $hex2 {& } hex2
# Put the hex and Latin-1 data to the channel
puts $channel [format {%08x %-24s %-24s %-8s %-8s} \
$addr $hex1 $hex2 $ascii1 $ascii2]
# Stop if we've reached end of file
if { [string length $s] == 0 } {
break
}
}
# When we're done, close the file.
close $f
return
}
#----------------------------------------------------------------------
#
# Main program
#
#----------------------------------------------------------------------
if { [info exists argv0] && [string equal $argv0 [info script]] } {
foreach file $argv {
puts "$file:"
dumpFile $file
}
}