class BinaryParser::Scope

Attributes

abstract_binary[R]

Public Class Methods

new(structure_definition, abstract_binary, parent_scope=nil) click to toggle source
# File lib/binary_parser/scope.rb, line 7
def initialize(structure_definition, abstract_binary, parent_scope=nil)
  @definition = structure_definition
  @abstract_binary = abstract_binary
  @parent_scope = parent_scope
end

Public Instance Methods

bit_length_control_variable_resolution(name, symbol) click to toggle source
# File lib/binary_parser/scope.rb, line 93
def bit_length_control_variable_resolution(name, symbol)
  if symbol == :rest
    length = @abstract_binary.bit_length - eval_bit_position(name)
    raise ParsingError, "Binary is too short. (So, 'rest' is failed.)" if length < 0
    return length
  elsif symbol == :position
    return eval_bit_position(name)
  elsif symbol == :non_fixed
    return load_var(name).bit_length
  else
    raise ProgramAssertionError, "Unknown Control-Variable '#{symbol}'."
  end
end
check_name_defined(name) click to toggle source
# File lib/binary_parser/scope.rb, line 17
def check_name_defined(name)
  raise UndefinedError, "Undefined data-name '#{name}'." unless @definition[name]
end
eval(target, name) click to toggle source
# File lib/binary_parser/scope.rb, line 71
def eval(target, name)
  target.eval do |token|
    token_eval(token, name)
  end
end
eval_bit_length(name) click to toggle source
# File lib/binary_parser/scope.rb, line 59
def eval_bit_length(name)
  check_name_defined(name)
  unless @definition[name].conditions.all?{|cond| eval(cond, name)}
    return 0
  end
  return eval(@definition[name].bit_length, name).to_i
end
eval_bit_position(name) click to toggle source
# File lib/binary_parser/scope.rb, line 54
def eval_bit_position(name)
  check_name_defined(name)
  return eval(@definition[name].bit_position, nil)
end
eval_entire_bit_length() click to toggle source
# File lib/binary_parser/scope.rb, line 67
def eval_entire_bit_length
  eval(@definition.bit_at, nil)
end
load_binary(name) click to toggle source
# File lib/binary_parser/scope.rb, line 37
def load_binary(name)
  check_name_defined(name)
  start  = eval_bit_position(name)
  length = eval_bit_length(name)
  begin
    return @abstract_binary.sub(:bit_index => start, :bit_length => length)
  rescue BadBinaryManipulationError => error
    raise ParsingError, "Cannot load binary of '#{name}'.\n" +
      "*** #{error.backtrace.first} ***\n#{error.message}\n"
  end
end
load_var(name) click to toggle source
# File lib/binary_parser/scope.rb, line 21
def load_var(name)
  return @parent_scope.load_var(name) if !@definition[name] && @parent_scope
  check_name_defined(name)
  case @definition[name]
  when StructureDefinition::DataDefinition
    eval_bit_length(name) == 0 ? nil : @definition[name].klass.new(load_binary(name))
  when StructureDefinition::LoopDefinition
    LoopList.new(@definition[name], load_binary(name), self)
  when StructureDefinition::WhileDefinition
    sub_binary = @abstract_binary.sub(:bit_index => eval_bit_position(name))
    WhileList.new(@definition[name], sub_binary, self, name)
  else
    raise ProgramAssertionError, "Unknown definition-class '#{@definition[name].class}'."
  end
end
names() click to toggle source
# File lib/binary_parser/scope.rb, line 13
def names
  @definition.names.dup
end
preview_as_integer(start_pos, length) click to toggle source
# File lib/binary_parser/scope.rb, line 49
def preview_as_integer(start_pos, length)
  sub_binary = @abstract_binary.sub(:bit_index => start_pos, :bit_length => length)
  TemplateBase.new(sub_binary).to_i
end
token_eval(token, name) click to toggle source
# File lib/binary_parser/scope.rb, line 77
def token_eval(token, name)
  if token.control_var?
    bit_length_control_variable_resolution(name, token.symbol)
  elsif token.nextbits_var?
    preview_as_integer(eval_bit_position(name), token.length)
  elsif token.length_var?
    eval_bit_length(token.symbol)
  elsif token.value_var?
    unless val = load_var(token.symbol)
      raise ParsingError, "Variable '#{token.symbol}' assigned  to Nil is referenced" +
        "at the time of resolving '#{name}'."
    end
    val
  end
end