diff options
Diffstat (limited to 'stdlib/lexing.ml')
-rw-r--r-- | stdlib/lexing.ml | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/stdlib/lexing.ml b/stdlib/lexing.ml index 53748ad86..d2231fbe9 100644 --- a/stdlib/lexing.ml +++ b/stdlib/lexing.ml @@ -29,7 +29,7 @@ let dummy_pos = { type lexbuf = { refill_buff : lexbuf -> unit; - mutable lex_buffer : string; + mutable lex_buffer : bytes; mutable lex_buffer_len : int; mutable lex_abs_pos : int; mutable lex_start_pos : int; @@ -81,7 +81,7 @@ let new_engine tbl state buf = let lex_refill read_fun aux_buffer lexbuf = let read = - read_fun aux_buffer (String.length aux_buffer) in + read_fun aux_buffer (Bytes.length aux_buffer) in let n = if read > 0 then read @@ -90,16 +90,16 @@ let lex_refill read_fun aux_buffer lexbuf = <-------|---------------------|-----------> | junk | valid data | junk | ^ ^ ^ ^ - 0 start_pos buffer_end String.length buffer + 0 start_pos buffer_end Bytes.length buffer *) - if lexbuf.lex_buffer_len + n > String.length lexbuf.lex_buffer then begin + if lexbuf.lex_buffer_len + n > Bytes.length lexbuf.lex_buffer then begin (* There is not enough space at the end of the buffer *) if lexbuf.lex_buffer_len - lexbuf.lex_start_pos + n - <= String.length lexbuf.lex_buffer + <= Bytes.length lexbuf.lex_buffer then begin (* But there is enough space if we reclaim the junk at the beginning of the buffer *) - String.blit lexbuf.lex_buffer lexbuf.lex_start_pos + Bytes.blit lexbuf.lex_buffer lexbuf.lex_start_pos lexbuf.lex_buffer 0 (lexbuf.lex_buffer_len - lexbuf.lex_start_pos) end else begin @@ -107,12 +107,12 @@ let lex_refill read_fun aux_buffer lexbuf = space since n <= String.length aux_buffer <= String.length buffer. Watch out for string length overflow, though. *) let newlen = - min (2 * String.length lexbuf.lex_buffer) Sys.max_string_length in + min (2 * Bytes.length lexbuf.lex_buffer) Sys.max_string_length in if lexbuf.lex_buffer_len - lexbuf.lex_start_pos + n > newlen then failwith "Lexing.lex_refill: cannot grow buffer"; - let newbuf = String.create newlen in + let newbuf = Bytes.create newlen in (* Copy the valid data to the beginning of the new buffer *) - String.blit lexbuf.lex_buffer lexbuf.lex_start_pos + Bytes.blit lexbuf.lex_buffer lexbuf.lex_start_pos newbuf 0 (lexbuf.lex_buffer_len - lexbuf.lex_start_pos); lexbuf.lex_buffer <- newbuf @@ -133,9 +133,7 @@ let lex_refill read_fun aux_buffer lexbuf = done end; (* There is now enough space at the end of the buffer *) - String.blit aux_buffer 0 - lexbuf.lex_buffer lexbuf.lex_buffer_len - n; + Bytes.blit aux_buffer 0 lexbuf.lex_buffer lexbuf.lex_buffer_len n; lexbuf.lex_buffer_len <- lexbuf.lex_buffer_len + n let zero_pos = { @@ -146,8 +144,8 @@ let zero_pos = { };; let from_function f = - { refill_buff = lex_refill f (String.create 512); - lex_buffer = String.create 1024; + { refill_buff = lex_refill f (Bytes.create 512); + lex_buffer = Bytes.create 1024; lex_buffer_len = 0; lex_abs_pos = 0; lex_start_pos = 0; @@ -165,7 +163,8 @@ let from_channel ic = let from_string s = { refill_buff = (fun lexbuf -> lexbuf.lex_eof_reached <- true); - lex_buffer = s ^ ""; + lex_buffer = Bytes.of_string s; (* have to make a copy for compatibility + with unsafe-string mode *) lex_buffer_len = String.length s; lex_abs_pos = 0; lex_start_pos = 0; @@ -180,37 +179,31 @@ let from_string s = let lexeme lexbuf = let len = lexbuf.lex_curr_pos - lexbuf.lex_start_pos in - let s = String.create len in - String.unsafe_blit lexbuf.lex_buffer lexbuf.lex_start_pos s 0 len; - s + Bytes.sub_string lexbuf.lex_buffer lexbuf.lex_start_pos len let sub_lexeme lexbuf i1 i2 = let len = i2-i1 in - let s = String.create len in - String.unsafe_blit lexbuf.lex_buffer i1 s 0 len; - s + Bytes.sub_string lexbuf.lex_buffer i1 len let sub_lexeme_opt lexbuf i1 i2 = if i1 >= 0 then begin let len = i2-i1 in - let s = String.create len in - String.unsafe_blit lexbuf.lex_buffer i1 s 0 len; - Some s + Some (Bytes.sub_string lexbuf.lex_buffer i1 len) end else begin None end -let sub_lexeme_char lexbuf i = lexbuf.lex_buffer.[i] +let sub_lexeme_char lexbuf i = Bytes.get lexbuf.lex_buffer i let sub_lexeme_char_opt lexbuf i = if i >= 0 then - Some lexbuf.lex_buffer.[i] + Some (Bytes.get lexbuf.lex_buffer i) else None let lexeme_char lexbuf i = - String.get lexbuf.lex_buffer (lexbuf.lex_start_pos + i) + Bytes.get lexbuf.lex_buffer (lexbuf.lex_start_pos + i) let lexeme_start lexbuf = lexbuf.lex_start_p.pos_cnum;; let lexeme_end lexbuf = lexbuf.lex_curr_p.pos_cnum;; |