binp 4.0.1 → 4.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3e5aa8bf9a77550ad7541f17e1f958f5f6d9c23a763dc555770cd16c528462d7
4
- data.tar.gz: 05f9f4429177401d63115fb14320e33bc77f9c1554023213d7e4997b49dff0dc
3
+ metadata.gz: 5c53f3f9d6f7dfaf4ef40754a51b901510e27c13a28ca4bebf51138d7af7eeef
4
+ data.tar.gz: 84343e0458654820acf6f33d053506786b72c226aa1c7db2ba493b2e67b2227a
5
5
  SHA512:
6
- metadata.gz: 8e6e4087c112da72860488d20008946b3955fc87cf0d350c85dc3ce746d3d28e0155a82821b6e0b67c6ace98b06a981bc222cc1a71737a55bac477a4c197e447
7
- data.tar.gz: '0514328a067f495fdad35ecd88587ba142fc0d7b7178a6a420db00eafcb253de7c67b01bc1151cbe5e1c84b9f514ffdeb42a8d1e4502a38fe3948bf9e0f574e1'
6
+ metadata.gz: 3315c9cbdb10d04fb4d47afbd13b0056054bfd43d05358dae11967062d1c9ba3c4494565546deb783deec692870bbe4a6284ed9e00ab3338abc71a3a22d2fca0
7
+ data.tar.gz: 69f95fcd377c8c153a6c583b1094f31032e347f6baa2bc15ed31938ba93ebcebfea263f5b11eb5c88a8840e6f80cd447e0d90cee70249ecdc0cdb99cd3a18b98
data/Gemfile.lock CHANGED
@@ -1,16 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- binp (4.0.1)
4
+ binp (4.1.0)
5
5
  formatador
6
+ listen
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
11
  docile (1.4.0)
12
+ ffi (1.15.5)
11
13
  formatador (1.1.0)
14
+ listen (3.8.0)
15
+ rb-fsevent (~> 0.10, >= 0.10.3)
16
+ rb-inotify (~> 0.9, >= 0.9.10)
12
17
  power_assert (2.0.3)
13
18
  rake (12.3.3)
19
+ rb-fsevent (0.11.2)
20
+ rb-inotify (0.10.1)
21
+ ffi (~> 1.0)
14
22
  simplecov (0.22.0)
15
23
  docile (~> 1.1)
16
24
  simplecov-html (~> 0.11)
@@ -30,4 +38,4 @@ DEPENDENCIES
30
38
  test-unit
31
39
 
32
40
  BUNDLED WITH
33
- 2.1.4
41
+ 2.4.19
data/README.md CHANGED
@@ -7,6 +7,14 @@
7
7
 
8
8
  # 使い方
9
9
 
10
+ ```sh
11
+ Usage: binp [options] FILE
12
+ -c, --config VALUE 設定ファイルパス
13
+ -a, --all name, value 以外のすべての項目(endianness, offset, size, type)を表示する
14
+ -p, --polling VALUE 指定したポーリング間隔(ミリ秒)で再表示します
15
+ -w, --watch ファイル更新時に再表示します
16
+ ```
17
+
10
18
  以下内容のバイナリファイルをパースする場合について説明する。
11
19
 
12
20
  ■ `example.bin`
data/binp.gemspec CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ["lib"]
27
27
 
28
28
  spec.add_dependency 'formatador'
29
+ spec.add_dependency 'listen'
29
30
 
30
31
  spec.add_development_dependency 'test-unit'
31
32
  spec.add_development_dependency 'simplecov'
data/lib/binp/cli/main.rb CHANGED
@@ -1,51 +1,52 @@
1
1
  # encoding: UTF-8
2
2
  require 'formatador'
3
3
  require 'json'
4
+ require 'listen'
4
5
  require 'optparse'
6
+ require 'pathname'
5
7
  require 'yaml'
6
8
 
7
9
  require_relative '../../binp.rb'
8
10
 
9
11
  class Main
10
12
  def self.run(argv)
11
- # 引数パース
12
- opts, argv = parse_option(argv)
13
-
14
- # ファイル読み込み
15
- config = read_config_file(opts[:config])
16
- uint8_array = read_binary_file(argv[0])
17
-
18
- # バイナリパース
19
- raw_result = BinParser.parse(uint8_array, config)
20
-
21
- # 出力用に加工して出力
22
- result = raw_result.map { |e|
23
- e['type'] = e['type'][:name]
24
-
25
- # FLAGS では endianness が無い場合があるのでチェックしてから設定
26
- if e['endianness']
27
- e['endianness'] = e['endianness'][:name]
13
+ begin
14
+ # 引数パース
15
+ opts, argv = parse_option(argv)
16
+
17
+ # コンフィグファイル読み込み
18
+ config = read_config_file(opts[:config])
19
+
20
+ # watch オプションを確認し、フラグがたっていれば watch モードで実行
21
+ if opts[:watch]
22
+ watch(config, opts[:all], argv[0])
23
+ elsif opts[:polling] != 0
24
+ interval = opts[:polling].to_f / 1000.0
25
+ loop do
26
+ display(config, opts[:all], argv[0], true)
27
+ sleep interval
28
+ end
29
+ else
30
+ display(config, opts[:all], argv[0], false)
28
31
  end
29
-
30
- # layout は出力量が多すぎるので削除
31
- e.delete('layout')
32
- e
33
- }
34
- if !opts[:all]
35
- result.map! { |e| { 'name' => e['name'], 'value' => e['value']} }
32
+ rescue Interrupt
33
+ # do nothing
36
34
  end
37
- Formatador.display_compact_table(result)
38
35
  end
39
36
 
40
37
  def self.parse_option(argv)
41
38
  options = {
42
- all: false
39
+ all: false,
40
+ polling: 0,
41
+ watch: false
43
42
  }
44
43
  op = OptionParser.new
45
44
  op.banner = 'Usage: binp [options] FILE'
46
45
 
47
46
  op.on('-c VALUE', '--config VALUE', '設定ファイルパス') { |v| options[:config] = v }
48
47
  op.on('-a', '--all', 'name, value 以外のすべての項目(endianness, offset, size, type)を表示する') { |v| options[:all] = true }
48
+ op.on('-p VALUE', '--polling VALUE', '指定したポーリング間隔(ミリ秒)で再表示します') { |v| options[:polling] = v }
49
+ op.on('-w', '--watch', 'ファイル更新時に再表示します') { |v| options[:watch] = true }
49
50
  begin
50
51
  op.parse!(argv)
51
52
  rescue OptionParser::InvalidOption => e
@@ -111,5 +112,68 @@ class Main
111
112
  f.each_byte.to_a
112
113
  }
113
114
  end
115
+
116
+ # watch モード(指定されたファイルが更新されるたびに結果を出力する)
117
+ def self.watch(config, is_all, file)
118
+ # 初回の出力
119
+ display(config, is_all, file, true)
120
+
121
+ # ファイルの変更を監視し、変更があればターミナルに出力
122
+ directory = Pathname.new(file).dirname.to_s
123
+ listener = Listen.to(directory) do |modified, _added, _removed|
124
+ modified_file = Pathname.new(modified.first).expand_path
125
+
126
+ # 変更されたファイルが監視対象でなければ何もしない
127
+ next unless modified_file == Pathname.new(file).expand_path
128
+
129
+ # 出力
130
+ display(config, is_all, modified_file, true)
131
+ end
132
+
133
+ listener.start
134
+ begin
135
+ sleep
136
+ rescue Interrupt
137
+ # do nothing
138
+ end
139
+ end
140
+
141
+ # バイナリファイルをパースして、出力用にフォーマットする
142
+ def self.parse_and_format(config, is_all, file)
143
+ uint8_array = read_binary_file(file);
144
+
145
+ # バイナリパース
146
+ raw_result = BinParser.parse(uint8_array, config)
147
+
148
+ # パース結果を出力用に加工
149
+ result = raw_result.map { |e|
150
+ e['type'] = e['type'][:name]
151
+
152
+ # FLAGS では endianness が無い場合があるのでチェックしてから設定
153
+ if e['endianness']
154
+ e['endianness'] = e['endianness'][:name]
155
+ end
156
+
157
+ # layout は出力量が多すぎるので削除
158
+ e.delete('layout')
159
+ e
160
+ }
161
+
162
+ # all フラグが立っていない場合、 name と value のみ抽出
163
+ if !is_all
164
+ result.map! { |e| { 'name' => e['name'], 'value' => e['value']} }
165
+ end
166
+
167
+ result
168
+ end
169
+
170
+ def self.display(config, is_all, file, is_reset)
171
+ # 表示用文字列を取得
172
+ result = parse_and_format(config, is_all, file)
173
+
174
+ # 一度ターミナルをリセットして表示し直す
175
+ printf "\033c" if is_reset
176
+ Formatador.display_compact_table(result)
177
+ end
114
178
  end
115
179
 
data/lib/binp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Binp
2
- VERSION = "4.0.1"
2
+ VERSION = "4.1.0"
3
3
  end
data/lib/binp.rb CHANGED
@@ -3,16 +3,17 @@ require "binp/version"
3
3
 
4
4
  class BinParser
5
5
  def self.parse(uint8_array, config)
6
- config.flat_map { |e|
6
+ flatten_config = config.flat_map { |e|
7
+ new_e = e.clone
7
8
  # ビットフラグかどうかを確認
8
9
  if e['type'] == BinParserElement::Type::FLAGS
9
- e = BinParserElement.get_flags(uint8_array, e)
10
+ new_e = BinParserElement.get_flags(uint8_array, e)
10
11
  else
11
- e['value'] = BinParserElement.get_value(uint8_array, e['offset'], e['size'], e['type'], e['endianness'], e['value_label'])
12
+ new_e['value'] = BinParserElement.get_value(uint8_array, e['offset'], e['size'], e['type'], e['endianness'], e['value_label'])
12
13
  end
13
- e
14
+ new_e
14
15
  }
15
- end
16
+ end
16
17
  end
17
18
 
18
19
  class BinParserElement
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binp
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mikoto2000
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: listen
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: test-unit
29
43
  requirement: !ruby/object:Gem::Requirement