mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 16:18:52 +00:00
bigint: pass size to itoa_raw.
This commit is contained in:
+21
-10
@@ -36,10 +36,7 @@ itoa_string :: proc(a: ^Int, radix := i8(-1), zero_terminate := false, allocator
|
|||||||
Calculate the size of the buffer we need.
|
Calculate the size of the buffer we need.
|
||||||
*/
|
*/
|
||||||
size: int;
|
size: int;
|
||||||
size, err = radix_size(a, radix);
|
size, err = radix_size(a, radix, zero_terminate);
|
||||||
if zero_terminate {
|
|
||||||
size += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Exit if calculating the size returned an error.
|
Exit if calculating the size returned an error.
|
||||||
@@ -60,7 +57,7 @@ itoa_string :: proc(a: ^Int, radix := i8(-1), zero_terminate := false, allocator
|
|||||||
Write the digits out into the buffer.
|
Write the digits out into the buffer.
|
||||||
*/
|
*/
|
||||||
written: int;
|
written: int;
|
||||||
written, err = itoa_raw(a, radix, buffer, zero_terminate);
|
written, err = itoa_raw(a, radix, buffer, size, zero_terminate);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
For now, delete the buffer and fall back to the below on failure.
|
For now, delete the buffer and fall back to the below on failure.
|
||||||
@@ -107,9 +104,15 @@ itoa_cstring :: proc(a: ^Int, radix := i8(-1), allocator := context.allocator) -
|
|||||||
Use `radix_size` or `radix_size_estimate` to determine a buffer size big enough.
|
Use `radix_size` or `radix_size_estimate` to determine a buffer size big enough.
|
||||||
|
|
||||||
`written` includes the sign if negative, and the zero terminator if asked for.
|
`written` includes the sign if negative, and the zero terminator if asked for.
|
||||||
|
If you want a 2s complement negative number, adjust it before calling.
|
||||||
|
|
||||||
|
You can pass the output of `radix_size` to `size` if you've previously called it to size
|
||||||
|
the output buffer. If you haven't, this routine will call it. This way it knows if the buffer
|
||||||
|
is the appropriate size, and it can avoid writing backwards and then reversing.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, zero_terminate := false) -> (written: int, err: Error) {
|
itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, size := int(-1), zero_terminate := false) -> (written: int, err: Error) {
|
||||||
assert_initialized(a);
|
assert_initialized(a); size := size;
|
||||||
/*
|
/*
|
||||||
Radix defaults to 10.
|
Radix defaults to 10.
|
||||||
*/
|
*/
|
||||||
@@ -119,10 +122,17 @@ itoa_raw :: proc(a: ^Int, radix: i8, buffer: []u8, zero_terminate := false) -> (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Early exit if we were given an empty buffer.
|
We weren't given a size. Let's compute it.
|
||||||
|
*/
|
||||||
|
if size == -1 {
|
||||||
|
size, err = radix_size(a, radix, zero_terminate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Early exit if the buffer we were given is too small.
|
||||||
*/
|
*/
|
||||||
available := len(buffer);
|
available := len(buffer);
|
||||||
if available == 0 {
|
if available < size {
|
||||||
return 0, .Buffer_Overflow;
|
return 0, .Buffer_Overflow;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -208,7 +218,7 @@ int_to_cstring :: itoa_cstring;
|
|||||||
/*
|
/*
|
||||||
We size for `string`, not `cstring`.
|
We size for `string`, not `cstring`.
|
||||||
*/
|
*/
|
||||||
radix_size :: proc(a: ^Int, radix: i8) -> (size: int, err: Error) {
|
radix_size :: proc(a: ^Int, radix: i8, zero_terminate := false) -> (size: int, err: Error) {
|
||||||
if radix < 2 || radix > 64 {
|
if radix < 2 || radix > 64 {
|
||||||
return -1, .Invalid_Input;
|
return -1, .Invalid_Input;
|
||||||
}
|
}
|
||||||
@@ -236,6 +246,7 @@ radix_size :: proc(a: ^Int, radix: i8) -> (size: int, err: Error) {
|
|||||||
log truncates to zero, so we need to add one more, and one for `-` if negative.
|
log truncates to zero, so we need to add one more, and one for `-` if negative.
|
||||||
*/
|
*/
|
||||||
size += 2 if is_neg(a) else 1;
|
size += 2 if is_neg(a) else 1;
|
||||||
|
size += 1 if zero_terminate else 0;
|
||||||
return size, .OK;
|
return size, .OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user