nokogiri 1.4.3.1-java → 1.5.0-java

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 (231) hide show
  1. data/.gemtest +0 -0
  2. data/CHANGELOG.ja.rdoc +113 -0
  3. data/CHANGELOG.rdoc +113 -1
  4. data/Manifest.txt +72 -68
  5. data/README.ja.rdoc +4 -4
  6. data/README.rdoc +31 -7
  7. data/Rakefile +110 -132
  8. data/bin/nokogiri +7 -3
  9. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  10. data/ext/java/nokogiri/HtmlDocument.java +119 -0
  11. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  12. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  13. data/ext/java/nokogiri/HtmlSaxParserContext.java +259 -0
  14. data/ext/java/nokogiri/NokogiriService.java +590 -0
  15. data/ext/java/nokogiri/XmlAttr.java +180 -0
  16. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  17. data/ext/java/nokogiri/XmlCdata.java +84 -0
  18. data/ext/java/nokogiri/XmlComment.java +86 -0
  19. data/ext/java/nokogiri/XmlDocument.java +519 -0
  20. data/ext/java/nokogiri/XmlDocumentFragment.java +223 -0
  21. data/ext/java/nokogiri/XmlDtd.java +469 -0
  22. data/ext/java/nokogiri/XmlElement.java +195 -0
  23. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  24. data/ext/java/nokogiri/XmlElementDecl.java +152 -0
  25. data/ext/java/nokogiri/XmlEntityDecl.java +162 -0
  26. data/ext/java/nokogiri/XmlEntityReference.java +97 -0
  27. data/ext/java/nokogiri/XmlNamespace.java +183 -0
  28. data/ext/java/nokogiri/XmlNode.java +1378 -0
  29. data/ext/java/nokogiri/XmlNodeSet.java +267 -0
  30. data/ext/java/nokogiri/XmlProcessingInstruction.java +99 -0
  31. data/ext/java/nokogiri/XmlReader.java +408 -0
  32. data/ext/java/nokogiri/XmlRelaxng.java +144 -0
  33. data/ext/java/nokogiri/XmlSaxParserContext.java +367 -0
  34. data/ext/java/nokogiri/XmlSaxPushParser.java +184 -0
  35. data/ext/java/nokogiri/XmlSchema.java +324 -0
  36. data/ext/java/nokogiri/XmlSyntaxError.java +119 -0
  37. data/ext/java/nokogiri/XmlText.java +119 -0
  38. data/ext/java/nokogiri/XmlXpathContext.java +199 -0
  39. data/ext/java/nokogiri/XsltStylesheet.java +197 -0
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +204 -0
  41. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  42. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +86 -0
  43. data/ext/java/nokogiri/internals/NokogiriHandler.java +327 -0
  44. data/ext/java/nokogiri/internals/NokogiriHelpers.java +639 -0
  45. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +167 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +130 -0
  47. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +74 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  49. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +79 -0
  50. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +141 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +73 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +67 -0
  53. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +86 -0
  54. data/ext/java/nokogiri/internals/ParserContext.java +276 -0
  55. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  56. data/ext/java/nokogiri/internals/ReaderNode.java +531 -0
  57. data/ext/java/nokogiri/internals/SaveContextVisitor.java +567 -0
  58. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +76 -0
  59. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  60. data/ext/java/nokogiri/internals/XmlDomParser.java +76 -0
  61. data/ext/java/nokogiri/internals/XmlDomParserContext.java +244 -0
  62. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  63. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  64. data/ext/nokogiri/depend +358 -32
  65. data/ext/nokogiri/extconf.rb +10 -6
  66. data/ext/nokogiri/nokogiri.c +23 -3
  67. data/ext/nokogiri/nokogiri.h +7 -2
  68. data/ext/nokogiri/xml_document.c +9 -0
  69. data/ext/nokogiri/xml_dtd.c +2 -2
  70. data/ext/nokogiri/xml_io.c +32 -7
  71. data/ext/nokogiri/xml_node.c +45 -25
  72. data/ext/nokogiri/xml_node_set.c +1 -1
  73. data/ext/nokogiri/xml_relax_ng.c +0 -7
  74. data/ext/nokogiri/xml_sax_parser.c +14 -7
  75. data/ext/nokogiri/xml_sax_parser_context.c +40 -0
  76. data/ext/nokogiri/xml_xpath_context.c +33 -2
  77. data/ext/nokogiri/xslt_stylesheet.c +128 -6
  78. data/lib/isorelax.jar +0 -0
  79. data/lib/jing.jar +0 -0
  80. data/lib/nekodtd.jar +0 -0
  81. data/lib/nekohtml.jar +0 -0
  82. data/lib/nokogiri/css/parser.rb +665 -70
  83. data/lib/nokogiri/css/parser.y +3 -1
  84. data/lib/nokogiri/css/parser_extras.rb +91 -0
  85. data/lib/nokogiri/css/tokenizer.rb +148 -3
  86. data/lib/nokogiri/css/tokenizer.rex +1 -1
  87. data/lib/nokogiri/css/xpath_visitor.rb +15 -7
  88. data/lib/nokogiri/css.rb +5 -3
  89. data/lib/nokogiri/decorators/slop.rb +5 -3
  90. data/lib/nokogiri/html/document.rb +142 -19
  91. data/lib/nokogiri/html/document_fragment.rb +19 -17
  92. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  93. data/lib/nokogiri/html/sax/parser.rb +6 -2
  94. data/lib/nokogiri/html.rb +1 -0
  95. data/lib/nokogiri/nokogiri.jar +0 -0
  96. data/lib/nokogiri/version.rb +76 -26
  97. data/lib/nokogiri/xml/attribute_decl.rb +1 -1
  98. data/lib/nokogiri/xml/builder.rb +7 -0
  99. data/lib/nokogiri/xml/document.rb +43 -2
  100. data/lib/nokogiri/xml/document_fragment.rb +16 -2
  101. data/lib/nokogiri/xml/dtd.rb +12 -1
  102. data/lib/nokogiri/xml/element_decl.rb +1 -1
  103. data/lib/nokogiri/xml/entity_decl.rb +1 -1
  104. data/lib/nokogiri/xml/node/save_options.rb +20 -1
  105. data/lib/nokogiri/xml/node.rb +198 -78
  106. data/lib/nokogiri/xml/node_set.rb +10 -3
  107. data/lib/nokogiri/xml/parse_options.rb +8 -0
  108. data/lib/nokogiri/xml/reader.rb +42 -6
  109. data/lib/nokogiri/xml/sax/document.rb +4 -2
  110. data/lib/nokogiri/xml/schema.rb +7 -1
  111. data/lib/nokogiri/xslt/stylesheet.rb +1 -1
  112. data/lib/nokogiri/xslt.rb +9 -5
  113. data/lib/nokogiri.rb +19 -25
  114. data/lib/xercesImpl.jar +0 -0
  115. data/nokogiri_help_responses.md +40 -0
  116. data/tasks/cross_compile.rb +130 -136
  117. data/tasks/nokogiri.org.rb +18 -0
  118. data/tasks/test.rb +2 -2
  119. data/test/css/test_parser.rb +29 -18
  120. data/test/css/test_tokenizer.rb +8 -0
  121. data/test/decorators/test_slop.rb +16 -0
  122. data/test/files/encoding.html +82 -0
  123. data/test/files/encoding.xhtml +84 -0
  124. data/test/files/metacharset.html +10 -0
  125. data/test/files/noencoding.html +47 -0
  126. data/test/helper.rb +5 -1
  127. data/test/html/sax/test_parser.rb +65 -3
  128. data/test/html/test_document.rb +75 -1
  129. data/test/html/test_document_encoding.rb +61 -0
  130. data/test/html/test_document_fragment.rb +50 -5
  131. data/test/html/test_element_description.rb +4 -2
  132. data/test/html/test_node.rb +9 -0
  133. data/test/test_memory_leak.rb +20 -35
  134. data/test/test_nokogiri.rb +14 -20
  135. data/test/test_reader.rb +23 -6
  136. data/test/test_xslt_transforms.rb +6 -2
  137. data/test/xml/node/test_save_options.rb +10 -2
  138. data/test/xml/sax/test_parser.rb +39 -8
  139. data/test/xml/sax/test_parser_context.rb +50 -0
  140. data/test/xml/sax/test_push_parser.rb +18 -1
  141. data/test/xml/test_attribute_decl.rb +7 -3
  142. data/test/xml/test_builder.rb +17 -0
  143. data/test/xml/test_document.rb +34 -5
  144. data/test/xml/test_document_fragment.rb +14 -2
  145. data/test/xml/test_dtd.rb +28 -3
  146. data/test/xml/test_element_content.rb +1 -1
  147. data/test/xml/test_element_decl.rb +1 -1
  148. data/test/xml/test_entity_decl.rb +12 -10
  149. data/test/xml/test_namespace.rb +7 -5
  150. data/test/xml/test_node.rb +65 -13
  151. data/test/xml/test_node_reparenting.rb +72 -31
  152. data/test/xml/test_node_set.rb +57 -0
  153. data/test/xml/test_schema.rb +5 -0
  154. data/test/xml/test_xpath.rb +32 -0
  155. data/test/xslt/test_custom_functions.rb +94 -0
  156. data/test/xslt/test_exception_handling.rb +37 -0
  157. metadata +512 -517
  158. data/deps.rip +0 -5
  159. data/ext/nokogiri/libcharset-1.dll +0 -0
  160. data/ext/nokogiri/libexslt.dll +0 -0
  161. data/ext/nokogiri/libiconv-2.dll +0 -0
  162. data/ext/nokogiri/libxml2.dll +0 -0
  163. data/ext/nokogiri/libxslt.dll +0 -0
  164. data/ext/nokogiri/zlib1.dll +0 -0
  165. data/lib/nokogiri/css/generated_parser.rb +0 -676
  166. data/lib/nokogiri/css/generated_tokenizer.rb +0 -146
  167. data/lib/nokogiri/ffi/encoding_handler.rb +0 -42
  168. data/lib/nokogiri/ffi/html/document.rb +0 -28
  169. data/lib/nokogiri/ffi/html/element_description.rb +0 -81
  170. data/lib/nokogiri/ffi/html/entity_lookup.rb +0 -16
  171. data/lib/nokogiri/ffi/html/sax/parser_context.rb +0 -38
  172. data/lib/nokogiri/ffi/io_callbacks.rb +0 -42
  173. data/lib/nokogiri/ffi/libxml.rb +0 -411
  174. data/lib/nokogiri/ffi/structs/common_node.rb +0 -38
  175. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +0 -24
  176. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +0 -13
  177. data/lib/nokogiri/ffi/structs/xml_alloc.rb +0 -16
  178. data/lib/nokogiri/ffi/structs/xml_attr.rb +0 -19
  179. data/lib/nokogiri/ffi/structs/xml_attribute.rb +0 -27
  180. data/lib/nokogiri/ffi/structs/xml_buffer.rb +0 -16
  181. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +0 -11
  182. data/lib/nokogiri/ffi/structs/xml_document.rb +0 -117
  183. data/lib/nokogiri/ffi/structs/xml_dtd.rb +0 -28
  184. data/lib/nokogiri/ffi/structs/xml_element.rb +0 -26
  185. data/lib/nokogiri/ffi/structs/xml_element_content.rb +0 -17
  186. data/lib/nokogiri/ffi/structs/xml_entity.rb +0 -32
  187. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +0 -12
  188. data/lib/nokogiri/ffi/structs/xml_node.rb +0 -28
  189. data/lib/nokogiri/ffi/structs/xml_node_set.rb +0 -53
  190. data/lib/nokogiri/ffi/structs/xml_notation.rb +0 -11
  191. data/lib/nokogiri/ffi/structs/xml_ns.rb +0 -15
  192. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +0 -19
  193. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +0 -14
  194. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +0 -51
  195. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +0 -124
  196. data/lib/nokogiri/ffi/structs/xml_schema.rb +0 -13
  197. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +0 -31
  198. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +0 -12
  199. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +0 -38
  200. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +0 -35
  201. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +0 -20
  202. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +0 -13
  203. data/lib/nokogiri/ffi/weak_bucket.rb +0 -40
  204. data/lib/nokogiri/ffi/xml/attr.rb +0 -41
  205. data/lib/nokogiri/ffi/xml/attribute_decl.rb +0 -27
  206. data/lib/nokogiri/ffi/xml/cdata.rb +0 -19
  207. data/lib/nokogiri/ffi/xml/comment.rb +0 -18
  208. data/lib/nokogiri/ffi/xml/document.rb +0 -166
  209. data/lib/nokogiri/ffi/xml/document_fragment.rb +0 -21
  210. data/lib/nokogiri/ffi/xml/dtd.rb +0 -67
  211. data/lib/nokogiri/ffi/xml/element_content.rb +0 -43
  212. data/lib/nokogiri/ffi/xml/element_decl.rb +0 -19
  213. data/lib/nokogiri/ffi/xml/entity_decl.rb +0 -36
  214. data/lib/nokogiri/ffi/xml/entity_reference.rb +0 -19
  215. data/lib/nokogiri/ffi/xml/namespace.rb +0 -44
  216. data/lib/nokogiri/ffi/xml/node.rb +0 -554
  217. data/lib/nokogiri/ffi/xml/node_set.rb +0 -149
  218. data/lib/nokogiri/ffi/xml/processing_instruction.rb +0 -20
  219. data/lib/nokogiri/ffi/xml/reader.rb +0 -236
  220. data/lib/nokogiri/ffi/xml/relax_ng.rb +0 -85
  221. data/lib/nokogiri/ffi/xml/sax/parser.rb +0 -135
  222. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +0 -67
  223. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +0 -51
  224. data/lib/nokogiri/ffi/xml/schema.rb +0 -109
  225. data/lib/nokogiri/ffi/xml/syntax_error.rb +0 -98
  226. data/lib/nokogiri/ffi/xml/text.rb +0 -18
  227. data/lib/nokogiri/ffi/xml/xpath.rb +0 -9
  228. data/lib/nokogiri/ffi/xml/xpath_context.rb +0 -148
  229. data/lib/nokogiri/ffi/xslt/stylesheet.rb +0 -53
  230. data/lib/nokogiri/version_warning.rb +0 -14
  231. data/test/ffi/test_document.rb +0 -35
@@ -0,0 +1,411 @@
1
+ /**
2
+ * (The MIT License)
3
+ *
4
+ * Copyright (c) 2008 - 2011:
5
+ *
6
+ * * {Aaron Patterson}[http://tenderlovemaking.com]
7
+ * * {Mike Dalessio}[http://mike.daless.io]
8
+ * * {Charles Nutter}[http://blog.headius.com/]
9
+ * * {Sergio Arbeo}[http://www.serabe.com/]
10
+ * * {Patrick Mahoney}[http://polycrystal.org/]
11
+ * * {Yoko Harada}[http://yokolet.blogspot.com/]
12
+ *
13
+ * Permission is hereby granted, free of charge, to any person obtaining
14
+ * a copy of this software and associated documentation files (the
15
+ * 'Software'), to deal in the Software without restriction, including
16
+ * without limitation the rights to use, copy, modify, merge, publish,
17
+ * distribute, sublicense, and/or sell copies of the Software, and to
18
+ * permit persons to whom the Software is furnished to do so, subject to
19
+ * the following conditions:
20
+ *
21
+ * The above copyright notice and this permission notice shall be
22
+ * included in all copies or substantial portions of the Software.
23
+ *
24
+ * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
25
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
28
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
+ */
32
+
33
+ package nokogiri.internals;
34
+
35
+ import java.io.IOException;
36
+ import java.io.InputStream;
37
+ import java.nio.channels.ClosedChannelException;
38
+ import java.util.ArrayList;
39
+
40
+
41
+ /**
42
+ * Implements a "push" InputStream. An owner thread create an
43
+ * InputStream and passes it to a second thread. The owner thread
44
+ * calls PushInputStream.write() to write data to the stream. The
45
+ * second thread calls PushInputStream.read() and other InputStream
46
+ * methods.
47
+ *
48
+ * You should ensure that only one thread write to, and only one
49
+ * thread reads to, this stream, though nothing enforces this
50
+ * strictly.
51
+ */
52
+ public class PushInputStream extends InputStream {
53
+ /**
54
+ * Current position in the stream relative to the start of the
55
+ * buffer.
56
+ */
57
+ protected int pos;
58
+
59
+ /**
60
+ * Current mark position, or -1 if there is no mark.
61
+ */
62
+ protected int mark;
63
+
64
+ protected int readlimit;
65
+
66
+ /**
67
+ * State is open or closed.
68
+ */
69
+ protected boolean isOpen;
70
+
71
+ protected Buffer buffer;
72
+
73
+ public PushInputStream() {
74
+ pos = 0;
75
+ mark = -1;
76
+ readlimit = -1;
77
+ isOpen = true;
78
+
79
+ buffer = new Buffer(512);
80
+ }
81
+
82
+ protected synchronized void ensureOpen() throws IOException {
83
+ if (!isOpen) {
84
+ throw new ClosedChannelException();
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Write data that can be read from the stream.
90
+ */
91
+ public synchronized void write(byte[] b) {
92
+ if (buffer == null) System.out.println("BUFFER IS NULL");
93
+ if (b == null) System.out.println("BYTE ARRAY IS NILL");
94
+ buffer.put(b);
95
+ notifyAll(); // notify readers waiting
96
+ }
97
+
98
+ /**
99
+ * Write data and then wait until all the data has been read
100
+ * (waits until the thread reading from this stream is blocked in
101
+ * a read()).
102
+ */
103
+ public synchronized void writeAndWaitForRead(byte[] b) throws IOException {
104
+ ensureOpen();
105
+ write(b);
106
+ for (;;) {
107
+ try {
108
+ wait();
109
+ break;
110
+ } catch (InterruptedException e) {
111
+ // continue waiting
112
+ }
113
+ }
114
+ }
115
+
116
+ /*
117
+ *------------------------------------------------------------
118
+ * InputStream methods
119
+ *------------------------------------------------------------
120
+ */
121
+
122
+ /**
123
+ * @see InputStream.available()
124
+ */
125
+ @Override
126
+ public synchronized int available() throws IOException {
127
+ ensureOpen();
128
+ return buffer.size() - pos;
129
+ }
130
+
131
+ int nClose = 0;
132
+ /**
133
+ * @see InputStream.close()
134
+ */
135
+ @Override
136
+ public synchronized void close() throws IOException {
137
+ if (!isOpen) return;
138
+ isOpen = false;
139
+ buffer = null;
140
+ notifyAll();
141
+ }
142
+
143
+ /**
144
+ * @see InputStream.mark()
145
+ */
146
+ @Override
147
+ public synchronized void mark(int readlimit) {
148
+ this.mark = pos;
149
+ this.readlimit = readlimit;
150
+ }
151
+
152
+ /**
153
+ * Mark the current position in this stream. Supported by
154
+ * PushInputStream.
155
+ *
156
+ * @see InputStream.markSupported()
157
+ */
158
+ @Override
159
+ public synchronized boolean markSupported() {
160
+ return true;
161
+ }
162
+
163
+ /**
164
+ * @see InputStream.read()
165
+ */
166
+ @Override
167
+ public synchronized int read() throws IOException {
168
+ ensureOpen();
169
+ byte[] b = new byte[1];
170
+ read(b, 0, 1);
171
+ return (int) b[0];
172
+ }
173
+
174
+ /**
175
+ * @see InputStream.read(byte[])
176
+ */
177
+ @Override
178
+ public synchronized int read(byte[] b) throws IOException {
179
+ ensureOpen();
180
+ return read(b, 0, b.length);
181
+ }
182
+
183
+ protected synchronized boolean markIsValid() {
184
+ return (mark >= 0 && pos < mark+readlimit);
185
+ }
186
+
187
+ /**
188
+ * @see InputStream.read(byte[], int, int)
189
+ */
190
+ @Override
191
+ public synchronized int read(byte[] b, int off, int len) throws IOException {
192
+ while (isOpen && available() == 0) {
193
+ /* block until data available */
194
+ try {
195
+ notifyAll(); // notify writers waiting
196
+ wait();
197
+ } catch (InterruptedException e) {
198
+ // continue waiting
199
+ }
200
+ }
201
+
202
+ if (!isOpen) {
203
+ return -1;
204
+ }
205
+
206
+ int readLen = Math.min(available(), len);
207
+
208
+ buffer.get(pos, readLen, b, off);
209
+ pos += readLen;
210
+
211
+ int reduce;
212
+
213
+ if (markIsValid()) {
214
+ reduce = mark;
215
+ } else {
216
+ reduce = pos;
217
+ }
218
+
219
+ buffer.truncateFromStart(buffer.size - reduce);
220
+ pos -= reduce;
221
+ mark -= reduce;
222
+ if (mark < 0) mark = -1; // don't wrap mark around?
223
+
224
+ return readLen;
225
+ }
226
+
227
+ /**
228
+ * @see InputStream.reset()
229
+ */
230
+ @Override
231
+ public synchronized void reset() throws IOException {
232
+ ensureOpen();
233
+ if (markIsValid())
234
+ pos = mark;
235
+ }
236
+
237
+ /**
238
+ * @see InputStream.skip()
239
+ */
240
+ @Override
241
+ public synchronized long skip(long n) throws IOException {
242
+ ensureOpen();
243
+ pos += n;
244
+ return n;
245
+ }
246
+
247
+ /*
248
+ *------------------------------------------------------------
249
+ * Data Buffer
250
+ *------------------------------------------------------------
251
+ */
252
+
253
+ public static class Block {
254
+ protected byte[] data;
255
+
256
+ public Block(int size) {
257
+ data = new byte[size];
258
+ }
259
+
260
+ public void copyIn(byte[] src, int srcPos, int destPos, int length) {
261
+ System.arraycopy(src, srcPos, data, destPos, length);
262
+ }
263
+
264
+ public void copyOut(int srcPos, byte[] dest, int destPos, int length) {
265
+ System.arraycopy(data, srcPos, dest, destPos, length);
266
+ }
267
+ }
268
+
269
+ public static class BlockList extends ArrayList<Block> {
270
+ public BlockList() {
271
+ super();
272
+ }
273
+
274
+ @Override
275
+ public void removeRange(int fromIndex, int toIndex) {
276
+ super.removeRange(fromIndex, toIndex);
277
+ }
278
+ }
279
+
280
+ public static class Buffer {
281
+ protected int blockSize;
282
+ protected BlockList blocks;
283
+
284
+ /**
285
+ * Offset (position) to the first logical byte in the buffer.
286
+ */
287
+ protected int offset;
288
+
289
+ /**
290
+ * Logical size of the buffer.
291
+ */
292
+ protected int size;
293
+
294
+ public Buffer(int blockSize) {
295
+ this.blockSize = blockSize;
296
+ this.blocks = new BlockList();
297
+ this.offset = 0;
298
+ this.size = 0;
299
+ }
300
+
301
+ public int size() {
302
+ return size;
303
+ }
304
+
305
+ protected class Segment {
306
+ /**
307
+ * Block index.
308
+ */
309
+ protected int block;
310
+
311
+ /**
312
+ * Offset into the block.
313
+ */
314
+ protected int off;
315
+
316
+ /**
317
+ * Length of segment.
318
+ */
319
+ protected int len;
320
+
321
+ /**
322
+ * Calculate the block number and block offset given a position.
323
+ */
324
+ protected Segment(int pos) {
325
+ int absPos = offset + pos;
326
+ block = (int) (absPos / blockSize);
327
+ off = (int) (absPos % blockSize);
328
+ len = -1;
329
+ }
330
+ }
331
+
332
+ protected Segment[] accessList(int pos, int size) {
333
+ Segment start = new Segment(pos);
334
+ Segment end = new Segment(pos + size);
335
+ int nBlocks = end.block - start.block + 1;
336
+ Segment[] segs = new Segment[nBlocks];
337
+
338
+ start.len = Math.min(size, blockSize - start.off);
339
+ segs[0] = start;
340
+ int currPos = pos + start.len;
341
+ int currSize = start.len;
342
+ for (int i = 1; i < nBlocks; i++) {
343
+ Segment seg = new Segment(currPos);
344
+ seg.len = Math.min(blockSize, size - currSize);
345
+ segs[i] = seg;
346
+ currPos += seg.len;
347
+ currSize += seg.len;
348
+ }
349
+
350
+ return segs;
351
+ }
352
+
353
+ protected void ensureCapacity(int pos) {
354
+ Segment seg = new Segment(pos-1);
355
+
356
+ while (blocks.size() < (seg.block + 1))
357
+ blocks.add(new Block(blockSize));
358
+ }
359
+
360
+ public void put(byte b) {
361
+ byte[] buf = new byte[1];
362
+ buf[0] = b;
363
+ put(buf);
364
+ }
365
+
366
+ public void put(byte[] b) {
367
+ ensureCapacity(size + b.length);
368
+ Segment[] segs = accessList(size, b.length);
369
+
370
+ int off = 0;
371
+ for (int i = 0; i < segs.length; i++) {
372
+ Block block = blocks.get(segs[i].block);
373
+ block.copyIn(b, off, segs[i].off, segs[i].len);
374
+ }
375
+
376
+ size += b.length;
377
+ }
378
+
379
+ public byte[] get(int pos, int len) {
380
+ byte[] b = new byte[len];
381
+ get(pos, len, b, 0);
382
+ return b;
383
+ }
384
+
385
+ /**
386
+ * Throws IndexOutOfBoundsException.
387
+ */
388
+ public void get(int pos, int len, byte[] b, int off) {
389
+ Segment[] segs = accessList(pos, len);
390
+ for (int i = 0; i < segs.length; i++) {
391
+ Block block = blocks.get(segs[i].block);
392
+ block.copyOut(segs[i].off, b, off, segs[i].len);
393
+ }
394
+ }
395
+
396
+ /**
397
+ * Truncate the buffer to <code>newSize</code> by removing
398
+ * data from the start of the buffer.
399
+ */
400
+ public void truncateFromStart(int newSize) {
401
+ if (newSize > size || newSize < 0)
402
+ throw new RuntimeException("invalid size");
403
+
404
+ Segment newStart = new Segment(size - newSize);
405
+ blocks.removeRange(0, newStart.block);
406
+
407
+ size = newSize;
408
+ offset = newStart.off;
409
+ }
410
+ }
411
+ }