Ruby を書きはじめてまるまる 1 週間たちました。この一週
間、Ruby らしく? 書けるようにと(まだまだですが)。
自分なりにはちょっとよくなったと思う hd.rb (hex dump)
ですが、みなさんの意見を聞かせていただけませんか?
課題としては、「bin_to_str」を汎用的にする(イニシャラ
イズの点など <- グローバル変数を使用している)というも
のがあるのですが... (再利用するかな?)
組み込みの kconv は、入力がきれい? な場合にはいいので
すが、いきなりバイナリを読ませてしまうと、後の処理がう
まく行かないようなので、正規表現で対象を限定しています。
この正規表現部分は、漢字コードとしての定義的には含まれ
る部分でも、実際に変換した後いろいろなコマンド(おもに
表示のための less)の対応などから若干範囲を狭くしていま
す。文字が表示される範囲(フォントが用意されている範囲?)
に対しては抜けがないとは思います。Mule の
tm(tiny-mime) などは、もう少し範囲を限定した方がよさそ
うです(この部分もどうしたものかと思っていますが)。
ということで、お時間がありましたら試してみていただけま
せんでしょうか?
オプション
-s 入力を SJIS として処理
-S 出力漢字コードを SJIS に
-e 入力を EUC として処理 デフォルト
-E 出力漢字コードを EUC に デフォルト
-数字 ファイルの hex dump 表示をはじめるオフセット指定
-0x「16 進文字列」 で 16 進数指定可能
-0「8 新文字列」で 8 進数指定可能
------------------------------
#! /usr/local/bin/ruby
# /home/tetsu/src/ruby/hd.rb
# Created: February 22,1998 Sunday 18:39:06
# Author: tetsu(WATANABE Tetsuya)
# $Id: hd.rb,v 1.8 1998/02/28 07:58:00 tetsu Exp $
# usage:
require "kconv"
include Kconv
def usage
STDERR.print <<E
usage: #$0 [-seSE] [-(num|0xhex|0oct)] [files ...]
-[0-9]+ offset
-0[0-7]+ octal
-0x[0-9a-fA-F]+ hex
-s sjis/input code
-e euc /input code
-S sjis/output code
-E euc /output code (default)
E
exit 1
end
def hd(f, offset)
f.pos = offset if offset > 0 and f != STDIN
while $_ = f.read(16) and $_.length == 16
bin = $_.unpack('N4')
printf("%8.8x %8.8x %8.8x %8.8x %8.8x", offset, *bin);
print ' ', $_.tr("\000-\037\177", '.').bin_to_str, "\n";
offset += 16
end
if $_ and $_.length > 0
bin = $_.unpack('C*')
bin.each_index { |i|
bin[i] = sprintf('%2.2x', bin[i])
}
for i in bin.length .. 16 - 1
bin.push(' ')
end
printf("%8.8x %s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s", offset, *bin);
print ' ', $_.tr("\000-\037\177", '.').bin_to_str, "\n";
end
end
class String
def bin_to_str
w = ($kanji_chip + self).gsub($kanji_re) {
Kconv.kconv($1, Kconv::JIS, $in_kanji_code)
}.gsub($kana_re) {
Kconv.kconv($1, Kconv::JIS, $in_kanji_code)
}
w[0,1] = '' if $kanji_chip == w[0,1]
$kanji_chip = if $kanji_chip_re =~ w[-1,1]; w[-1,1] else nil end
Kconv.kconv(w.tr("\200-\377", '.'), $out_kanji_code, Kconv::JIS)
end
end
$in_kanji_code = Kconv::EUC
$out_kanji_code = Kconv::EUC
offset = 0
while $_ = ARGV[0] and /^-/
ARGV.shift
if /[se]/i
$in_kanji_code = if /s/; Kconv::SJIS elsif /e/; Kconv::EUC end
$out_kanji_code = if /S/; Kconv::SJIS elsif /E/; Kconv::EUC end
elsif /^-0([0-7]+)$/
offset = $1.oct
elsif /^-0x([\da-fA-F]+)$/
offset = $1.hex
elsif /^-(\d+)$/
offset = $1.to_i
else
usage
end
end
if $in_kanji_code == Kconv::EUC
$kanji_re = /((?:[\241-\376][\241-\376])+)/n
$kana_re = /((?:\216[\241-\337])+)/n
$kanji_chip_re = /^[\216\241-\376]$/n
else
$kanji_re = /((?:[\201-\237\340-\357][\100-\176\200-\374])+)/n
$kana_re = /([\241-\337]+)/n
$kanji_chip_re = /^[\201-\237\340-\357]$/n
end
if ARGV.length == 0
hd(STDIN, 0) # non offset
else
while file = ARGV.shift
f = File.open(file)
hd(f, offset)
f.close
end
end
exit
------------------------------
--
WATANABE Tetsuya HP Japan PSO
e-mail tetsu / jpn.hp.com