def self.decode(marc, params={})
record = Record.new()
record.leader = marc[0..LEADER_LENGTH-1]
base_address = record.leader[12..16].to_i
directory = marc[LEADER_LENGTH..base_address-1]
throw "invalid directory in record" if directory == nil
num_fields = directory.length / DIRECTORY_ENTRY_LENGTH
all_fields = marc[base_address..-1].split(END_OF_FIELD)
0.upto(num_fields-1) do |field_num|
entry_start = field_num * DIRECTORY_ENTRY_LENGTH
entry_end = entry_start + DIRECTORY_ENTRY_LENGTH
entry = directory[entry_start..entry_end]
tag = entry[0..2]
field_data = ''
if params[:forgiving]
field_data = all_fields.shift()
else
length = entry[3..6].to_i
offset = entry[7..11].to_i
field_start = base_address + offset
field_end = field_start + length - 1
field_data = marc[field_start..field_end]
end
field_data.delete!(END_OF_FIELD)
if MARC::ControlField.control_tag?(tag)
record.append(MARC::ControlField.new(tag,field_data))
else
field = MARC::DataField.new(tag)
subfields = field_data.split(SUBFIELD_INDICATOR)
next if subfields.length() < 2
indicators = subfields.shift()
field.indicator1 = indicators[0,1]
field.indicator2 = indicators[1,1]
subfields.each() do |data|
subfield = MARC::Subfield.new(data[0,1],data[1..-1])
field.append(subfield)
end
record.append(field)
end
end
return record
end