| 36 |
| Some x -> curr := x |
| Some x -> curr := x |
| 37 |
| None -> () in |
| None -> () in |
| 38 |
|
|
| 39 |
|
let txt = Buffer.create 1024 in |
| 40 |
|
|
| 41 |
let rec parse_elt name att = |
let rec parse_elt name att = |
| 42 |
let att = List.map (fun (l,v) -> Types.LabelPool.mk l, string v nil) att in |
let att = List.map (fun (l,v) -> Types.LabelPool.mk l, string v nil) att in |
| 43 |
let att = SortedMap.from_list (fun _ _ -> assert false) att in |
let att = SortedMap.from_list (fun _ _ -> assert false) att in |
| 44 |
let child = parse_seq true in |
let child = parse_seq () in |
| 45 |
|
|
| 46 |
let elt = Xml |
let elt = Xml |
| 47 |
(Atom (Types.AtomPool.mk name), |
(Atom (Types.AtomPool.mk name), |
| 53 |
elt |
elt |
| 54 |
|
|
| 55 |
|
|
| 56 |
and parse_seq dropws = |
and dump_txt q = |
| 57 |
|
let data = Buffer.contents txt in |
| 58 |
|
Buffer.clear txt; |
| 59 |
|
if (is_ws data) then q () else string data (q ()) |
| 60 |
|
|
| 61 |
|
and parse_seq () = |
| 62 |
match !curr with |
match !curr with |
| 63 |
| E_start_tag (name,att,_) -> |
| E_start_tag (name,att,_) -> |
| 64 |
get (); |
get (); |
| 65 |
|
dump_txt (fun () -> |
| 66 |
let e1 = parse_elt name att in |
let e1 = parse_elt name att in |
| 67 |
let rest = parse_seq true in |
let rest = parse_seq () in |
| 68 |
Pair (e1, rest) |
Pair (e1, rest) |
| 69 |
|
) |
| 70 |
| E_char_data data -> |
| E_char_data data -> |
| 71 |
get (); |
get (); |
| 72 |
if dropws && (is_ws data) |
Buffer.add_string txt data; |
| 73 |
then parse_seq true |
parse_seq () |
|
else string data (parse_seq false) |
|
| 74 |
| E_end_tag (_,_) -> |
| E_end_tag (_,_) -> |
| 75 |
nil |
dump_txt (fun () -> nil) |
| 76 |
| _ -> failwith "Expect start_tag, char_data, or end_tag" |
| _ -> failwith "Expect start_tag, char_data, or end_tag" |
| 77 |
|
|
| 78 |
and parse_doc () = |
and parse_doc () = |