origami 1.2.7 → 2.0.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.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,53 +1,47 @@
1
1
  =begin
2
2
 
3
- = File
4
- filters/jpx.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
5
+
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
18
 
24
19
  =end
25
20
 
26
21
  module Origami
27
22
 
28
- module Filter
29
-
30
- #
31
- # Class representing a Filter used to encode and decode data with JPX compression algorithm.
32
- #
33
- class JPX
34
- include Filter
35
-
36
- #
37
- # Not supported.
38
- #
39
- def encode(stream)
40
- raise NotImplementedError, "#{self.class} is not yet supported"
41
- end
42
-
43
- #
44
- # Not supported.
45
- #
46
- def decode(stream)
47
- raise NotImplementedError, "#{self.class} is not yet supported"
48
- end
49
- end
23
+ module Filter
24
+
25
+ #
26
+ # Class representing a Filter used to encode and decode data with JPX compression algorithm.
27
+ #
28
+ class JPX
29
+ include Filter
30
+
31
+ #
32
+ # Not supported.
33
+ #
34
+ def encode(stream)
35
+ raise NotImplementedError.new("#{self.class} is not yet supported", input_data: stream)
36
+ end
37
+
38
+ #
39
+ # Not supported.
40
+ #
41
+ def decode(stream)
42
+ raise NotImplementedError.new("#{self.class} is not yet supported", input_data: stream)
43
+ end
44
+ end
50
45
 
51
- end
46
+ end
52
47
  end
53
-
@@ -1,25 +1,20 @@
1
1
  =begin
2
2
 
3
- = File
4
- filters/lzw.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
5
+
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
18
 
24
19
  =end
25
20
 
@@ -27,176 +22,187 @@ require 'origami/filters/predictors'
27
22
 
28
23
  module Origami
29
24
 
30
- module Filter
25
+ module Filter
31
26
 
32
- class InvalidLZWDataError < InvalidFilterDataError #:nodoc:
33
- end
34
-
35
- #
36
- # Class representing a filter used to encode and decode data with LZW compression algorithm.
37
- #
38
- class LZW
39
-
40
- include Filter
41
-
42
- class DecodeParms < Dictionary
43
- include StandardObject
44
-
45
- field :Predictor, :Type => Integer, :Default => 1
46
- field :Colors, :Type => Integer, :Default => 1
47
- field :BitsPerComponent, :Type => Integer, :Default => 8
48
- field :Columns, :Type => Integer, :Default => 1
49
- field :EarlyChange, :Type => Integer, :Default => 1
50
- end
51
-
52
- EOD = 257 #:nodoc:
53
- CLEARTABLE = 256 #:nodoc:
54
-
55
- #
56
- # Creates a new LZW Filter.
57
- # _parameters_:: A hash of filter options (ignored).
58
- #
59
- def initialize(parameters = {})
60
- super(DecodeParms.new(parameters))
61
- end
62
-
63
- #
64
- # Encodes given data using LZW compression method.
65
- # _stream_:: The data to encode.
66
- #
67
- def encode(string)
68
- if @params.Predictor.is_a?(Integer)
69
- colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
70
- bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
71
- columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
72
-
73
- string = Predictor.do_pre_prediction(string, @params.Predictor.to_i, colors, bpc, columns)
74
- end
75
-
76
- codesize = 9
77
- result = Utils::BitWriter.new
78
- result.write(CLEARTABLE, codesize)
79
- table = clear({})
80
-
81
- s = ''
82
- string.each_byte do |byte|
83
- char = byte.chr
84
-
85
- case table.size
86
- when 512 then codesize = 10
87
- when 1024 then codesize = 11
88
- when 2048 then codesize = 12
89
- when 4096
90
- result.write(CLEARTABLE, codesize)
91
- codesize = 9
92
- clear table
93
- redo
94
- end
95
-
96
- it = s + char
97
- if table.has_key?(it)
98
- s = it
99
- else
100
- result.write(table[s], codesize)
101
- table[it] = table.size
102
- s = char
103
- end
27
+ class InvalidLZWDataError < DecodeError #:nodoc:
104
28
  end
105
-
106
- result.write(table[s], codesize)
107
- result.write(EOD, codesize)
108
-
109
- result.final.to_s
110
- end
111
-
112
- #
113
- # Decodes given data using LZW compression method.
114
- # _stream_:: The data to decode.
115
- #
116
- def decode(string)
117
-
118
- result = ""
119
- bstring = Utils::BitReader.new(string)
120
- codesize = 9
121
- table = clear(Hash.new)
122
- prevbyte = nil
123
-
124
- until bstring.eod? do
125
- byte = bstring.read(codesize)
126
-
127
- case table.size
128
- when 510 then codesize = 10
129
- when 1022 then codesize = 11
130
- when 2046 then codesize = 12
131
- when 4095
132
- if byte != CLEARTABLE
133
- then
134
- raise InvalidLZWDataError.new(
135
- "LZW table is full and no clear flag was set (codeword #{byte.to_s(2).rjust(codesize,'0')} at bit #{bstring.pos - codesize}/#{bstring.size})",
136
- result
137
- )
138
- end
139
- end
140
-
141
- if byte == CLEARTABLE
142
- codesize = 9
143
- code = EOD
144
- clear table
145
- prevbyte = nil
146
- redo
147
- elsif byte == EOD
148
- break
149
- else
150
- if prevbyte.nil?
151
- prevbyte = byte
152
- result << table.key(byte)
153
- redo
154
- else
155
- raise InvalidLZWDataError.new(
156
- "No entry for codeword #{prevbyte.to_s(2).rjust(codesize,'0')}.",
29
+
30
+ #
31
+ # Class representing a filter used to encode and decode data with LZW compression algorithm.
32
+ #
33
+ class LZW
34
+ include Filter
35
+
36
+ class DecodeParms < Dictionary
37
+ include StandardObject
38
+
39
+ field :Predictor, :Type => Integer, :Default => 1
40
+ field :Colors, :Type => Integer, :Default => 1
41
+ field :BitsPerComponent, :Type => Integer, :Default => 8
42
+ field :Columns, :Type => Integer, :Default => 1
43
+ field :EarlyChange, :Type => Integer, :Default => 1
44
+ end
45
+
46
+ EOD = 257 #:nodoc:
47
+ CLEARTABLE = 256 #:nodoc:
48
+
49
+ #
50
+ # Creates a new LZW Filter.
51
+ # _parameters_:: A hash of filter options (ignored).
52
+ #
53
+ def initialize(parameters = {})
54
+ super(DecodeParms.new(parameters))
55
+ end
56
+
57
+ #
58
+ # Encodes given data using LZW compression method.
59
+ # _stream_:: The data to encode.
60
+ #
61
+ def encode(string)
62
+ if @params.Predictor.is_a?(Integer)
63
+ colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
64
+ bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
65
+ columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
66
+
67
+ string = Predictor.do_pre_prediction(string,
68
+ predictor: @params.Predictor.to_i,
69
+ colors: colors,
70
+ bpc: bpc,
71
+ columns: columns)
72
+ end
73
+
74
+ codesize = 9
75
+ result = Utils::BitWriter.new
76
+ result.write(CLEARTABLE, codesize)
77
+ table = clear({})
78
+
79
+ s = ''
80
+ string.each_byte do |byte|
81
+ char = byte.chr
82
+
83
+ case table.size
84
+ when 512 then codesize = 10
85
+ when 1024 then codesize = 11
86
+ when 2048 then codesize = 12
87
+ when 4096
88
+ result.write(CLEARTABLE, codesize)
89
+ codesize = 9
90
+ clear table
91
+ redo
92
+ end
93
+
94
+ it = s + char
95
+ if table.has_key?(it)
96
+ s = it
97
+ else
98
+ result.write(table[s], codesize)
99
+ table[it] = table.size
100
+ s = char
101
+ end
102
+ end
103
+
104
+ result.write(table[s], codesize)
105
+ result.write(EOD, codesize)
106
+
107
+ result.final.to_s
108
+ end
109
+
110
+ #
111
+ # Decodes given data using LZW compression method.
112
+ # _stream_:: The data to decode.
113
+ #
114
+ def decode(string)
115
+ result = "".b
116
+ bstring = Utils::BitReader.new(string)
117
+ codesize = 9
118
+ table = clear(Hash.new)
119
+ prevbyte = nil
120
+
121
+ until bstring.eod? do
122
+ byte = bstring.read(codesize)
123
+
124
+ case table.size
125
+ when 510 then codesize = 10
126
+ when 1022 then codesize = 11
127
+ when 2046 then codesize = 12
128
+ when 4095
129
+ if byte != CLEARTABLE
130
+ raise InvalidLZWDataError.new(
131
+ "LZW table is full and no clear flag was set (codeword #{byte.to_s(2).rjust(codesize,'0')} at bit #{bstring.pos - codesize}/#{bstring.size})",
132
+ input_data: string,
133
+ decoded_data: result
134
+ )
135
+ end
136
+ end
137
+
138
+ if byte == CLEARTABLE
139
+ codesize = 9
140
+ clear table
141
+ prevbyte = nil
142
+ redo
143
+ elsif byte == EOD
144
+ break
145
+ else
146
+ if prevbyte.nil?
147
+ raise InvalidLZWDataError.new(
148
+ "No entry for codeword #{byte.to_s(2).rjust(codesize,'0')}.",
149
+ input_data: string,
150
+ decoded_data: result
151
+ ) unless table.value?(byte)
152
+
153
+ prevbyte = byte
154
+ result << table.key(byte)
155
+ redo
156
+ else
157
+ raise InvalidLZWDataError.new(
158
+ "No entry for codeword #{prevbyte.to_s(2).rjust(codesize,'0')}.",
159
+ input_data: string,
160
+ decoded_data: result
161
+ ) unless table.value?(prevbyte)
162
+
163
+ if table.value?(byte)
164
+ entry = table.key(byte)
165
+ else
166
+ entry = table.key(prevbyte)
167
+ entry += entry[0,1]
168
+ end
169
+
170
+ result << entry
171
+ table[table.key(prevbyte) + entry[0,1]] = table.size
172
+ prevbyte = byte
173
+ end
174
+ end
175
+ end
176
+
177
+ if @params.Predictor.is_a?(Integer)
178
+ colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
179
+ bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
180
+ columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
181
+
182
+ result = Predictor.do_post_prediction(result,
183
+ predictor: @params.Predictor.to_i,
184
+ colors: colors,
185
+ bpc: bpc,
186
+ columns: columns)
187
+ end
188
+
157
189
  result
158
- ) unless table.key(prevbyte)
159
-
160
- if table.has_value?(byte)
161
- entry = table.key(byte)
162
- else
163
- entry = table.key(prevbyte)
164
- entry += entry[0,1]
165
- end
166
-
167
- result << entry
168
- table[table.key(prevbyte) + entry[0,1]] = table.size
169
- prevbyte = byte
170
190
  end
171
- end
172
- end
173
-
174
- if @params.Predictor.is_a?(Integer)
175
- colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
176
- bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
177
- columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
178
191
 
179
- result = Predictor.do_post_prediction(result, @params.Predictor.to_i, colors, bpc, columns)
180
- end
192
+ private
193
+
194
+ def clear(table) #:nodoc:
195
+ table.clear
196
+ 256.times do |i|
197
+ table[i.chr] = i
198
+ end
181
199
 
182
- result
183
- end
184
-
185
- private
200
+ table[CLEARTABLE] = CLEARTABLE
201
+ table[EOD] = EOD
186
202
 
187
- def clear(table) #:nodoc:
188
- table.clear
189
- 256.times do |i|
190
- table[i.chr] = i
203
+ table
204
+ end
191
205
  end
192
-
193
- table[CLEARTABLE] = CLEARTABLE
194
- table[EOD] = EOD
195
-
196
- table
197
- end
198
-
206
+
199
207
  end
200
- end
201
208
  end
202
-