libbin 0.9.0 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ #ifndef PGHALF_H
2
+ #define PGHALF_H
3
+
4
+ #include <stdint.h>
5
+
6
+ uint32_t pghalf_to_float( uint16_t h );
7
+ uint16_t pghalf_from_float( uint32_t f );
8
+
9
+ #endif /* PGHALF_H */
data/lib/libbin.rb CHANGED
@@ -1,10 +1,6 @@
1
- warn_level = $VERBOSE
2
- $VERBOSE = nil
3
- require 'float-formats'
4
- $VERBOSE = warn_level
5
-
6
- Flt::IEEE.binary :IEEE_binary16_pg, significand: 9, exponent: 6, bias: 47
7
- Flt::IEEE.binary :IEEE_binary16_pg_BE, significand: 9, exponent: 6, bias: 47, endianness: :big_endian
1
+ module LibBin
2
+ end
3
+ require "libbin_c.so"
8
4
 
9
5
  require_relative 'libbin/alignment'
10
6
  require_relative 'libbin/data_types'
@@ -121,10 +117,11 @@ module LibBin
121
117
  end
122
118
  end
123
119
 
124
- def __decode_seek_offset(offset)
120
+ def __decode_seek_offset(offset, relative_offset)
125
121
  return nil unless offset
126
122
  offset = __decode_expression(offset)
127
123
  return false if offset == 0x0
124
+ offset += @__position if relative_offset
128
125
  @__cur_position = offset
129
126
  @__input.seek(offset) if @__input
130
127
  @__output.seek(offset) if @__output
@@ -145,31 +142,31 @@ module LibBin
145
142
  return __decode_expression(type)
146
143
  end
147
144
 
148
- def __decode_static_conditions(type, count, offset, sequence, condition)
145
+ def __decode_static_conditions(field)
149
146
  @__offset = nil
150
147
  @__condition = nil
151
148
  @__type = nil
152
149
  @__count = nil
153
- unless sequence
154
- @__offset = __decode_seek_offset(offset)
150
+ unless field.sequence?
151
+ @__offset = __decode_seek_offset(field.offset, field.relative_offset?)
155
152
  throw :ignored, nil if @__offset == false
156
- @__condition = __decode_condition(condition)
153
+ @__condition = __decode_condition(field.condition)
157
154
  throw :ignored, nil unless @__condition
158
- @__type = __decode_type(type)
155
+ @__type = __decode_type(field.type)
159
156
  end
160
- @__count = __decode_count(count)
157
+ @__count = __decode_count(field.count)
161
158
  end
162
159
 
163
- def __decode_dynamic_conditions(type, offset, sequence, condition)
164
- return true unless sequence
160
+ def __decode_dynamic_conditions(field)
161
+ return true unless field.sequence?
165
162
  @__offset = nil
166
163
  @__condition = nil
167
164
  @__type = nil
168
- @__offset = __decode_seek_offset(offset)
165
+ @__offset = __decode_seek_offset(field.offset, field.relative_offset?)
169
166
  return false if @__offset == false
170
- @__condition = __decode_condition(condition)
167
+ @__condition = __decode_condition(field.condition)
171
168
  return false unless @__condition
172
- @__type = __decode_type(type)
169
+ @__type = __decode_type(field.type)
173
170
  return true
174
171
  end
175
172
 
@@ -181,61 +178,61 @@ module LibBin
181
178
  @__condition = nil
182
179
  end
183
180
 
184
- def __convert_field(field, type, count, offset, sequence, condition)
185
- __decode_static_conditions(type, count, offset, sequence, condition)
181
+ def __convert_field(field)
182
+ __decode_static_conditions(field)
186
183
  vs = @__count.times.collect do |it|
187
184
  @__iterator = it
188
- if __decode_dynamic_conditions(type, offset, sequence, condition)
185
+ if __decode_dynamic_conditions(field)
189
186
  @__type::convert(@__input, @__output, @__input_big, @__output_big, self, it)
190
187
  else
191
188
  nil
192
189
  end
193
190
  end
194
191
  __restore_context
195
- vs = vs.first unless count
192
+ vs = vs.first unless field.count
196
193
  vs
197
194
  end
198
195
 
199
- def __load_field(field, type, count, offset, sequence, condition)
200
- __decode_static_conditions(type, count, offset, sequence, condition)
196
+ def __load_field(field)
197
+ __decode_static_conditions(field)
201
198
  vs = @__count.times.collect do |it|
202
199
  @__iterator = it
203
- if __decode_dynamic_conditions(type, offset, sequence, condition)
200
+ if __decode_dynamic_conditions(field)
204
201
  @__type::load(@__input, @__input_big, self, it)
205
202
  else
206
203
  nil
207
204
  end
208
205
  end
209
206
  __restore_context
210
- vs = vs.first unless count
207
+ vs = vs.first unless field.count
211
208
  vs
212
209
  end
213
210
 
214
- def __dump_field(vs, field, type, count, offset, sequence, condition)
215
- __decode_static_conditions(type, count, offset, sequence, condition)
216
- vs = [vs] unless count
211
+ def __dump_field(vs, field)
212
+ __decode_static_conditions(field)
213
+ vs = [vs] unless field.count
217
214
  vs.each_with_index do |v, it|
218
215
  @__iterator = it
219
- if __decode_dynamic_conditions(type, offset, sequence, condition)
216
+ if __decode_dynamic_conditions(field)
220
217
  @__type::dump(v, @__output, @__output_big, self, it)
221
218
  end
222
219
  end
223
220
  __restore_context
224
221
  end
225
222
 
226
- def __shape_field(vs, previous_offset, kind, field, type, count, offset, sequence, condition)
227
- __decode_static_conditions(type, count, offset, sequence, condition)
228
- vs = [vs] unless count
223
+ def __shape_field(vs, previous_offset, kind, field)
224
+ __decode_static_conditions(field)
225
+ vs = [vs] unless field.count
229
226
  vs = vs.each_with_index.collect do |v, it|
230
227
  @__iterator = it
231
- if __decode_dynamic_conditions(type, offset, sequence, condition)
228
+ if __decode_dynamic_conditions(field)
232
229
  sh = @__type::shape(v, @__cur_position, self, it, kind)
233
230
  @__cur_position = sh.last + 1 if sh.last && sh.last >= 0
234
231
  sh
235
232
  end
236
233
  end
237
234
  __restore_context
238
- vs = vs.first unless count
235
+ vs = vs.first unless field.count
239
236
  vs
240
237
  end
241
238
 
@@ -246,15 +243,15 @@ module LibBin
246
243
  def __shape(previous_offset = 0, parent = nil, index = nil, kind = DataShape)
247
244
  __set_size_type(previous_offset, parent, index)
248
245
  members = {}
249
- self.class.instance_variable_get(:@fields).each { |name, type, *args|
246
+ self.class.instance_variable_get(:@fields).each { |field|
250
247
  begin
251
- vs = send(name)
248
+ vs = send(field.name)
252
249
  member = catch(:ignored) do
253
- __shape_field(vs, previous_offset, kind, name, type, *args)
250
+ __shape_field(vs, previous_offset, kind, field)
254
251
  end
255
- members[name] = member
252
+ members[field.name] = member
256
253
  rescue
257
- STDERR.puts "#{self.class}: #{name}(#{type})"
254
+ STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
258
255
  raise
259
256
  end
260
257
  }
@@ -264,14 +261,14 @@ module LibBin
264
261
  end
265
262
 
266
263
  def __convert_fields
267
- self.class.instance_variable_get(:@fields).each { |name, type, *args|
264
+ self.class.instance_variable_get(:@fields).each { |field|
268
265
  begin
269
266
  vs = catch(:ignored) do
270
- __convert_field(name, type, *args)
267
+ __convert_field(field)
271
268
  end
272
- send("#{name}=", vs)
269
+ send("#{field.name}=", vs)
273
270
  rescue
274
- STDERR.puts "#{self.class}: #{name}(#{type})"
271
+ STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
275
272
  raise
276
273
  end
277
274
  }
@@ -279,14 +276,14 @@ module LibBin
279
276
  end
280
277
 
281
278
  def __load_fields
282
- self.class.instance_variable_get(:@fields).each { |name, type, *args|
279
+ self.class.instance_variable_get(:@fields).each { |field|
283
280
  begin
284
281
  vs = catch(:ignored) do
285
- __load_field(name, type, *args)
282
+ __load_field(field)
286
283
  end
287
- send("#{name}=", vs)
284
+ send("#{field.name}=", vs)
288
285
  rescue
289
- STDERR.puts "#{self.class}: #{name}(#{type})"
286
+ STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
290
287
  raise
291
288
  end
292
289
  }
@@ -294,14 +291,14 @@ module LibBin
294
291
  end
295
292
 
296
293
  def __dump_fields
297
- self.class.instance_variable_get(:@fields).each { |name, type, *args|
294
+ self.class.instance_variable_get(:@fields).each { |field|
298
295
  begin
299
- vs = send(name)
296
+ vs = send(field.name)
300
297
  catch(:ignored) do
301
- __dump_field(vs, name, type, *args)
298
+ __dump_field(vs, field)
302
299
  end
303
300
  rescue
304
- STDERR.puts "#{self.class}: #{name}(#{type})"
301
+ STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
305
302
  raise
306
303
  end
307
304
  }
@@ -350,7 +347,7 @@ module LibBin
350
347
  end
351
348
 
352
349
  def self.shape(value, previous_offset = 0, parent = nil, index = nil, kind = DataShape)
353
- value.__shape(previous_offset, parent, index, kind = DataShape)
350
+ value.__shape(previous_offset, parent, index, kind)
354
351
  end
355
352
 
356
353
  end
File without changes
@@ -70,6 +70,34 @@ module LibBin
70
70
 
71
71
  end
72
72
 
73
+ class Field
74
+ attr_reader :name,
75
+ :type,
76
+ :count,
77
+ :offset,
78
+ :sequence,
79
+ :condition
80
+
81
+ def sequence?
82
+ @sequence
83
+ end
84
+
85
+ def relative_offset?
86
+ @relative_offset
87
+ end
88
+
89
+ def initialize(name, type, count, offset, sequence, condition, relative_offset)
90
+ @name = name
91
+ @type = type
92
+ @count = count
93
+ @offset = offset
94
+ @sequence = sequence
95
+ @condition = condition
96
+ @relative_offset = relative_offset
97
+ end
98
+
99
+ end
100
+
73
101
  class DataConverter
74
102
 
75
103
  rl = lambda { |type, str|
@@ -218,18 +246,18 @@ module LibBin
218
246
  :E => l["E"],
219
247
  :G => l["G"],
220
248
  :"a*" => l["a*"],
221
- :half => [ lambda { |str| Flt::IEEE_binary16_BE::from_bytes(str).to(Float) },
222
- lambda { |v| Flt::IEEE_binary16_BE::new(v).to_bytes } ],
223
- :half_le => [ lambda { |str| Flt::IEEE_binary16_LE::from_bytes(str).to(Float) },
224
- lambda { |v| Flt::IEEE_binary16_LE::new(v).to_bytes } ],
225
- :half_be => [ lambda { |str| Flt::IEEE_binary16_BE::from_bytes(str).to(Float) },
226
- lambda { |v| Flt::IEEE_binary16_BE::new(v).to_bytes } ],
227
- :pghalf => [ lambda { |str| Flt::IEEE_binary16_pg_BE::from_bytes(str).to(Float) },
228
- lambda { |v| Flt::IEEE_binary16_pg_BE::new(v).to_bytes } ],
229
- :pghalf_le => [ lambda { |str| Flt::IEEE_binary16_pg_LE::from_bytes(str).to(Float) },
230
- lambda { |v| Flt::IEEE_binary16_pg_LE::new(v).to_bytes } ],
231
- :pghalf_be => [ lambda { |str| Flt::IEEE_binary16_pg_BE::from_bytes(str).to(Float) },
232
- lambda { |v| Flt::IEEE_binary16_pg_BE::new(v).to_bytes } ]
249
+ :half => [ lambda { |str| LibBin::half_from_string(str, "S>") },
250
+ lambda { |v| LibBin::half_to_string(v, "S>") } ],
251
+ :half_le => [ lambda { |str| LibBin::half_from_string(str, "S<") },
252
+ lambda { |v| LibBin::half_to_string(v, "S<") } ],
253
+ :half_be => [ lambda { |str| LibBin::half_from_string(str, "S>") },
254
+ lambda { |v| LibBin::half_to_string(v, "S>") } ],
255
+ :pghalf => [ lambda { |str| LibBin::pghalf_from_string(str, "S>") },
256
+ lambda { |v| LibBin::pghalf_to_string(v, "S>") } ],
257
+ :pghalf_le => [ lambda { |str| LibBin::pghalf_from_string(str, "S<") },
258
+ lambda { |v| LibBin::pghalf_to_string(v, "S<") } ],
259
+ :pghalf_be => [ lambda { |str| LibBin::pghalf_from_string(str, "S>") },
260
+ lambda { |v| LibBin::pghalf_to_string(v, "S>") } ]
233
261
  } )
234
262
  DATA_ENDIAN[false].merge!( {
235
263
  :c => l["c"],
@@ -263,18 +291,18 @@ module LibBin
263
291
  :E => l["E"],
264
292
  :G => l["G"],
265
293
  :"a*" => l["a*"],
266
- :half => [ lambda { |str| Flt::IEEE_binary16::from_bytes(str).to(Float) },
267
- lambda { |v| Flt::IEEE_binary16::new(v).to_bytes } ],
268
- :half_le => [ lambda { |str| Flt::IEEE_binary16_LE::from_bytes(str).to(Float) },
269
- lambda { |v| Flt::IEEE_binary16_LE::new(v).to_bytes } ],
270
- :half_be => [ lambda { |str| Flt::IEEE_binary16_BE::from_bytes(str).to(Float) },
271
- lambda { |v| Flt::IEEE_binary16_BE::new(v).to_bytes } ],
272
- :pghalf => [ lambda { |str| Flt::IEEE_binary16_pg::from_bytes(str).to(Float) },
273
- lambda { |v| Flt::IEEE_binary16_pg::new(v).to_bytes } ],
274
- :pghalf_le => [ lambda { |str| Flt::IEEE_binary16_pg_LE::from_bytes(str).to(Float) },
275
- lambda { |v| Flt::IEEE_binary16_pg_LE::new(v).to_bytes } ],
276
- :pghalf_be => [ lambda { |str| Flt::IEEE_binary16_pg_BE::from_bytes(str).to(Float) },
277
- lambda { |v| Flt::IEEE_binary16_pg_BE::new(v).to_bytes } ]
294
+ :half => [ lambda { |str| LibBin::half_from_string(str, "S<") },
295
+ lambda { |v| LibBin::half_to_string(v, "S<") } ],
296
+ :half_le => [ lambda { |str| LibBin::half_from_string(str, "S<") },
297
+ lambda { |v| LibBin::half_to_string(v, "S<") } ],
298
+ :half_be => [ lambda { |str| LibBin::half_from_string(str, "S>") },
299
+ lambda { |v| LibBin::half_to_string(v, "S>") } ],
300
+ :pghalf => [ lambda { |str| LibBin::pghalf_from_string(str, "S<") },
301
+ lambda { |v| LibBin::pghalf_to_string(v, "S<") } ],
302
+ :pghalf_le => [ lambda { |str| LibBin::pghalf_from_string(str, "S<") },
303
+ lambda { |v| LibBin::pghalf_to_string(v, "S<") } ],
304
+ :pghalf_be => [ lambda { |str| LibBin::pghalf_from_string(str, "S>") },
305
+ lambda { |v| LibBin::pghalf_to_string(v, "S>") } ]
278
306
  } )
279
307
 
280
308
 
@@ -292,7 +320,7 @@ module LibBin
292
320
  @symbol = symbol
293
321
  @size = DATA_SIZES[symbol]
294
322
  @rl_be, @sl_be = DATA_ENDIAN[true][symbol]
295
- @rl_le, @sl_be = DATA_ENDIAN[false][symbol]
323
+ @rl_le, @sl_le = DATA_ENDIAN[false][symbol]
296
324
  end
297
325
 
298
326
  def self.load(input, input_big = LibBin::default_big?, _ = nil, _ = nil)
@@ -305,7 +333,7 @@ module LibBin
305
333
  output.write(str)
306
334
  end
307
335
 
308
- def self.convert(input, output, input_big = LibBin::default_big?, output_big = !LibBin::default_big, _ = nil, _ = nil)
336
+ def self.convert(input, output, input_big = LibBin::default_big?, output_big = !input_big, _ = nil, _ = nil)
309
337
  str = input.read(@size)
310
338
  value = (input_big ? @rl_be[str] : @rl_le[str])
311
339
  str = (output_big ? @sl_be[value] : @sl_le[value])
@@ -340,17 +368,17 @@ module LibBin
340
368
 
341
369
  end
342
370
 
343
- def self.register_field(field, type, count: nil, offset: nil, sequence: false, condition: nil)
371
+ def self.register_field(field, type, count: nil, offset: nil, sequence: false, condition: nil, relative_offset: false)
344
372
  if type.kind_of?(Symbol)
345
373
  if type[0] == 'a'
346
- c = Class::new(Str) do init(sym) end
347
- @fields.push([field, c, count, offset, sequence, condition])
374
+ real_type = Class::new(Str) do init(sym) end
348
375
  else
349
- @fields.push([field, const_get(SCALAR_TYPES[type][0]), count, offset, sequence, condition])
376
+ real_type = const_get(SCALAR_TYPES[type][0])
350
377
  end
351
378
  else
352
- @fields.push([field, type, count, offset, sequence, condition])
379
+ real_type = type
353
380
  end
381
+ @fields.push(Field::new(field, real_type, count, offset, sequence, condition, relative_offset))
354
382
  attr_accessor field
355
383
  end
356
384
 
@@ -361,8 +389,8 @@ module LibBin
361
389
  init(#{symbol.inspect})
362
390
  end
363
391
 
364
- def self.#{name}(field, count: nil, offset: nil, sequence: false, condition: nil)
365
- @fields.push([field, #{klassname}, count, offset, sequence, condition])
392
+ def self.#{name}(field, count: nil, offset: nil, sequence: false, condition: nil, relative_offset: false)
393
+ @fields.push(Field::new(field, #{klassname}, count, offset, sequence, condition, relative_offset))
366
394
  attr_accessor field
367
395
  end
368
396
  EOF
@@ -401,12 +429,12 @@ EOF
401
429
  create_scalar_type(:pghalf_le)
402
430
  create_scalar_type(:pghalf_be)
403
431
 
404
- def self.string( field, length = nil, count: nil, offset: nil, sequence: false, condition: nil)
432
+ def self.string( field, length = nil, count: nil, offset: nil, sequence: false, condition: nil, relative_offset: false)
405
433
  sym = (length ? :"a#{length}" : :"a*")
406
434
  c = Class::new(Str) do
407
435
  init(sym)
408
436
  end
409
- @fields.push([field, c, count, offset, sequence, condition])
437
+ @fields.push(Field::new(field, c, count, offset, sequence, condition, relative_offset))
410
438
  attr_accessor field
411
439
  end
412
440
 
data/libbin.gemspec CHANGED
@@ -1,12 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'libbin'
3
- s.version = "0.9.0"
3
+ s.version = "1.0.4"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://github.com/kerilk/libbin"
7
7
  s.summary = "Library for loading and converting binary files"
8
8
  s.description = "Read, write and convert Binary data in Ruby."
9
- s.files = Dir[ 'libbin.gemspec', 'LICENSE', 'lib/**/*.rb' ]
9
+ s.files = Dir[ 'libbin.gemspec', 'LICENSE', 'lib/**/*.rb', 'ext/libbin/extconf.rb', 'ext/libbin/*.c', 'ext/libbin/*.h' ]
10
+ s.extensions << 'ext/libbin/extconf.rb'
10
11
  s.has_rdoc = false
11
12
  s.license = 'BSD-2-Clause'
12
13
  s.required_ruby_version = '>= 2.0.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libbin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brice Videau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-12 00:00:00.000000000 Z
11
+ date: 2019-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: float-formats
@@ -33,10 +33,17 @@ dependencies:
33
33
  description: Read, write and convert Binary data in Ruby.
34
34
  email: brice.videau@imag.fr
35
35
  executables: []
36
- extensions: []
36
+ extensions:
37
+ - ext/libbin/extconf.rb
37
38
  extra_rdoc_files: []
38
39
  files:
39
40
  - LICENSE
41
+ - ext/libbin/extconf.rb
42
+ - ext/libbin/half.c
43
+ - ext/libbin/half.h
44
+ - ext/libbin/libbin_c.c
45
+ - ext/libbin/pghalf.c
46
+ - ext/libbin/pghalf.h
40
47
  - lib/libbin.rb
41
48
  - lib/libbin/alignment.rb
42
49
  - lib/libbin/data_types.rb