math.parser: (format-float) doesn't need to zero-terminate returned byte-array
parent
560900275a
commit
bbd71ae975
|
@ -1,4 +1,5 @@
|
||||||
USING: layouts literals math math.parser sequences tools.test ;
|
USING: layouts literals math math.parser.private sequences tools.test ;
|
||||||
|
IN: math.parser
|
||||||
|
|
||||||
{ f }
|
{ f }
|
||||||
[ f string>number ]
|
[ f string>number ]
|
||||||
|
@ -461,3 +462,14 @@ unit-test
|
||||||
|
|
||||||
{ "deadbeef" } [ B{ 222 173 190 239 } bytes>hex-string ] unit-test
|
{ "deadbeef" } [ B{ 222 173 190 239 } bytes>hex-string ] unit-test
|
||||||
{ B{ 222 173 190 239 } } [ "deADbeEF" hex-string>bytes ] unit-test
|
{ B{ 222 173 190 239 } } [ "deADbeEF" hex-string>bytes ] unit-test
|
||||||
|
|
||||||
|
{
|
||||||
|
B{ 49 46 53 53 69 43 48 53 }
|
||||||
|
} [
|
||||||
|
155000.0 B{ } -1 3 B{ 69 0 } B{ 67 0 } (format-float)
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
! Missing locale
|
||||||
|
{ "" } [
|
||||||
|
33.4 "" 4 4 "f" "missing" format-float
|
||||||
|
] unit-test
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
! Copyright (C) 2009 Joe Groff, 2013 John Benediktsson
|
! Copyright (C) 2009 Joe Groff, 2013 John Benediktsson
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors byte-arrays combinators kernel kernel.private
|
USING: accessors byte-arrays combinators kernel kernel.private layouts
|
||||||
layouts make math math.private sbufs sequences sequences.private
|
make math math.private sbufs sequences sequences.private strings ;
|
||||||
strings strings.private ;
|
|
||||||
IN: math.parser
|
IN: math.parser
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
@ -542,18 +541,10 @@ M: ratio >base
|
||||||
: format-string ( format -- format )
|
: format-string ( format -- format )
|
||||||
0 suffix >byte-array ; foldable
|
0 suffix >byte-array ; foldable
|
||||||
|
|
||||||
: format-head ( byte-array n -- string )
|
|
||||||
swap over 0 <string> [
|
|
||||||
[
|
|
||||||
[ [ nth-unsafe ] 2keep drop ]
|
|
||||||
[ set-string-nth-fast ] bi*
|
|
||||||
] 2curry each-integer
|
|
||||||
] keep ; inline
|
|
||||||
|
|
||||||
: format-float ( n fill width precision format locale -- string )
|
: format-float ( n fill width precision format locale -- string )
|
||||||
[
|
[
|
||||||
[ format-string ] 4dip [ format-string ] bi@ (format-float)
|
[ format-string ] 4dip [ format-string ] bi@ (format-float)
|
||||||
dup [ 0 = ] find drop format-head
|
>string
|
||||||
] [
|
] [
|
||||||
"C" = [ [ "G" = ] [ "E" = ] bi or CHAR: E CHAR: e ? fix-float ]
|
"C" = [ [ "G" = ] [ "E" = ] bi or CHAR: E CHAR: e ? fix-float ]
|
||||||
[ drop ] if
|
[ drop ] if
|
||||||
|
|
|
@ -223,8 +223,7 @@ void factor_vm::primitive_format_float() {
|
||||||
try {
|
try {
|
||||||
localized_stream.imbue(std::locale(locale));
|
localized_stream.imbue(std::locale(locale));
|
||||||
} catch (const runtime_error&) {
|
} catch (const runtime_error&) {
|
||||||
byte_array* array = allot_byte_array(1);
|
byte_array* array = allot_byte_array(0);
|
||||||
array->data<char>()[0] = '\0';
|
|
||||||
ctx->replace(tag<byte_array>(array));
|
ctx->replace(tag<byte_array>(array));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -247,7 +246,7 @@ void factor_vm::primitive_format_float() {
|
||||||
localized_stream << value;
|
localized_stream << value;
|
||||||
const std::string& tmp = localized_stream.str();
|
const std::string& tmp = localized_stream.str();
|
||||||
const char* cstr = tmp.c_str();
|
const char* cstr = tmp.c_str();
|
||||||
size_t size = tmp.length()+1;
|
size_t size = tmp.length();
|
||||||
byte_array* array = allot_byte_array(size);
|
byte_array* array = allot_byte_array(size);
|
||||||
memcpy(array->data<char>(), cstr, size);
|
memcpy(array->data<char>(), cstr, size);
|
||||||
ctx->replace(tag<byte_array>(array));
|
ctx->replace(tag<byte_array>(array));
|
||||||
|
|
Loading…
Reference in New Issue