#!/usr/bin/ruby -w

#=======================================================================
# vhex.rb - abrir archivos en modo binario, un pequeño visor hexadecimal
#-----------------------------------------------------------------------
# 	Utiliza el módulo Rtxt
#-----------------------------------------------------------------------
# FJA - neocipres@gmail.com			Junio de 2008
#=======================================================================

require 'mrtxt'
include Rtxt

begin
 bloque = ''
 texto = ''
 nomf, pos_i, pos_f = ARGV
 nomf = '' if !nomf
 if !pos_i
	open(nomf, 'rb') do |f|
	 	f.each_byte { |x| bloque << "[#{x.to_s(16).upcase}|#{x.chr}] "}
	end
 else
	p = 0
	pi = pos_i.to_i
	pf = pos_f.to_i
	open(nomf, 'rb') do |f|
		if pi >= File.lstat(nomf).size
		 pi = File.lstat(nomf).size - 1
		 pf = 1
		else
		 pf = File.lstat(nomf).size - pi if pf == 0
		end
		while !f.eof? && p < pf
		 f.pos = pi + p
		 c = f.read(1)  # read devuelve el caracter no el byte
		 cod = c[0] 	# para obtener el valor entero de un determinado caracter
		 texto << c if cod > 0 && cod < 256
 		 bloque << "[#{cod.to_s(16).upcase}|#{c}] "
		 p += 1
		end
	 
	end
 end
 puts "="*80
 puts nuevo_ancho(bloque, 80, 'j')
 puts "="*80
 puts "\n => El texto encontrado entre el byte #{pi} y el #{pi+pf-1} es: \n\n" if pos_i
 puts "#{nuevo_ancho(texto, 80, 'j')} \n\n" 
rescue
 if ARGV.size == 0
  print "\n\t", "="*65
  	print "\n\t Uso: vhex <archivo> [byte de inicio] [número de bytes a leer]\n"
	print "\n\t\t vhex es un enlace simbólico a vhex.rb o cb14.rb "
	print "\n\t", "="*65, "\n\n"
 else
  puts "\n\t Error-> #{$!} en:\n\t #{$@}\n\n"
 end
end