crc 0.3 → 0.3.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e420d67c8c057164c47f3fd4a1d6096d28f66a2
4
- data.tar.gz: 77ec3196b4ba3164e0659fcffa7a9833e162aa0c
3
+ metadata.gz: 6d8b8a3e68b73d5b4d330c90908ab880e67f72c2
4
+ data.tar.gz: 2b035adbace1aad20b824c9611a1a9db5e06ed98
5
5
  SHA512:
6
- metadata.gz: 7b313c40122e1ee2d953e8fe07520f7787bbea4af884de0fcea1b92263b4791ed189b70696b8885d19bbf33fb56fdcf0f12412a44ade7e2a5f6f91e57d946421
7
- data.tar.gz: 157a966f25728523a2edb3de9bf293f0af0bbc1e6484a0bc7b5db8548f6a34abdb5c599d532c5e7b5a119bd41174161517b81d0cf75c49cccdf2596619adfdb8
6
+ metadata.gz: 52f0617c4756a65178e2c66c155a5b5df96c619b67ffe50e823a89b7476c6c1d9f8ae75faf65053e7cd565bc71371f12ddb07952557f20d311ab146a0fa5c876
7
+ data.tar.gz: 6e8e41eb6ef956c1a2ec26a1c97895aebe3c0d2e3f074bf8a3bfd6a0e0bc1250e26a7cc5e34a3e71ddbe8b2868fa57463414ce2fc315314484026a904f064914
@@ -2,6 +2,24 @@ This document is written in Japanese.
2
2
 
3
3
  # crc for ruby の更新履歴
4
4
 
5
+ ## crc-0.3.1.1 (平成28年11月10日 木曜日)
6
+
7
+ * rbcrc において reflect-input/output が既定値となっていなかったため修正
8
+
9
+
10
+ ## crc-0.3.1 (平成28年11月10日 木曜日)
11
+
12
+ * メソッド名 CRC#update\_with\_slice\_by\_eight を CRC#update\_with\_slice\_by\_16 に変更
13
+ * 非 reflect-input も slicing-by-16 となるように修正
14
+ * CRC#update\_with\_slice\_by\_16 の 16 ビット以下の crc に対する最適化
15
+ * crc 計算におけるルックアップテーブルの作成の高速化
16
+ * 実装が C か ruby かを判別しやすくするための定数 CRC::IMPLEMENT を追加
17
+ * CRC-64-JONES を追加
18
+ * 特定の CRC を計算するソースコード出力機能を追加
19
+ * c、ruby、javascript 向けのソースコードを出力するための機能を追加しました。
20
+ * 今のところアルゴリズムは c を除き slicing-by-16 に固定となります。
21
+
22
+
5
23
  ## crc-0.3 (平成28年7月31日 日曜日)
6
24
 
7
25
  互換性を損なう変更があります。
data/README.md CHANGED
@@ -3,11 +3,11 @@
3
3
 
4
4
  This is a general CRC (Cyclic Redundancy Check) generator for ruby.
5
5
 
6
- It is written by pure ruby with based on slice-by-eight algorithm (slice-by-16 algorithm as byte-order free and byte-alignment free).
6
+ It is written by pure ruby with based on slice-by-eight algorithm (slice-by-16 algorithm with byte-order free).
7
7
 
8
8
  Included built-in CRC modules are CRC-32, CRC-64-ECMA, CRC-64-ISO, CRC-16-CCITT, CRC-16-IBM, CRC-8, CRC-5-USB, CRC-5-EPC and many more.
9
9
 
10
- Customization is posible for 1 to 64 bit width, any polynomial primitives, and with/without bit reflection input/output.
10
+ Customization is posible for 1 to 64 bit width, any polynomials, and with/without bit reflection input/output.
11
11
 
12
12
  This library is slower than ×85+ of zlib/crc32, and slower than ×120+ of extlzma/crc32 on FreeBSD 10.3R amd64.
13
13
 
@@ -20,12 +20,14 @@ If you need more speed, please use [crc-turbo](https://rubygems/gems/crc-turbo).
20
20
  * author: dearblue (mailto:dearblue@users.osdn.me)
21
21
  * report issue to: <https://osdn.jp/projects/rutsubo/ticket/>
22
22
  * how to install: ``gem install crc``
23
- * version: 0.3
23
+ * version: 0.3.1.1
24
24
  * release quality: technical preview
25
25
  * licensing: BSD-2-Clause<br>any parts are under Creative Commons License Zero (CC0 / Public Domain), and zlib-style License.
26
26
  * dependency gems: none
27
27
  * dependency external C libraries: none
28
28
  * bundled external C libraries: none
29
+ * installed executable file:
30
+ * rbcrc: CRC calcuration source code generator for c, ruby and javascript
29
31
 
30
32
 
31
33
  ## API Guide
@@ -45,13 +47,13 @@ This examples are used CRC-32 module. Please see CRC for more details.
45
47
 
46
48
  * ``CRC.crc32[init = 0, current_length = 0] => crc-32 generator``
47
49
  * ``CRC.crc32.new(init = 0, current_length = 0) => crc-32 generator``
48
- * ``CRC.crc32#update(seq) => self`` (likely as ``Digest::XXXX.update``)
49
- * ``CRC.crc32#finish => crc-32 integer`` (likely as ``Digest::XXXX.finish``)
50
- * ``CRC.crc32#crc => crc-32 integer`` (same as ``CRC.crc32#finish``)
51
- * ``CRC.crc32#digest => crc-32 digest`` (likely as ``Digest::XXXX.digest``)
52
- * ``CRC.crc32#hexdigest => crc-32 hex-digest`` (likely as ``Digest::XXXX.hexdigest``)
50
+ * ``CRC::CRC32#update(seq) => self`` (likely as ``Digest::XXXX.update``)
51
+ * ``CRC::CRC32#finish => crc-32 integer`` (likely as ``Digest::XXXX.finish``)
52
+ * ``CRC::CRC32#crc => crc-32 integer`` (same as ``CRC::CRC32#finish``)
53
+ * ``CRC::CRC32#digest => crc-32 digest`` (likely as ``Digest::XXXX.digest``)
54
+ * ``CRC::CRC32#hexdigest => crc-32 hex-digest`` (likely as ``Digest::XXXX.hexdigest``)
53
55
 
54
- Example:
56
+ Example::
55
57
 
56
58
  ``` ruby:ruby
57
59
  x = CRC.crc32.new # => #<CRC::CRC32:00000000>
@@ -67,13 +69,13 @@ This examples are used CRC-32 module. Please see CRC for more details.
67
69
  * ``CRC.combine(crc1, crc2, len2) => combined crc integer`` (likely as ``Zlib.crc32_comibne``)
68
70
  * ``CRC#+(right_crc) => combined crc generator``
69
71
 
70
- Example-1:
72
+ Example-1::
71
73
 
72
74
  ``` ruby:ruby
73
75
  CRC.crc32.combine(CRC.crc32("123"), CRC.crc32("456789"), 6) # => 3421780262
74
76
  ```
75
77
 
76
- Example-2:
78
+ Example-2::
77
79
 
78
80
  ``` ruby:ruby
79
81
  CRC.crc32["123"] + CRC.crc32["456"] + CRC.crc32["789"] # => #<CRC::CRC32:CBF43926>
@@ -92,26 +94,26 @@ This examples are used CRC-32 module. Please see CRC for more details.
92
94
 
93
95
  * Calcurate arc-crc (***EXPERIMENTAL***)
94
96
 
95
- * ``CRC.acrc(pre, post = nil, want_crc = 0) => arc-crc byte string``
97
+ * ``CRC::XXX.acrc(pre, post = nil, want_crc = 0) => arc-crc byte string``
96
98
 
97
99
  ``` ruby:ruby
98
100
  a = "12"
99
101
  c = "789"
100
- wantcrc = 0xCBF43926
102
+ wantcrc = CRC.crc32("123456789")
101
103
  b = CRC.crc32.acrc(a, c, wantcrc) # => "3456"
102
104
  CRC.crc32[a + b + c] # => #<CRC::CRC32:CBF43926>
103
105
  ```
104
106
 
105
- See CRC::ModuleClass.acrc for more detail.
107
+ See CRC::ModuleClass.acrc or below for more detail.
106
108
 
107
109
 
108
110
  ## Built-in CRC modules
109
111
 
110
112
  ``` shell:shell
111
- % ruby -rcrc -e 'puts CRC::MODULE_TABLE.values.uniq.map { |m| m.name }.join(", ")'
113
+ $ ruby -rcrc -e 'puts CRC::MODULE_TABLE.values.uniq.map { |m| m.name }.join(", ")'
112
114
  ```
113
115
 
114
- CRC-1, CRC-3-ROHC, CRC-4-INTERLAKEN, CRC-4-ITU, CRC-5-EPC, CRC-5-ITU, CRC-5-USB, CRC-6-CDMA2000-A, CRC-6-CDMA2000-B, CRC-6-DARC, CRC-6-ITU, CRC-7, CRC-7-MVB, CRC-7-ROHC, CRC-7-UMTS, CRC-8, CRC-8-CCITT, CRC-8-MAXIM, CRC-8-DARC, CRC-8-SAE, CRC-8-WCDMA, CRC-8-CDMA2000, CRC-8-DVB-S2, CRC-8-EBU, CRC-8-I-CODE, CRC-8-ITU, CRC-8-LTE, CRC-8-ROHC, CRC-10, CRC-10-CDMA2000, CRC-11, CRC-11-UMTS, CRC-12-CDMA2000, CRC-12-DECT, CRC-12-UMTS, CRC-13-BBC, CRC-14-DARC, CRC-15, CRC-15-MPT1327, Chakravarty, CRC-16, CRC-16-ARINC, CRC-16-AUG-CCITT, CRC-16-CDMA2000, CRC-16-DECT-R, CRC-16-DECT-X, CRC-16-T10-DIF, CRC-16-DNP, CRC-16-BUYPASS, CRC-16-CCITT-FALSE, CRC-16-DDS-110, CRC-16-EN-13757, CRC-16-GENIBUS, CRC-16-LJ1200, CRC-16-MAXIM, CRC-16-MCRF4XX, CRC-16-RIELLO, CRC-16-TELEDISK, CRC-16-TMS37157, CRC-16-USB, CRC-16-A, CRC-16-KERMIT, CRC-16-MODBUS, CRC-16-X-25, CRC-16-XMODEM, CRC-17-CAN, CRC-21-CAN, CRC-24, CRC-24-Radix-64, CRC-24-OPENPGP, CRC-24-BLE, CRC-24-FLEXRAY-A, CRC-24-FLEXRAY-B, CRC-24-INTERLAKEN, CRC-24-LTE-A, CRC-24-LTE-B, CRC-30, CRC-30-CDMA, CRC-31-PHILIPS, CRC-32, CRC-32-BZIP2, CRC-32C, CRC-32D, CRC-32-MPEG-2, CRC-32-POSIX, CRC-32K, CRC-32K2, CRC-32Q, CRC-32-JAMCRC, CRC-32-XFER, CRC-40-GSM, CRC-64-XZ, CRC-64-ECMA, CRC-64-WE, CRC-64-ISO
116
+ CRC-1, CRC-3-ROHC, CRC-4-INTERLAKEN, CRC-4-ITU, CRC-5-EPC, CRC-5-ITU, CRC-5-USB, CRC-6-CDMA2000-A, CRC-6-CDMA2000-B, CRC-6-DARC, CRC-6-ITU, CRC-7, CRC-7-ROHC, CRC-7-UMTS, CRC-8-CCITT, CRC-8-MAXIM, CRC-8-DARC, CRC-8-SAE, CRC-8-WCDMA, CRC-8-CDMA2000, CRC-8-DVB-S2, CRC-8-EBU, CRC-8-I-CODE, CRC-8-ITU, CRC-8-LTE, CRC-8-ROHC, CRC-10, CRC-10-CDMA2000, CRC-11, CRC-11-UMTS, CRC-12-CDMA2000, CRC-12-DECT, CRC-12-UMTS, CRC-13-BBC, CRC-14-DARC, CRC-15, CRC-15-MPT1327, CRC-16, CRC-16-AUG-CCITT, CRC-16-CDMA2000, CRC-16-DECT-R, CRC-16-DECT-X, CRC-16-T10-DIF, CRC-16-DNP, CRC-16-BUYPASS, CRC-16-CCITT-FALSE, CRC-16-DDS-110, CRC-16-EN-13757, CRC-16-GENIBUS, CRC-16-LJ1200, CRC-16-MAXIM, CRC-16-MCRF4XX, CRC-16-RIELLO, CRC-16-TELEDISK, CRC-16-TMS37157, CRC-16-USB, CRC-16-A, CRC-16-KERMIT, CRC-16-MODBUS, CRC-16-X-25, CRC-16-XMODEM, CRC-24-Radix-64, CRC-24-OPENPGP, CRC-24-BLE, CRC-24-FLEXRAY-A, CRC-24-FLEXRAY-B, CRC-24-INTERLAKEN, CRC-24-LTE-A, CRC-24-LTE-B, CRC-30-CDMA, CRC-31-PHILIPS, CRC-32, CRC-32-BZIP2, CRC-32C, CRC-32D, CRC-32-MPEG-2, CRC-32-POSIX, CRC-32Q, CRC-32-JAMCRC, CRC-32-XFER, CRC-40-GSM, CRC-64-XZ, CRC-64-JONES, CRC-64-ECMA, CRC-64-WE, CRC-64-ISO
115
117
 
116
118
 
117
119
  ## Environment variables for behavior
@@ -127,6 +129,72 @@ CRC-1, CRC-3-ROHC, CRC-4-INTERLAKEN, CRC-4-ITU, CRC-5-EPC, CRC-5-ITU, CRC-5-USB,
127
129
  CRC.combine is ported from Mark Adler's crccomb.c in <https://stackoverflow.com/questions/29915764/generic-crc-8-16-32-64-combine-implementation#29928573>.
128
130
 
129
131
 
132
+ ## Source code generator for the specific CRC calcurator (from crc-0.3.1)
133
+
134
+ Add source code generator for the specific CRC calcurator to c, ruby, and javascript.
135
+
136
+ Algorithm is slicing-by-16 only for ruby and javascript.
137
+
138
+ For C, be able choose into bit-by-bit, bit-by-bit-fast, halfbyte-table,
139
+ standard-table, slicing-by-4, slicing-by-8, and slicing-by-16.
140
+
141
+ ``` shell:shell
142
+ $ rbcrc --help
143
+ usage: rbcrc [options] output-filename...
144
+ -M crcname choose included crc name in library (``-l'' to print list)
145
+ -N crcname declare function name or class name [DEFAULT is filename]
146
+ -s bitsize declare crc bit size [REQUIRED for customized crc]
147
+ -p polynom declare crc polynomial [REQUIRED for customized crc]
148
+ -c initcrc declare initial crc (not internal state) [DEFAULT: 0]
149
+ -S initstate declare initial state (internal state) [DEFAULT: unset]
150
+ -x xormask declare xor bit mask for when output [DEFAULT: ~0]
151
+ -i reflect input [DEFAULT]
152
+ -I normal input (not reflect)
153
+ -o reflect output [DEFAULT]
154
+ -O normal output (not reflect)
155
+ -a algorithm switch algorithm (see below) (C file type only)
156
+
157
+ -l print crc names
158
+ -f force overwrite
159
+ -v increment verbosery level
160
+ -q quiet mode (reset verbosery level to zero)
161
+
162
+ About LICENSE for generated source code:
163
+ Generated code is under Creative Commons License Zero (CC0 / Public Domain).
164
+ See https://creativecommons.org/publicdomain/zero/1.0/
165
+
166
+ Algorithms (C file type only):
167
+ bit-by-bit, bit-by-bit-fast, halfbyte-table, standard-table,
168
+ slicing-by-4, slicing-by-8, slicing-by-16
169
+
170
+ Support export file types:
171
+ * .c for C (support C89, but required ``stdint.h'')
172
+ * .js for javascript (required ECMAScript 6th edition)
173
+ * .rb for ruby (for ruby-2.1+, jruby, and rubinius)
174
+ (executable for ruby-1.8, ruby-1.9 and ruby-2.0)
175
+ (executable for mruby and limitation bitsize by fixnum)
176
+
177
+ examples:
178
+ * create crc-32 generator to c source (and header file)
179
+ $ rbcrc crc32.c
180
+
181
+ * create crc-32c generator to ruby source
182
+ $ rbcrc crc32c.rb
183
+
184
+ * create crc-30-cdma generator to javascript source
185
+ $ rbcrc crc30cdma.js
186
+
187
+ * create crc-32 generator to ``crc.c'', ``crc.rb'' and ``crc.js''
188
+ $ rbcrc -Mcrc32 crc.c crc.rb crc.js
189
+
190
+ * create customized crc generator (as mycrc function) to ``mycrc.c''
191
+ $ rbcrc -s15 -p0x6789 -io -r0 -x~0 mycrc.c
192
+
193
+ * create customized crc generator (as MyCRC class) to ``mycrc_1.rb''
194
+ $ rbcrc -s39 -p0x987654321 -IO -r0 -x1 -NMyCRC mycrc_1.rb
195
+ ```
196
+
197
+
130
198
  ## arc-crc (***EXPERIMENTAL***)
131
199
 
132
200
  (Written in japanese from here)
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "crc/codegen"
4
+ require "optparse"
5
+
6
+ def parse_number(t)
7
+ case t.strip
8
+ when /^~(\w+)$/
9
+ ~Integer($1)
10
+ else
11
+ Integer(t)
12
+ end
13
+ end
14
+
15
+ mode = nil
16
+ crc = nil
17
+ crcname = nil
18
+ bitsize = nil
19
+ polynomial = nil
20
+ initcrc = nil
21
+ initstate = nil
22
+ xormask = nil
23
+ normalin = nil
24
+ normalout = nil
25
+ algorithm = CRC::ALGORITHM_SLICING_BY_16
26
+ forceoverwrite = false
27
+ verbose = 1
28
+
29
+ OptionParser.new("usage: #{File.basename $0} [options] output-filename...", 12, " ").instance_eval do
30
+ on("-M crcname", "choose included crc name in library (``-l'' to print list)") do |x|
31
+ begin
32
+ crc = CRC.lookup(x)
33
+ rescue
34
+ raise OptionParser::InvalidOption,
35
+ "not matched crc name - #{x.strip} (if check name, use ``-l'' switch)"
36
+ end
37
+ end
38
+ on("-N crcname", "declare function name or class name [DEFAULT is filename]") { |x| crcname = x.strip }
39
+ on("-s bitsize", "declare crc bit size [REQUIRED for customized crc]") do |x|
40
+ bitsize = x.to_i
41
+ unless bitsize >= 1 && bitsize <= 64
42
+ raise OptionParser::InvalidOption,
43
+ "wrong bitsize (given #{bitsize}, expect 1..64)"
44
+ end
45
+ end
46
+ on("-p polynom", "declare crc polynomial [REQUIRED for customized crc]") do |x|
47
+ polynomial = Integer(x)
48
+ end
49
+ on("-c initcrc", "declare initial crc (not internal state) [DEFAULT: 0]") do |x|
50
+ initcrc = parse_number(x)
51
+ initstate = nil
52
+ end
53
+ on("-S initstate", " declare initial state (internal state) [DEFAULT: unset]") do |x|
54
+ initcrc = nil
55
+ initstate = parse_number(x)
56
+ end
57
+ on("-x xormask", "declare xor bit mask for when output [DEFAULT: ~0]") do |x|
58
+ xormask = parse_number(x)
59
+ end
60
+ on("-i", "reflect input [DEFAULT]") { |x| normalin = false }
61
+ on("-I", "normal input (not reflect)") { |x| normalin = true }
62
+ on("-o", "reflect output [DEFAULT]") { |x| normalout = false }
63
+ on("-O", "normal output (not reflect)") { |x| normalout = true }
64
+ on("-a algorithm", " switch algorithm (see below) (C file type only)") { |x|
65
+ xx = x.downcase.gsub(/[^0-9a-z]+/m, "")
66
+ algorithm = {
67
+ "bitbybit" => CRC::ALGORITHM_BITBYBIT,
68
+ "bitbybitfast" => CRC::ALGORITHM_BITBYBIT_FAST,
69
+ "halfbytetable" => CRC::ALGORITHM_HALFBYTE_TABLE,
70
+ "standardtable" => CRC::ALGORITHM_STANDARD_TABLE,
71
+ "sliceby4" => CRC::ALGORITHM_SLICING_BY_4,
72
+ "slicingby4" => CRC::ALGORITHM_SLICING_BY_4,
73
+ "sliceby8" => CRC::ALGORITHM_SLICING_BY_8,
74
+ "slicingby8" => CRC::ALGORITHM_SLICING_BY_8,
75
+ "sliceby16" => CRC::ALGORITHM_SLICING_BY_16,
76
+ "slicingby16" => CRC::ALGORITHM_SLICING_BY_16,
77
+ }[xx]
78
+ unless algorithm
79
+ raise OptionParser::InvalidOption,
80
+ "wrong algorithm name - ``#{x}'' (except bit-by-bit, bit-by-bit-fast, halfbyte-table, standard-table, slicing-by-4, slicing-by-8, slicing-by-16)"
81
+ end
82
+ }
83
+
84
+ separator ""
85
+
86
+ on("-l", "print crc names") { mode = :list }
87
+ on("-f", "force overwrite") { forceoverwrite = true }
88
+ on("-v", "increment verbosery level") { verbose += 1 }
89
+ on("-q", "quiet mode (reset verbosery level to zero)") { verbose = 0 }
90
+
91
+ separator <<-EOS
92
+
93
+ About LICENSE for generated source code:
94
+ Generated code is under Creative Commons License Zero (CC0 / Public Domain).
95
+ See https://creativecommons.org/publicdomain/zero/1.0/
96
+
97
+ Algorithms (C file type only):
98
+ bit-by-bit, bit-by-bit-fast, halfbyte-table, standard-table,
99
+ slicing-by-4, slicing-by-8, slicing-by-16
100
+
101
+ Support export file types:
102
+ * .c for C (support C89, but required ``stdint.h'')
103
+ * .js for javascript (required ECMAScript 6th edition)
104
+ * .rb for ruby (for ruby-2.1+, jruby, and rubinius)
105
+ (executable for ruby-1.8, ruby-1.9 and ruby-2.0)
106
+ (executable for mruby and limitation bitsize by fixnum)
107
+
108
+ examples:
109
+ * create crc-32 generator to c source (and header file)
110
+ $ rbcrc crc32.c
111
+
112
+ * create crc-32c generator to ruby source
113
+ $ rbcrc crc32c.rb
114
+
115
+ * create crc-30-cdma generator to javascript source
116
+ $ rbcrc crc30cdma.js
117
+
118
+ * create crc-32 generator to ``crc.c'', ``crc.rb'' and ``crc.js''
119
+ $ rbcrc -Mcrc32 crc.c crc.rb crc.js
120
+
121
+ * create customized crc generator (as mycrc function) to ``mycrc.c''
122
+ $ rbcrc -s15 -p0x6789 -io -r0 -x~0 mycrc.c
123
+
124
+ * create customized crc generator (as MyCRC class) to ``mycrc_1.rb''
125
+ $ rbcrc -s39 -p0x987654321 -IO -r0 -x1 -NMyCRC mycrc_1.rb
126
+ EOS
127
+
128
+ begin
129
+ parse!
130
+
131
+ if bitsize && polynomial.nil?
132
+ raise OptionParser::InvalidOption,
133
+ "given ``-s'' switch only (need ``-p'' switch too)"
134
+ end
135
+ rescue OptionParser::InvalidOption
136
+ $stderr.puts <<-ERRORTEXT
137
+ #$0: #$! (#{$!.class})
138
+ \tor enter ``#$0 --help'' to print help.
139
+ ERRORTEXT
140
+ exit 1
141
+ end
142
+
143
+ if ARGV.empty? && mode.nil?
144
+ puts help
145
+ exit 1
146
+ end
147
+ end
148
+
149
+ def write_to_file(forceoverwrite, *filenames)
150
+ unless forceoverwrite
151
+ isexist = false
152
+ filenames.each do |nm|
153
+ next unless File.exist?(nm)
154
+ $stderr.puts "#$0: file exist - #{nm} (please use ``-f'' switch, if you want to overwrite)\n"
155
+ isexist = true
156
+ end
157
+
158
+ return nil if isexist
159
+ end
160
+
161
+ begin
162
+ cleanup = true
163
+ files = filenames.map do |nm|
164
+ File.open(nm, "ab") { } # write test
165
+ fd = File.open(nm + "~", "wb")
166
+ fd.define_singleton_method(:path, -> { nm })
167
+ fd
168
+ end
169
+ yield *files
170
+ cleanup = false
171
+ ensure
172
+ if files
173
+ if cleanup
174
+ files.each { |fd| fd.close rescue nil; File.unlink fd.path + "~" rescue nil }
175
+ else
176
+ files.each { |fd| fd.close; File.rename fd.path + "~", fd.path }
177
+ end
178
+ end
179
+ end
180
+ end
181
+
182
+ begin
183
+ case mode
184
+ when :list
185
+ case verbose
186
+ when 0, 1
187
+ puts CRC::LIST.map {|e| e[7 .. -1] }.join(", ")
188
+ when 2
189
+ puts CRC::LIST.map {|e| e[7 .. -1].join(", ") }.join("\n")
190
+ else
191
+ puts "## This is YAML format\n"
192
+ CRC::LIST.each do |e|
193
+ bytesize = (e[0] + 7) / 8
194
+ bitmask = ~(~0 << e[0])
195
+ hex = ->(n) { "0x%0*X" % [bytesize * 2, bitmask & n] }
196
+ names = e[8 .. -1]
197
+ if names.empty?
198
+ names = nil
199
+ else
200
+ names = <<-YAML_FORMAT.chomp!
201
+
202
+ another names:
203
+ - "#{names.join(%("\n - "))}"
204
+ YAML_FORMAT
205
+ end
206
+ puts <<-YAML_FORMAT
207
+ "#{e[7]}":
208
+ bitsize: #{e[0]}
209
+ polynomial: #{hex[e[1]]}
210
+ reflect input: #{e[2].inspect}
211
+ reflect output: #{e[3].inspect}
212
+ initial crc: #{hex[e[4]]}
213
+ xor output: #{hex[e[5]]}#{names}
214
+ YAML_FORMAT
215
+ end
216
+ end
217
+ else
218
+ ARGV.each do |path|
219
+ begin
220
+ basename = File.basename path, ".*"
221
+ type = File.extname path
222
+
223
+ if bitsize
224
+ wxor = xormask || ~0
225
+ wcrc = crc || CRC.new(bitsize, polynomial,
226
+ initcrc || (initstate ? (initstate ^ wxor) : 0),
227
+ !normalin, !normalout, wxor)
228
+ wcrcname = crcname || basename
229
+ else
230
+ begin
231
+ wcrc = crc || CRC.lookup(basename)
232
+ rescue
233
+ raise "not matched crc name from filename - #{basename} (if you want check name, use ``-l'' switch)"
234
+ end
235
+
236
+ if initcrc || initstate || xormask || !normalin.nil? || !normalout.nil?
237
+ wxor = xormask || wcrc.xor_output
238
+ wcrc = CRC.new(wcrc.bitsize, wcrc.polynomial,
239
+ initcrc || (initstate ? (initstate ^ wxor) : wcrc.initial_crc),
240
+ normalin.nil? ? wcrc.reflect_input? : !normalin,
241
+ normalout.nil? ? wcrc.reflect_output? : !normalout,
242
+ wxor)
243
+ wcrcname = crcname || basename
244
+ end
245
+ end
246
+
247
+ case type
248
+ when ".c"
249
+ write_to_file(forceoverwrite, path.sub(/\.c$/i, ".h"), path) do |cheader, csource|
250
+ code = wcrc.dump_to_c(wcrcname, File.basename(cheader.path), File.basename(csource.path),
251
+ indent: 4, algorithm: algorithm)
252
+ cheader << code[:header]
253
+ csource << code[:source]
254
+ end
255
+ when ".js"
256
+ if wcrc.bitsize > 32
257
+ raise "bitsize is too big for javascript (given #{wcrc.bitsize}, expect 1..32)"
258
+ end
259
+
260
+ write_to_file(forceoverwrite, path) do |jssource|
261
+ code = wcrc.dump_to_javascript(wcrcname)
262
+ jssource << code[:source]
263
+ end
264
+ when ".rb"
265
+ write_to_file(forceoverwrite, path) do |rbsource|
266
+ code = wcrc.dump_to_ruby(wcrcname)
267
+ rbsource << code[:source]
268
+ end
269
+ else
270
+ raise "not supported for ``#{type}'' file type"
271
+ end
272
+ rescue
273
+ if $-d
274
+ $stderr.puts $@.join("\n\t").sub(/$/, ": #$! (#{$!.class})")
275
+ else
276
+ $stderr.puts "#$0: #$! - #{path}\n"
277
+ end
278
+ end
279
+ end
280
+ end
281
+ rescue Errno::EPIPE
282
+ end