codec 0.0.11 → 0.0.12

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.
data/lib/codec/bitmap.rb CHANGED
@@ -93,7 +93,7 @@ module Codec
93
93
  f = Field.new("ERR")
94
94
  f.set_value(buf.unpack("H*").first)
95
95
  msg.add_sub_field(f)
96
- raise ParsingException,msg.to_yaml + "\nError unknown field #{field_tag} : "
96
+ raise ParsingException.new "#{msg}\nError unknown field #{field_tag} : "
97
97
  end
98
98
  end
99
99
  return msg,buf
@@ -0,0 +1,65 @@
1
+ # coding: utf-8
2
+ module Codec
3
+ module EightBitsEncoding
4
+ ASCII_EBCDIC = ["
5
+ 00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F
6
+ 405A7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F
7
+ 7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E94AE05A5F6D
8
+ 79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C06AD0A107
9
+ C3E4858181818183858585898989C1C1C50707969696A4A4A8D6E40707070707
10
+ 818996A495D5810707070707070707070707070707C1C1C10707070707070707
11
+ 07070707070781C10707070707070707070707070789C9C9C907070707070707
12
+ D607D6D696D6070707E4E4E4A8E8070707070707070707070707070707070707
13
+ ".gsub(/[^0-9a-fA-F]/i,'')].pack("H*")
14
+
15
+ EBCDIC_ASCII = ["
16
+ 000102037F097F7F7F7F600B0C0D0E0F101112133C0A087F18197F7F1C1D1E1F
17
+ 7F7F7F7F7F0A171B7F7F7F7F7F0506077F7F167F7F7F7F047F7F7F7F14157F1A
18
+ 207F7F7F7F7F7F7F7F7F5B2E3C282B21267F7F7F7F7F7F7F7F7F21242A293B5E
19
+ 2D2F7F7F7F7F7F7F7F7F7C2C255F3E3F7F7F7F7F7F7F7F7F7F603A2340273D22
20
+ 7F6162636465666768697F7F7F7F7F7F7F6A6B6C6D6E6F7071727F7F7F7F7F7F
21
+ 7F7E737475767778797A7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F
22
+ 7B4142434445464748497F7F7F7F7F7F7D4A4B4C4D4E4F5051527F7F7F7F7F7F
23
+ 5C7F535455565758595A7F7F7F7F7F7F303132333435363738397F7F7F7F7F7F
24
+ ".gsub(/[^0-9a-fA-F]/i,'')].pack("H*")
25
+
26
+ ASCII_EXTENTION = (128..175).to_a + (224..255).to_a +
27
+ ["B5B6B7B8BDBEC6C7CFD0D1D2D3D4D5D6D7D8DE"].pack("H*").bytes.to_a
28
+ UTF_8_EXTENTION = ["ÇÜéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»",
29
+ "ÓßÔÒõÕμþÞÚÛÙýݯ´-±_¾¶§÷¸°¨·¹³²_.", "ÁÂÀ©¢¥ãäðÐÊËÈiÍÎÏÌ"].join.chars.to_a
30
+ EXT_ASC_TO_UTF8 = Hash[ASCII_EXTENTION.zip(UTF_8_EXTENTION)]
31
+ EXT_UTF8_TO_ASC = Hash[UTF_8_EXTENTION.zip(ASCII_EXTENTION)]
32
+
33
+ def self.UTF8_2_ASCII(buf)
34
+ buf.chars.collect { |c|
35
+ if c.getbyte(0) < 128
36
+ c
37
+ elsif EXT_UTF8_TO_ASC[c].nil?
38
+ 127.chr
39
+ else
40
+ EXT_UTF8_TO_ASC[c].chr
41
+ end
42
+ }.join
43
+ end
44
+
45
+ def self.ASCII_2_UTF8(buf)
46
+ buf.bytes.collect { |b|
47
+ if b < 128
48
+ b.chr
49
+ elsif EXT_ASC_TO_UTF8[b].nil?
50
+ 127.chr # using ascii padding character
51
+ else
52
+ EXT_ASC_TO_UTF8[b]
53
+ end
54
+ }.join
55
+ end
56
+
57
+ def self.EBCDIC_2_UTF8(buf)
58
+ ASCII_2_UTF8(buf.bytes.collect { |b| EBCDIC_ASCII.getbyte(b).chr }.join)
59
+ end
60
+
61
+ def self.UTF8_2_EBCDIC(buf)
62
+ UTF8_2_ASCII(buf).bytes.collect { |b| ASCII_EBCDIC.getbyte(b).chr }.join
63
+ end
64
+ end
65
+ end
data/lib/codec/fix.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  module Codec
2
+
2
3
  class Numbin < Base
3
4
  def build_field(buf,length)
4
5
  f = Field.new(@id)
@@ -36,7 +37,7 @@ module Codec
36
37
  end
37
38
  end
38
39
 
39
- class Numasc < Base
40
+ class Numstr < Base
40
41
  def build_field(buf,length)
41
42
  f = Field.new(@id)
42
43
  f.set_value(buf[0,length].to_i)
@@ -53,6 +54,64 @@ module Codec
53
54
  end
54
55
  end
55
56
 
57
+ class Numasc < Numstr
58
+ # This class is a copy of Numstr class because UTF8 and ASCII
59
+ # have the same encoding for digits number
60
+ end
61
+
62
+ class Numebc < Base
63
+ def build_field(buf,length)
64
+ f = Field.new(@id)
65
+ f.set_value(EightBitsEncoding::EBCDIC_2_UTF8(buf[0,length]).to_i)
66
+ return f
67
+ end
68
+
69
+ def encode(field)
70
+ out = field.get_value.to_s
71
+ if @length > 0
72
+ out = out.rjust(@length,"0")
73
+ raise TooLongDataException if out.length > @length
74
+ end
75
+ return EightBitsEncoding::UTF8_2_EBCDIC(out)
76
+ end
77
+
78
+ end
79
+
80
+ class Ebcdic < Base
81
+ def build_field(buf,length)
82
+ f = Field.new(@id)
83
+ f.set_value(EightBitsEncoding::EBCDIC_2_UTF8(buf[0,length]))
84
+ return f
85
+ end
86
+
87
+ def encode(f)
88
+ out = f.get_value
89
+ if @length > 0
90
+ raise TooLongDataException if out.length > @length
91
+ out = out.ljust(@length," ")
92
+ end
93
+ return EightBitsEncoding::UTF8_2_EBCDIC(out)
94
+ end
95
+ end
96
+
97
+ class Ascii < Base
98
+ def build_field(buf,length)
99
+ f = Field.new(@id)
100
+ f.set_value(EightBitsEncoding::ASCII_2_UTF8(buf[0,length]))
101
+ return f
102
+ end
103
+
104
+ def encode(f)
105
+ out = f.get_value
106
+ if @length > 0
107
+ raise TooLongDataException if out.length > @length
108
+ out = out.ljust(@length," ")
109
+ end
110
+ return EightBitsEncoding::UTF8_2_ASCII(out)
111
+ end
112
+ end
113
+
114
+
56
115
  class String < Base
57
116
  def build_field(buf,length)
58
117
  f = Field.new(@id)
@@ -86,4 +145,45 @@ module Codec
86
145
  return out
87
146
  end
88
147
  end
148
+
149
+ # Class Auto Converting Ebcdic to ASCII for number and string
150
+ EBCDIC_2_ASCII = ["000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F"+
151
+ "80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A"+
152
+ "20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E"+
153
+ "2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22"+
154
+ "C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0"+
155
+ "D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7"+
156
+ "7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3"+
157
+ "5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF"].pack("H*")
158
+
159
+ class Numace < Numstr
160
+ def build_field(buf,length)
161
+ f = Field.new(@id)
162
+
163
+ data = ""
164
+ # if buf to decode is in EBCDIC then convert buf in ASCII
165
+ if ( buf[0,length].unpack("C*").select{|c| c >= 128}.size > 0)
166
+ buf[0,length].unpack("C*").each { |c| data += EBCDIC_2_ASCII[c] }
167
+ else
168
+ data = buf[0,length]
169
+ end
170
+ f.set_value(data.to_i)
171
+ return f
172
+ end
173
+ end
174
+
175
+ class Strace < String
176
+ def build_field(buf,length)
177
+ f = Field.new(@id)
178
+ data = ""
179
+ # if buf to decode is in EBCDIC then convert buf in ASCII
180
+ if ( buf[0,length].unpack("C*").select{|c| c >= 128}.size > 0)
181
+ buf[0,length].unpack("C*").each { |c| data += EBCDIC_2_ASCII[c] }
182
+ else
183
+ data = buf[0,length]
184
+ end
185
+ f.set_value(data)
186
+ return f
187
+ end
188
+ end
89
189
  end
data/lib/codec/prefix.rb CHANGED
@@ -24,7 +24,7 @@ module Codec
24
24
  f,remain = @value_codec.decode_with_length(buf,len)
25
25
  rescue => e
26
26
  Logger.error "Error in #{@id} decoder \n #{e.message}\n#{e.backtrace.join(10.chr)}"
27
- raise ParsingException, e.message
27
+ raise ParsingException.new e.message
28
28
  end
29
29
 
30
30
  f.set_id(@id)
@@ -35,8 +35,8 @@ module Codec
35
35
  def build_field(buf,length)
36
36
  begin
37
37
  f,r = decode(buf[0,length])
38
- rescue ErrorBufferUnderflow => e
39
- raise ParsingException, e.message
38
+ rescue BufferUnderflow => e
39
+ raise ParsingException.new e.message
40
40
  end
41
41
  Logger.error "Error remain data in Prefixedlength" if r != ""
42
42
  return f
@@ -90,7 +90,7 @@ module Codec
90
90
  content_field = field.get_sub_field(@value_codec.id)
91
91
  length, content = @value_codec.encode_with_length(content_field)
92
92
  head_field = field.get_sub_field(@length_codec.id)
93
- raise EncodingException, "Missing header for encoding #{@id}" if head_field.empty?
93
+ raise EncodingException.new "Missing header for encoding #{@id}" if head_field.empty?
94
94
  # update length field in header if length !=0
95
95
  head_field.set_value(length,@path,@separator) if length !=0
96
96
  # encode header
@@ -113,7 +113,7 @@ module Codec
113
113
  def decode(buffer)
114
114
  tag,buf = @tag_codec.decode(buffer)
115
115
  if @subCodecs[tag.get_value.to_s].nil?
116
- raise ParsingException, "Unknown tag #{tag.get_value.to_s} for #{@id} decoder"
116
+ raise ParsingException.new "Unknown tag #{tag.get_value.to_s} for #{@id} decoder"
117
117
  end
118
118
  f,buf = @subCodecs[tag.get_value.to_s].decode(buf)
119
119
  f.set_id(tag.get_value.to_s)
@@ -124,7 +124,7 @@ module Codec
124
124
  head = Field.new(@tag_codec.id, field.get_id)
125
125
  out = @tag_codec.encode(head)
126
126
  if @subCodecs[field.get_id].nil?
127
- raise EncodingException, "Unknown tag #{field.get_id} for #{@id} encoder"
127
+ raise EncodingException.new "Unknown tag #{field.get_id} for #{@id} encoder"
128
128
  end
129
129
  out += @subCodecs[field.get_id].encode(field)
130
130
  return out
data/lib/codec/tlv.rb CHANGED
@@ -130,7 +130,7 @@ module Codec
130
130
 
131
131
  def value_decode(buf,length)
132
132
  if length > buf.length
133
- raise ErrorBufferUnderflow,"Not enough data for parsing BER TLV
133
+ raise BufferUnderflow.new "Not enough data for parsing BER TLV
134
134
  #{@id} length value #{length} remaining only #{buf.length}"
135
135
  end
136
136
  value = buf[0,length]
data/lib/codec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Codec
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
data/lib/codec.rb CHANGED
@@ -3,6 +3,7 @@ require 'codec/version'
3
3
  require 'codec/logger'
4
4
  require 'codec/field'
5
5
  require 'codec/exceptions'
6
+ require 'codec/eight_bits_encoding'
6
7
  require 'codec/base'
7
8
  require 'codec/fix'
8
9
  require 'codec/packed'
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ require_relative '../../test_helper'
3
+
4
+ describe Codec::Ascii do
5
+
6
+ subject { Codec::Ascii.new('test',3) }
7
+
8
+ it "must be a Codec::Ascii" do
9
+ subject.must_be_instance_of(Codec::Ascii)
10
+ end
11
+
12
+ it "must encode field from utf-8 to ascii" do
13
+ subject.encode(Codec::Field.new('test','été')).must_equal(["827482"].pack("H*"))
14
+ end
15
+
16
+ it "must decode from ascii stream to utf-8 field" do
17
+ subject.decode(["827482"].pack("H*")).first.must_equal(Codec::Field.new('test','été'))
18
+ end
19
+
20
+ end
21
+
22
+ describe Codec::Ebcdic do
23
+
24
+ subject { Codec::Ebcdic.new('test',3) }
25
+
26
+ it "must be a Codec::Ebcdic" do
27
+ subject.must_be_instance_of(Codec::Ebcdic)
28
+ end
29
+
30
+ it "must encode field from utf-8 to Ebcdic" do
31
+ subject.encode(Codec::Field.new('test','été')).must_equal(["85A385"].pack("H*"))
32
+ end
33
+
34
+ it "must decode from Ebcdic stream to utf-8 field" do
35
+ subject.decode(["85A385"].pack("H*")).first.must_equal(Codec::Field.new('test','ete'))
36
+ end
37
+
38
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-23 00:00:00.000000000 Z
12
+ date: 2013-10-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -77,6 +77,7 @@ files:
77
77
  - lib/codec/base.rb
78
78
  - lib/codec/bitmap.rb
79
79
  - lib/codec/composed.rb
80
+ - lib/codec/eight_bits_encoding.rb
80
81
  - lib/codec/exceptions.rb
81
82
  - lib/codec/factory.rb
82
83
  - lib/codec/field.rb
@@ -88,6 +89,7 @@ files:
88
89
  - lib/codec/version.rb
89
90
  - test/lib/codec/bitmap_test.rb
90
91
  - test/lib/codec/composed_test.rb
92
+ - test/lib/codec/eightbits_test.rb
91
93
  - test/lib/codec/field_test.rb
92
94
  - test/lib/codec/fix_test.rb
93
95
  - test/lib/codec/pckd_test.rb
@@ -124,6 +126,7 @@ summary: This Gem provide class that permit to instantiate Codec to parse or bui
124
126
  test_files:
125
127
  - test/lib/codec/bitmap_test.rb
126
128
  - test/lib/codec/composed_test.rb
129
+ - test/lib/codec/eightbits_test.rb
127
130
  - test/lib/codec/field_test.rb
128
131
  - test/lib/codec/fix_test.rb
129
132
  - test/lib/codec/pckd_test.rb