module Erlang::ETF

Constants

B2T

@private

T2B

@private

TYPE

@private

VERSION

Public Class Methods

binary_to_term(buffer, etf) click to toggle source

@private

# File lib/erlang/etf.rb, line 276
def self.binary_to_term(buffer, etf)
  magic = buffer.getc
  if magic == Erlang::ETF::Term::ERLANG_MAGIC_BYTE
    term = nil
    begin
      term = read_term(buffer)
    rescue NotImplementedError => e
      buffer.ungetc(magic)
      raise e
    end
    return Erlang.from(term) if etf == false
    return term
  else
    buffer.ungetc(magic)
    raise NotImplementedError, "unknown Erlang magic byte #{magic.inspect} (should be #{Erlang::ETF::Term::ERLANG_MAGIC_BYTE.inspect})"
  end
  # mzbuffer.read(1)
  # magic = buffer.read(1)
  # if magic == Erlang::ETF::Term::ERLANG_MAGIC_BYTE
  #   Terms.evolve(buffer)
  # else
  #   raise NotImplementedError, "unknown Erlang magic byte #{magic.inspect} (should be #{Erlang::ETF::Term::ERLANG_MAGIC_BYTE.inspect})"
  # end
end
intlog2(x) click to toggle source

@private

# File lib/erlang/etf.rb, line 255
def self.intlog2(x)
  raise ArgumentError, "x must be a positive Integer" if not x.is_a?(::Integer) or x < 1
  r = 0
  loop do
    break if x == 0
    x >>= 1
    r += 1
  end
  return r
end
intlog2div8(x) click to toggle source

@private

# File lib/erlang/etf.rb, line 267
def self.intlog2div8(x)
  raise ArgumentError, "x must be a non-negative Integer" if not x.is_a?(::Integer)
  x = x.abs if x < 0
  return 1 if x == 0
  x = intlog2(x)
  return 1 + ((x - 1).div(8))
end
is_atom(term) click to toggle source
# File lib/erlang/etf.rb, line 104
def self.is_atom(term)
  return true if term.kind_of?(TYPE[:atom])
  return true if Erlang.is_atom(term) and term.size >= 256 and term.utf8 == false
  return false
end
is_atom_utf8(term) click to toggle source
# File lib/erlang/etf.rb, line 110
def self.is_atom_utf8(term)
  return true if term.kind_of?(TYPE[:atom_utf8])
  return true if Erlang.is_atom(term) and term.size >= 256 and term.utf8 == true
  return false
end
is_binary(term) click to toggle source
# File lib/erlang/etf.rb, line 116
def self.is_binary(term)
  return true if term.kind_of?(TYPE[:binary])
  return true if Erlang.is_binary(term)
  return false
end
is_bit_binary(term) click to toggle source
# File lib/erlang/etf.rb, line 122
def self.is_bit_binary(term)
  return true if term.kind_of?(TYPE[:bit_binary])
  return true if not Erlang.is_binary(term) and Erlang.is_bitstring(term)
  return false
end
is_export(term) click to toggle source
# File lib/erlang/etf.rb, line 128
def self.is_export(term)
  return true if term.kind_of?(TYPE[:export])
  return true if Erlang.is_function(term) and term.kind_of?(Erlang::Export)
  return false
end
is_float(term) click to toggle source
# File lib/erlang/etf.rb, line 134
def self.is_float(term)
  return true if term.kind_of?(TYPE[:float])
  return true if Erlang.is_float(term) and term.old == true
  return false
end
is_fun(term) click to toggle source
# File lib/erlang/etf.rb, line 140
def self.is_fun(term)
  return true if term.kind_of?(TYPE[:fun])
  return true if Erlang.is_function(term) and not is_export(term) and not term.new_function?
  return false
end
is_integer(term) click to toggle source
# File lib/erlang/etf.rb, line 146
def self.is_integer(term)
  return true if term.kind_of?(TYPE[:integer])
  return true if Erlang.is_integer(term) and not is_small_integer(term) and term >= (-(1 << 31) + 1) and term <= (+(1 << 31) - 1)
  return false
end
is_large_big(term) click to toggle source
# File lib/erlang/etf.rb, line 152
def self.is_large_big(term)
  return true if term.kind_of?(TYPE[:large_big])
  return true if Erlang.is_integer(term) and not is_small_integer(term) and not is_integer(term) and not is_small_big(term)
  return false
end
is_large_tuple(term) click to toggle source
# File lib/erlang/etf.rb, line 158
def self.is_large_tuple(term)
  return true if term.kind_of?(TYPE[:large_tuple])
  return true if Erlang.is_tuple(term) and not is_small_tuple(term)
  return false
end
is_list(term) click to toggle source
# File lib/erlang/etf.rb, line 164
def self.is_list(term)
  return true if term.kind_of?(TYPE[:list])
  return true if Erlang.is_list(term) and not is_nil(term) and not is_string(term)
  return false
end
is_map(term) click to toggle source
# File lib/erlang/etf.rb, line 170
def self.is_map(term)
  return true if term.kind_of?(TYPE[:map])
  return true if Erlang.is_map(term)
  return false
end
is_new_float(term) click to toggle source
# File lib/erlang/etf.rb, line 176
def self.is_new_float(term)
  return true if term.kind_of?(TYPE[:new_float])
  return true if Erlang.is_float(term) and term.old == false
  return false
end
is_new_fun(term) click to toggle source
# File lib/erlang/etf.rb, line 182
def self.is_new_fun(term)
  return true if term.kind_of?(TYPE[:new_fun])
  return true if Erlang.is_function(term) and not is_export(term) and term.new_function?
  return false
end
is_new_reference(term) click to toggle source
# File lib/erlang/etf.rb, line 188
def self.is_new_reference(term)
  return true if term.kind_of?(TYPE[:new_reference])
  return true if Erlang.is_reference(term) and term.new_reference?
  return false
end
is_nil(term) click to toggle source
# File lib/erlang/etf.rb, line 194
def self.is_nil(term)
  return true if term.kind_of?(TYPE[:nil])
  return true if Erlang.is_list(term) and term.empty?
  return false
end
is_pid(term) click to toggle source
# File lib/erlang/etf.rb, line 200
def self.is_pid(term)
  return true if term.kind_of?(TYPE[:pid])
  return true if Erlang.is_pid(term)
  return false
end
is_port(term) click to toggle source
# File lib/erlang/etf.rb, line 206
def self.is_port(term)
  return true if term.kind_of?(TYPE[:port])
  return true if Erlang.is_port(term)
  return false
end
is_reference(term) click to toggle source
# File lib/erlang/etf.rb, line 212
def self.is_reference(term)
  return true if term.kind_of?(TYPE[:reference])
  return true if Erlang.is_reference(term) and not term.new_reference?
  return false
end
is_small_atom(term) click to toggle source
# File lib/erlang/etf.rb, line 218
def self.is_small_atom(term)
  return true if term.kind_of?(TYPE[:small_atom])
  return true if Erlang.is_atom(term) and term.size < 256 and term.utf8 == false
  return false
end
is_small_atom_utf8(term) click to toggle source
# File lib/erlang/etf.rb, line 224
def self.is_small_atom_utf8(term)
  return true if term.kind_of?(TYPE[:small_atom_utf8])
  return true if Erlang.is_atom(term) and term.size < 256 and term.utf8 == true
  return false
end
is_small_big(term) click to toggle source
# File lib/erlang/etf.rb, line 230
def self.is_small_big(term)
  return true if term.kind_of?(TYPE[:small_big])
  return true if Erlang.is_integer(term) and not is_small_integer(term) and not is_integer(term) and intlog2div8(term) < 256
  return false
end
is_small_integer(term) click to toggle source
# File lib/erlang/etf.rb, line 236
def self.is_small_integer(term)
  return true if term.kind_of?(TYPE[:small_integer])
  return true if Erlang.is_integer(term) and term >= 0 and term <= (+(1 << 8) - 1)
  return false
end
is_small_tuple(term) click to toggle source
# File lib/erlang/etf.rb, line 242
def self.is_small_tuple(term)
  return true if term.kind_of?(TYPE[:small_tuple])
  return true if Erlang.is_tuple(term) and term.arity < 256
  return false
end
is_string(term) click to toggle source
# File lib/erlang/etf.rb, line 248
def self.is_string(term)
  return true if term.kind_of?(TYPE[:string])
  return true if Erlang.is_list(term) and not is_nil(term) and term.kind_of?(Erlang::String) and term.length < (+(1 << 16) - 1)
  return false
end
read_term(buffer) click to toggle source

@private

# File lib/erlang/etf.rb, line 302
def self.read_term(buffer)
  tag = buffer.getbyte
  if B2T.key?(tag)
    return B2T[tag].erlang_load(buffer)
  else
    buffer.ungetbyte(tag)
    raise NotImplementedError, "unknown Erlang External Format tag #{tag.inspect} (see http://erlang.org/doc/apps/erts/erl_ext_dist.html)"
  end
end
term_to_binary(term, buffer, compressed) click to toggle source

@private

# File lib/erlang/etf.rb, line 313
def self.term_to_binary(term, buffer, compressed)
  buffer << Erlang::ETF::Term::ERLANG_MAGIC_BYTE
  if compressed == false
    return term.erlang_dump(buffer)
  else
    return Erlang::ETF::Compressed[term, level: compressed].erlang_dump(buffer)
  end
end
write_term(term, buffer) click to toggle source

@private

# File lib/erlang/etf.rb, line 323
def self.write_term(term, buffer)
  term = Erlang.etf(term)
  return term.erlang_dump(buffer)
end