Source file lexer_utils.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
open Types

let parse_module s = String.sub s 0 (String.length s - 1)

let parse_list_index s =
  String.sub s 1 (String.length s - 2)
  |> int_of_string
  |> (fun i -> List_index i)
  |> Option.some

let parse_align = function
  | "<" -> Left
  | ">" -> Right
  | "^" -> Center
  | "=" -> Pad
  | u -> raise (ValueError ("Unknown alignment '" ^ u ^ "'"))

let parse_fill s =
  match String.length s with
  | 1 -> (Some (parse_align s), None)
  | 2 -> (Some (parse_align (String.sub s 1 1)), Some s.[0])
  | _ -> raise (ValueError "Unexpected alignment string")

let parse_sign = function
  | "+" -> Some Plus
  | "-" -> Some Minus
  | " " -> Some Space
  | u -> raise (ValueError ("Unknown sign '" ^ u ^ "'"))

let parse_width s =
  let zero = if String.get s 0 = '0' then Some () else None in
  let width = Some (int_of_string s) in
  (zero, width)

let parse_grouping_option = function
  | "," -> Some Comma
  | "_" -> Some Underscore
  | u -> raise (ValueError ("Unknown grouping option '" ^ u ^ "'"))

let pasrse_precision s =
  String.sub s 1 (String.length s - 1) |> int_of_string |> Option.some

let parse_type s =
  let type_ =
    match s with
    | "s" -> String
    | "b" -> Int Binary
    | "c" -> Int Char
    | "d" -> Int Decimal
    | "o" -> Int Octal
    | "x" | "X" -> Int Hex
    | "e" | "E" -> Float Scientific
    | "f" | "F" -> Float Fixed
    | "g" | "G" -> Float General
    | "%" -> Float Percentage
    | u -> raise (ValueError ("Unknown format code '" ^ u ^ "'"))
  in
  let upper =
    if String.uppercase_ascii s = s && type_ <> Float Percentage then
      Some ()
    else
      None
  in
  (Some type_, upper)