class BinData::String

def _snapshot

def _snapshot
  # override to ensure length and optionally trim padding
  result = super
  if has_parameter?(:length)
    result = truncate_or_pad_to_length(result)
  end
  if get_parameter(:trim_padding) == true
    result = trim_padding(result)
  end
  result
end

def deprecate!(params, old_key, new_key) #:nodoc:

:nodoc:
def deprecate!(params, old_key, new_key) #:nodoc:
  if params.has_parameter?(old_key)
    warn ":#{old_key} is deprecated. Replacing with :#{new_key}"
    params[new_key] = params.delete(old_key)
  end
end

def read_and_return_value(io)

def read_and_return_value(io)
  len = eval_parameter(:read_length) || eval_parameter(:length) || 0
  io.readbytes(len)
end

def sanitize_parameters!(params, sanitizer) #:nodoc:

:nodoc:
def sanitize_parameters!(params, sanitizer) #:nodoc:
  deprecate!(params, :trim_value, :trim_padding)
  orig_sanitize_parameters!(params, sanitizer)
end

def sanitize_parameters!(params, sanitizer)

def sanitize_parameters!(params, sanitizer)
  warn_replacement_parameter(params, :initial_length, :read_length)
  if params.has_parameter?(:pad_char)
    ch = params[:pad_char]
    params[:pad_char] = sanitized_pad_char(ch)
  end
end

def sanitized_pad_char(ch)

def sanitized_pad_char(ch)
  result = ch.respond_to?(:chr) ? ch.chr : ch.to_s
  if result.length > 1
    raise ArgumentError, ":pad_char must not contain more than 1 char"
  end
  result
end

def sensible_default

def sensible_default
  ""
end

def trim_padding(str)

def trim_padding(str)
  str.sub(/#{eval_parameter(:pad_char)}*$/, "")
end

def truncate_or_pad_to_length(str)

def truncate_or_pad_to_length(str)
  len = eval_parameter(:length) || str.length
  if str.length == len
    str
  elsif str.length > len
    str.slice(0, len)
  else
    str + (eval_parameter(:pad_char) * (len - str.length))
  end
end

def value_to_binary_string(val)

def value_to_binary_string(val)
  truncate_or_pad_to_length(val)
end