@@ -54,7 +54,7 @@ let escapable_string_parser ~escape ~separator =
5454 let is_separator = Char. ( = ) separator in
5555 let is_escape = Char. ( = ) escape in
5656 let buf = Buffer. create 50 in
57- ( char separator
57+ char separator
5858 *>
5959 let rec loop escaping =
6060 any_char >> = fun x ->
@@ -74,12 +74,25 @@ let escapable_string_parser ~escape ~separator =
7474 Buffer. add_char buf c;
7575 loop escaping
7676 in
77- loop false )
78- < ?> " Escapable string"
77+ loop false
78+ < |> ( return () >> = fun () ->
79+ Buffer. clear buf;
80+ fail " Invalid escapable string" )
81+
82+ let make_sq_string () = escapable_string_parser ~escape: '\\' ~separator: '\' '
83+
84+ let make_dq_string () = escapable_string_parser ~escape: '\\' ~separator: '"'
85+
86+ type string_parsers = {
87+ sq_string : string Angstrom .t ;
88+ dq_string : string Angstrom .t ;
89+ }
90+
91+ let make_string_parsers () = { sq_string = make_sq_string () ; dq_string = make_dq_string () }
7992
8093let boundary_parsers tag =
81- let sq_string = escapable_string_parser ~escape: '\\' ~separator: '\' ' in
82- let dq_string = escapable_string_parser ~escape: '\\' ~separator: '"' in
94+ let sq_string = make_sq_string () in
95+ let dq_string = make_dq_string () in
8396 let quoted_string =
8497 peek_char >> = function
8598 | Some '\' ' -> sq_string
@@ -96,7 +109,8 @@ let boundary_parsers tag =
96109 let ends = string " </" *> mlws *> string tag < * mlws < * char '>' in
97110 starts, ends
98111
99- let block_parser (starts , ends ) buf ~f =
112+ let block_parser boundaries buf ~f =
113+ let starts, ends = boundaries () in
100114 let line =
101115 take_remaining < * advance 1 >> | fun src_line ->
102116 Buffer. add_string buf src_line;
0 commit comments