*fixed a real number formatting bug with different locales.

This commit is contained in:
Wang Renxin 2018-07-25 15:15:37 +08:00
parent c2937a89db
commit 1d25d54f54
2 changed files with 29 additions and 10 deletions

17
HISTORY
View File

@ -1,3 +1,6 @@
Jul. 25 2018
Fixed a real number formatting bug with different locales
Jul. 14 2018
Fixed a multiple disposing bug with upvalues
@ -310,7 +313,7 @@ Jul. 16 2016
Added class format support with the STR statement
Jul. 14 2016
Fixed a boolean operation bug with the NOT statement on float number
Fixed a boolean operation bug with the NOT statement on real number
Improved boolean operation
Jul. 13 2016
@ -374,7 +377,7 @@ Jun. 14 2016
Fixed some bugs with meta method calling
Jun. 7 2016
Simplified double precision float number redefinition
Simplified double precision real number redefinition
May. 24 2016
Refactored error raising of string manipulation
@ -892,7 +895,7 @@ Added recursive sub routine support
Fixed a wrong argument detection bug in mb_has_arg
Sep. 18 2015
Fixed a float number parsing bug, thanks to Cybermonkey342 for pointing it out
Fixed a real number parsing bug, thanks to Cybermonkey342 for pointing it out
Added directly expression evaluation shell command
Sep. 17 2015
@ -902,7 +905,7 @@ Fixed a repeated disposing bug when using sub routine
Sep. 16 2015
Added Nil type handling, including assignment, boolean operation, serialization, etc.
Added an MB_CONVERT_TO_INT_LEVEL macro, would convert float to integer as much as possible if this macro was enabled
Added an MB_CONVERT_TO_INT_LEVEL macro, would convert real to integer as much as possible if this macro was enabled
Sep. 11 2015
Added a duplicate sub routine error handling
@ -973,7 +976,7 @@ Apr. 15 2015
Added mb_pop_usertype, mb_push_usertype to support user defined type
Apr. 13 2015
Added mixed integer/float array support
Added mixed integer/real array support
Added warning prompt when passing strings to maths functions
Fixed a memory leak when storing strings in an array
Improved the interpreter commands
@ -986,7 +989,7 @@ Disposed parsing context at runtime to reduce memory occupation
Apr. 10 2015
Improved compatibility with PellesC
Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out
Fixed a double precision real parsing bug on all 32bit systems, thanks to Pito for pointing it out
Fixed an exponential number parsing bug, thanks to Pito for pointing it out
Fixed a crash bug when a script begins with meaningless negtive number
@ -1089,7 +1092,7 @@ Fixed some memory leaks
Jul. 3 2012
Modified/added math functions: FLOOR, CEIL, FIX
Fixed an INPUT type issue
Changed float number formatting from using "%f" to "%g" in PRINT, thanks to Bruce Kendall for pointing above three issues out
Changed real number formatting from using "%f" to "%g" in PRINT, thanks to Bruce Kendall for pointing above three issues out
Refactored the way to load a script file
Done several small improvements

View File

@ -1739,6 +1739,10 @@ static char* _extract_string(_object_t* obj);
#ifdef MB_MANUAL_REAL_FORMATTING
static void _real_to_str(real_t r, char* str, size_t size, size_t afterpoint);
#endif /* MB_MANUAL_REAL_FORMATTING */
static void _real_to_str_std(real_t r, char* str, size_t size);
#ifndef mb_realtostr
# define mb_realtostr(__r, __s, __z) _real_to_str_std((__r), (__s), (__z))
#endif /* mb_realtostr */
#ifdef _HAS_REF_OBJ_LOCK
static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
@ -6204,6 +6208,20 @@ static void _real_to_str(real_t r, char* str, size_t size, size_t afterpoint) {
}
#endif /* MB_MANUAL_REAL_FORMATTING */
/* Convert a real number to string the standard way */
static void _real_to_str_std(real_t r, char* str, size_t size) {
if((size_t)sprintf(str, MB_REAL_FMT, r) >= size) {
mb_assert(0 && "Buffer overflow.");
}
for(size_t i = 0; i < size; ++i) {
if(str[i] == ',') {
str[i] = '.';
break;
}
}
}
#ifdef _HAS_REF_OBJ_LOCK
/* Lock a referenced object */
static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj) {
@ -17668,9 +17686,7 @@ static int _std_str(mb_interpreter_t* s, void** l) {
#ifdef MB_MANUAL_REAL_FORMATTING
_real_to_str(arg.value.float_point, _CHAR_BUF_PTR(buf), lbuf, 5);
#else /* MB_MANUAL_REAL_FORMATTING */
if((size_t)sprintf(_CHAR_BUF_PTR(buf), MB_REAL_FMT, arg.value.float_point) >= lbuf) {
mb_assert(0 && "Buffer overflow.");
}
mb_realtostr(arg.value.float_point, _CHAR_BUF_PTR(buf), lbuf);
#endif /* MB_MANUAL_REAL_FORMATTING */
break;