class BinData::Struct

def sanitize_parameters!(sanitizer, params)

Ensures that +params+ is of the form expected by #initialize.
def sanitize_parameters!(sanitizer, params)
  # possibly override endian
  endian = params[:endian]
  if endian != nil
    unless [:little, :big].include?(endian)
      raise ArgumentError, "unknown value for endian '#{endian}'"
    end
    params[:endian] = endian
  end
  if params.has_key?(:fields)
    sanitizer.with_endian(endian) do
      # ensure names of fields are strings and that params is sanitized
      all_fields = params[:fields].collect do |ftype, fname, fparams|
        fname = fname.to_s
        klass = sanitizer.lookup_klass(ftype)
        sanitized_fparams = sanitizer.sanitize_params(klass, fparams)
        [klass, fname, sanitized_fparams]
      end
      params[:fields] = all_fields
    end
    # now params are sanitized, check that parameter names are okay
    field_names = []
    instance_methods = self.instance_methods
    reserved_names = RESERVED
    params[:fields].each do |fklass, fname, fparams|
      # check that name doesn't shadow an existing method
      if instance_methods.include?(fname)
        raise NameError.new("Rename field '#{fname}' in #{self}, " +
                            "as it shadows an existing method.", fname)
      end
      # check that name isn't reserved
      if reserved_names.include?(fname)
        raise NameError.new("Rename field '#{fname}' in #{self}, " +
                            "as it is a reserved name.", fname)
      end
      # check for multiple definitions
      if field_names.include?(fname)
        raise NameError.new("field '#{fname}' in #{self}, " +
                            "is defined multiple times.", fname)
      end
      field_names << fname
    end
    # collect all hidden names that correspond to a field name
    hide = []
    if params.has_key?(:hide)
      hidden = (params[:hide] || []).collect { |h| h.to_s }
      all_field_names = params[:fields].collect { |k,n,p| n }
      hide = hidden & all_field_names
    end
    params[:hide] = hide
  end
  super(sanitizer, params)
end