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