1    private@
2    
3    type locale_t = MutPtr
4    
5    public@
6    
7    let strtol (str : CString @restrict
8                str_end : mut ptr MutPtr<CChar> @restrict
9                base : int) : long
10   
11   let strtof (str : CString) (str_end : mut ptr MutPtr<CChar>) : f32
12   
13   let try_parse_long (s : String) (base : u32) =
14       let array = s.to_array<17>
15       let c_string = array.to_c_string
16       let mut str_end = null
17       let n = strtol c_string str_end@mut_ptr base.as<int>
18       if str_end[0] == '\0' then Some n else None
19   
20   object u32
21       def parse (s : String) (base : u32) =
22           let n = try_parse_long s base |> unwrap
23           assert n >= 0
24           n as u32
25   
26       def parse (s : String) = parse s 10
27   
28   object i32
29       def try_parse (s : String) (base : u32) =
30           let maybe_n = try_parse_long s base
31           case maybe_n of
32               Some n -> Some n.as<i32>
33               None -> None
34   
35       def try_parse (s : String) = try_parse s 10
36   
37       def parse (s : String) (base : u32) =
38           let n = try_parse_long s base |> unwrap
39           n as i32
40   
41       def parse (s : String) = parse s 10
42   
43   object f32
44       def try_parse (s : String) =
45           let array = s.to_array<17>
46           let c_string = array.to_c_string
47           let mut str_end = null
48           let x = strtof c_string str_end@mut_ptr
49           if str_end[0] == '\0' then Some x else None
50   
51       def parse (s : String) = try_parse s |> unwrap
52