codec 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
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