12
12
13
13
14
14
use std:: str;
15
- use std:: cast;
16
- use std:: vec;
17
15
18
16
// Simple Extensible Binary Markup Language (ebml) reader and writer on a
19
17
// cursor model. See the specification here:
@@ -31,42 +29,9 @@ struct EbmlState {
31
29
data_pos : uint ,
32
30
}
33
31
34
- #[ deriving( Clone ) ]
35
- pub enum EbmlData {
36
- SafeData ( @~[ u8 ] ) ,
37
- UnsafeData ( * u8 , uint )
38
- }
39
-
40
- impl EbmlData {
41
- #[ inline]
42
- pub fn slice < ' a > ( & ' a self , start : uint , end : uint ) -> & ' a [ u8 ] {
43
- match * self {
44
- SafeData ( @ref v) => v. slice ( start, end) ,
45
- UnsafeData ( buf, len) => unsafe {
46
- do vec:: raw:: buf_as_slice ( buf, len) |s| {
47
- cast:: transmute ( s. slice ( start, end) )
48
- }
49
- }
50
- }
51
- }
52
-
53
- #[ inline]
54
- pub fn as_slice < ' a > ( & ' a self ) -> & ' a [ u8 ] {
55
- self . slice ( 0 , self . len ( ) )
56
- }
57
-
58
- #[ inline]
59
- pub fn len ( & self ) -> uint {
60
- match * self {
61
- SafeData ( @ref v) => v. len ( ) ,
62
- UnsafeData ( _, len) => len
63
- }
64
- }
65
- }
66
-
67
32
#[ deriving( Clone ) ]
68
33
pub struct Doc {
69
- data : EbmlData ,
34
+ data : @~ [ u8 ] ,
70
35
start : uint ,
71
36
end : uint ,
72
37
}
@@ -220,28 +185,24 @@ pub mod reader {
220
185
}
221
186
222
187
pub fn Doc ( data : @~[ u8 ] ) -> Doc {
223
- Doc { data : SafeData ( data) , start : 0 u, end : data. len ( ) }
224
- }
225
-
226
- pub fn unsafe_Doc ( buf : * u8 , len : uint ) -> Doc {
227
- Doc { data : UnsafeData ( buf, len) , start : 0 u, end : len }
188
+ Doc { data : data, start : 0 u, end : data. len ( ) }
228
189
}
229
190
230
- pub fn doc_at ( data : & EbmlData , start : uint ) -> TaggedDoc {
231
- let elt_tag = vuint_at ( data. as_slice ( ) , start) ;
232
- let elt_size = vuint_at ( data. as_slice ( ) , elt_tag. next ) ;
191
+ pub fn doc_at ( data : @~ [ u8 ] , start : uint ) -> TaggedDoc {
192
+ let elt_tag = vuint_at ( * data, start) ;
193
+ let elt_size = vuint_at ( * data, elt_tag. next ) ;
233
194
let end = elt_size. next + elt_size. val ;
234
195
TaggedDoc {
235
196
tag : elt_tag. val ,
236
- doc : Doc { data : data. clone ( ) , start : elt_size. next , end : end }
197
+ doc : Doc { data : data, start : elt_size. next , end : end }
237
198
}
238
199
}
239
200
240
201
pub fn maybe_get_doc ( d : Doc , tg : uint ) -> Option < Doc > {
241
202
let mut pos = d. start ;
242
203
while pos < d. end {
243
- let elt_tag = vuint_at ( d. data . as_slice ( ) , pos) ;
244
- let elt_size = vuint_at ( d. data . as_slice ( ) , elt_tag. next ) ;
204
+ let elt_tag = vuint_at ( * d. data , pos) ;
205
+ let elt_size = vuint_at ( * d. data , elt_tag. next ) ;
245
206
pos = elt_size. next + elt_size. val ;
246
207
if elt_tag. val == tg {
247
208
return Some ( Doc { data : d. data , start : elt_size. next ,
@@ -264,8 +225,8 @@ pub mod reader {
264
225
pub fn docs ( d : Doc , it : & fn ( uint , Doc ) -> bool ) -> bool {
265
226
let mut pos = d. start ;
266
227
while pos < d. end {
267
- let elt_tag = vuint_at ( d. data . as_slice ( ) , pos) ;
268
- let elt_size = vuint_at ( d. data . as_slice ( ) , elt_tag. next ) ;
228
+ let elt_tag = vuint_at ( * d. data , pos) ;
229
+ let elt_size = vuint_at ( * d. data , elt_tag. next ) ;
269
230
pos = elt_size. next + elt_size. val ;
270
231
let doc = Doc { data : d. data , start : elt_size. next , end : pos } ;
271
232
if !it ( elt_tag. val , doc) {
@@ -278,8 +239,8 @@ pub mod reader {
278
239
pub fn tagged_docs ( d : Doc , tg : uint , it : & fn ( Doc ) -> bool ) -> bool {
279
240
let mut pos = d. start ;
280
241
while pos < d. end {
281
- let elt_tag = vuint_at ( d. data . as_slice ( ) , pos) ;
282
- let elt_size = vuint_at ( d. data . as_slice ( ) , elt_tag. next ) ;
242
+ let elt_tag = vuint_at ( * d. data , pos) ;
243
+ let elt_size = vuint_at ( * d. data , elt_tag. next ) ;
283
244
pos = elt_size. next + elt_size. val ;
284
245
if elt_tag. val == tg {
285
246
let doc = Doc { data : d. data , start : elt_size. next ,
@@ -299,22 +260,22 @@ pub mod reader {
299
260
300
261
pub fn doc_as_u8 ( d : Doc ) -> u8 {
301
262
assert_eq ! ( d. end, d. start + 1 u) ;
302
- d. data . as_slice ( ) [ d. start ]
263
+ ( * d. data ) [ d. start ]
303
264
}
304
265
305
266
pub fn doc_as_u16 ( d : Doc ) -> u16 {
306
267
assert_eq ! ( d. end, d. start + 2 u) ;
307
- io:: u64_from_be_bytes ( d. data . as_slice ( ) , d. start , 2 u) as u16
268
+ io:: u64_from_be_bytes ( * d. data , d. start , 2 u) as u16
308
269
}
309
270
310
271
pub fn doc_as_u32 ( d : Doc ) -> u32 {
311
272
assert_eq ! ( d. end, d. start + 4 u) ;
312
- io:: u64_from_be_bytes ( d. data . as_slice ( ) , d. start , 4 u) as u32
273
+ io:: u64_from_be_bytes ( * d. data , d. start , 4 u) as u32
313
274
}
314
275
315
276
pub fn doc_as_u64 ( d : Doc ) -> u64 {
316
277
assert_eq ! ( d. end, d. start + 8 u) ;
317
- io:: u64_from_be_bytes ( d. data . as_slice ( ) , d. start , 8 u)
278
+ io:: u64_from_be_bytes ( * d. data , d. start , 8 u)
318
279
}
319
280
320
281
pub fn doc_as_i8 ( d : Doc ) -> i8 { doc_as_u8 ( d) as i8 }
@@ -337,7 +298,8 @@ pub mod reader {
337
298
impl Decoder {
338
299
fn _check_label ( & mut self , lbl : & str ) {
339
300
if self . pos < self . parent . end {
340
- let TaggedDoc { tag : r_tag, doc : r_doc } = doc_at ( & self . parent . data , self . pos ) ;
301
+ let TaggedDoc { tag : r_tag, doc : r_doc } =
302
+ doc_at ( self . parent . data , self . pos ) ;
341
303
342
304
if r_tag == ( EsLabel as uint ) {
343
305
self . pos = r_doc. end ;
@@ -354,7 +316,8 @@ pub mod reader {
354
316
if self . pos >= self . parent . end {
355
317
fail ! ( "no more documents in current node!" ) ;
356
318
}
357
- let TaggedDoc { tag : r_tag, doc : r_doc } = doc_at ( & self . parent . data , self . pos ) ;
319
+ let TaggedDoc { tag : r_tag, doc : r_doc } =
320
+ doc_at ( self . parent . data , self . pos ) ;
358
321
debug ! ( "self.parent=%?-%? self.pos=%? r_tag=%? r_doc=%?-%?" ,
359
322
self . parent. start,
360
323
self . parent. end,
0 commit comments