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 string>number ]
 | 
			
		||||
| 
						 | 
				
			
			@ -461,3 +462,14 @@ 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{ 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
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors byte-arrays combinators kernel kernel.private
 | 
			
		||||
layouts make math math.private sbufs sequences sequences.private
 | 
			
		||||
strings strings.private ;
 | 
			
		||||
USING: accessors byte-arrays combinators kernel kernel.private layouts
 | 
			
		||||
make math math.private sbufs sequences sequences.private strings ;
 | 
			
		||||
IN: math.parser
 | 
			
		||||
 | 
			
		||||
<PRIVATE
 | 
			
		||||
| 
						 | 
				
			
			@ -542,18 +541,10 @@ M: ratio >base
 | 
			
		|||
: format-string ( format -- format )
 | 
			
		||||
    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-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 ]
 | 
			
		||||
        [ drop ] if
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -223,8 +223,7 @@ void factor_vm::primitive_format_float() {
 | 
			
		|||
  try {
 | 
			
		||||
    localized_stream.imbue(std::locale(locale));
 | 
			
		||||
  } catch (const runtime_error&) {
 | 
			
		||||
    byte_array* array = allot_byte_array(1);
 | 
			
		||||
    array->data<char>()[0] = '\0';
 | 
			
		||||
    byte_array* array = allot_byte_array(0);
 | 
			
		||||
    ctx->replace(tag<byte_array>(array));
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -247,7 +246,7 @@ void factor_vm::primitive_format_float() {
 | 
			
		|||
  localized_stream << value;
 | 
			
		||||
  const std::string& tmp = localized_stream.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);
 | 
			
		||||
  memcpy(array->data<char>(), cstr, size);
 | 
			
		||||
  ctx->replace(tag<byte_array>(array));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue