Module: Ascii85Native

Extended by:
FFI::Library
Defined in:
lib/ascii85_native.rb

Class Method Summary collapse

Class Method Details

.decode(input) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/ascii85_native.rb', line 52

def self.decode(input)
  return "" if input.nil?

  if input[0] == '<' && input[1] == '~' && input[-2] == '~' && input[-1] == '>'
    input = input[2..-3]
  end

  FFI::MemoryPointer.new(:char, input.size) do |in_char|
    in_char.write_string(input)
    out_size = self.size_for_bin(input.size)

    FFI::MemoryPointer.new(:uint8, out_size) do |output|
      self.from_a85(in_char, input.size, output)
      return output.read_string()
    end
  end
end

.encode(input, include_delimiter = false) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/ascii85_native.rb', line 23

def self.encode(input, include_delimiter=false)
  if input.nil?
    return '<~~>' if include_delimiter
    return ''
  end

  if input.class == String
    input_data = []
    input.each_byte { |byte| input_data << byte }
  else
    input_data = input
  end

  FFI::MemoryPointer.new(:uint8, input_data.size) do |in_uint8|
    in_uint8.write_array_of_type(FFI::TYPE_UINT8, :put_uint8, input_data)
    out_size = self.size_for_a85(input_data.size, true)

    FFI::MemoryPointer.new(:uint8, out_size) do |output|
      self.to_a85(in_uint8, input_data.size, output, true)
      if include_delimiter
        return '<~' + (output.read_string() || '') + '~>'
      else
        return output.read_string()
      end
    end
  end
end