origami 1.2.7 → 2.0.0

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