Skip to content

Commit 2ff24e5

Browse files
authored
Merge pull request #492 from savi-lang/add/string-parse-f64
Add simple `String.parse_f64!` method.
2 parents b426837 + 3ab9917 commit 2ff24e5

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

core/String.savi

+10-1
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@
485485
)
486486
result
487487

488-
:fun parse_i64! // TODO: Use something like Crystal's Char::Reader instead?
488+
:fun parse_i64! I64 // TODO: Use something like Crystal's Char::Reader instead?
489489
output I64 = 0
490490
possible_negation I64 = 1
491491
@each_byte_with_index -> (byte, index |
@@ -498,6 +498,15 @@
498498
)
499499
output * possible_negation
500500

501+
:fun parse_f64! F64 // TODO: Use something like Crystal's Char::Reader instead?
502+
// TODO: Avoid FFI and use a pure Savi `strtod` implementation.
503+
start_pointer = @cstring
504+
end_pointer = CPointer(U8).null
505+
value = _FFI.strtod(start_pointer, stack_address_of_variable end_pointer)
506+
error! if value == 0 && end_pointer.address == start_pointer.address
507+
error! if end_pointer.address != start_pointer.address + @size
508+
value
509+
501510
:fun substring(from USize, to USize = 0) String'iso
502511
if to == 0 || to > @_size (
503512
to = @_size

core/_FFI.savi

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
:ffi strlen(string CPointer(U8)) USize
44
:ffi memset(pointer CPointer(U8), char I32, count USize) None
55
:ffi variadic snprintf(buffer CPointer(U8), buffer_size I32, fmt CPointer(U8)) I32
6+
:ffi strtod(start_pointer CPointer(U8), end_pointer CPointer(CPointer(U8))) F64
67

78
:ffi pony_exitcode(code I32) None
89
:ffi pony_os_stdout_setup() None

spec/core/String.Spec.savi

+4
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,10 @@
306306
assert: "-36".parse_i64! == -36
307307
assert error: "36bad".parse_i64!
308308

309+
:it "parses a floating point from the string decimal representation"
310+
assert: "36.3".parse_f64! == 36.3
311+
assert error: "36.3bad".parse_f64!
312+
309313
:it "returns the unicode codepoint found at the given offset, if valid"
310314
string = "नमस्ते"
311315
assert: string.char_at!(0) == 'न' // valid

0 commit comments

Comments
 (0)