summaryrefslogtreecommitdiffstats
path: root/stdlib/lexing.ml
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/lexing.ml')
-rw-r--r--stdlib/lexing.ml47
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;;