def read_block(input)
header = input.getc
raise EOFError.new() if header.nil?
case header
when T_NULL
yield T_NULL,nil
return 1
when T_BOOLEAN_TRUE
yield T_BOOLEAN_TRUE,true
return 1
when T_BOOLEAN_FALSE
yield T_BOOLEAN_FALSE,false
return 1
when T_INTEGER1
val = input.read(1).unpack("c").shift
yield T_INTEGER1,val
return 2
when T_INTEGER2
yield T_INTEGER2,read_int2(input)
return 3
when T_INTEGER4
yield T_INTEGER4,read_int4(input)
return 5
when T_INTEGER8
yield T_INTEGER8,read_int8(input)
return 9
when T_FLOAT
val = input.read(4).unpack("e").shift
yield T_FLOAT,val
return 5
when T_DOUBLE
val = input.read(8).unpack("E").shift
yield T_DOUBLE,val
return 9
when T_STRING
len = read_int4(input)
str = input.read(len)
yield T_STRING,str
return 5+len
when T_DECIMAL
len = read_int4(input)
str = input.read(len)
val = str["."] ? str.to_f : str.to_i
yield T_DECIMAL, val
return 5+len
when T_ARRAY
len,val = read_array(input)
yield T_ARRAY,val
return 1+len
when T_LIST
len,val = read_list(input)
yield T_LIST,val
return 1+len
else
raise IOError.new("Decoder: wrong header: #{header.to_s}")
end
end