This commit is contained in:
parent
aa2ff7b2f0
commit
2f3113f55d
11742 changed files with 1223940 additions and 0 deletions
67
unikernel/duniverse/ocaml-re/lib/parse_buffer.ml
Normal file
67
unikernel/duniverse/ocaml-re/lib/parse_buffer.ml
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
type t =
|
||||
{ str : string
|
||||
; mutable pos : int
|
||||
}
|
||||
|
||||
exception Parse_error
|
||||
|
||||
let create str = { str; pos = 0 }
|
||||
let unget t = t.pos <- t.pos - 1
|
||||
let junk t = t.pos <- t.pos + 1
|
||||
let eos t = t.pos = String.length t.str
|
||||
let test t c = (not (eos t)) && t.str.[t.pos] = c
|
||||
|
||||
let test2 t c c' =
|
||||
t.pos + 1 < String.length t.str && t.str.[t.pos] = c && t.str.[t.pos + 1] = c'
|
||||
;;
|
||||
|
||||
let accept t c =
|
||||
let r = test t c in
|
||||
if r then t.pos <- t.pos + 1;
|
||||
r
|
||||
;;
|
||||
|
||||
let get t =
|
||||
let r = t.str.[t.pos] in
|
||||
t.pos <- t.pos + 1;
|
||||
r
|
||||
;;
|
||||
|
||||
let accept_s t s' =
|
||||
let len = String.length s' in
|
||||
try
|
||||
for j = 0 to len - 1 do
|
||||
(* CR-someday rgrinberg: stop relying on bound checks *)
|
||||
try if s'.[j] <> t.str.[t.pos + j] then raise_notrace Exit with
|
||||
| _ -> raise_notrace Exit
|
||||
done;
|
||||
t.pos <- t.pos + len;
|
||||
true
|
||||
with
|
||||
| Exit -> false
|
||||
;;
|
||||
|
||||
let rec integer' t i =
|
||||
if eos t
|
||||
then Some i
|
||||
else (
|
||||
match get t with
|
||||
| '0' .. '9' as d ->
|
||||
let i' = (10 * i) + (Char.code d - Char.code '0') in
|
||||
if i' < i then raise Parse_error;
|
||||
integer' t i'
|
||||
| _ ->
|
||||
unget t;
|
||||
Some i)
|
||||
;;
|
||||
|
||||
let integer t =
|
||||
if eos t
|
||||
then None
|
||||
else (
|
||||
match get t with
|
||||
| '0' .. '9' as d -> integer' t (Char.code d - Char.code '0')
|
||||
| _ ->
|
||||
unget t;
|
||||
None)
|
||||
;;
|
||||
Loading…
Add table
Add a link
Reference in a new issue