diff options
author | Alexey Kopytov <Alexey.Kopytov@Sun.com> | 2009-12-28 15:54:16 +0300 |
---|---|---|
committer | Alexey Kopytov <Alexey.Kopytov@Sun.com> | 2009-12-28 15:54:16 +0300 |
commit | 6c716007d13ffd74bb5c3dd7c512d4d7026a23d8 (patch) | |
tree | 0bab5217d4ea83929d314c2ce29f962a949c95c8 /strings | |
parent | c3eabe01fc30ee38f64b17fabfd58c6328751660 (diff) | |
parent | e7441f0b602735e2c40b0e0e7cfb01a2443aaa5a (diff) | |
download | mariadb-git-6c716007d13ffd74bb5c3dd7c512d4d7026a23d8.tar.gz |
Manual merge of WL#4738 from mysql-next-mr:
- backported code that handles %f/%g arguments in
my_vsnprintf.c from 6.0
- backported %f/%g tests in unittest/mysys/my_vsnprintf-t.c
from 6.0
- replaced snprintf("%g") in sql/set_var.cc with my_gcvt()
- removed unnecessary "--replace-result"s for Windows in
mysql-test/suite/sys_vars/t/long_query_time_basic.test
- some test results adjustments
Diffstat (limited to 'strings')
-rw-r--r-- | strings/longlong2str.c | 10 | ||||
-rw-r--r-- | strings/longlong2str_asm.c | 2 | ||||
-rw-r--r-- | strings/my_vsnprintf.c | 69 |
3 files changed, 63 insertions, 18 deletions
diff --git a/strings/longlong2str.c b/strings/longlong2str.c index d7de5bb0f7c..641ae0955d3 100644 --- a/strings/longlong2str.c +++ b/strings/longlong2str.c @@ -40,17 +40,18 @@ #include <my_global.h> #include "m_string.h" -#if defined(HAVE_LONG_LONG) && !defined(longlong2str) && !defined(HAVE_LONGLONG2STR) +#ifndef ll2str /* This assumes that longlong multiplication is faster than longlong division. */ -char *longlong2str(longlong val,char *dst,int radix) +char *ll2str(longlong val,char *dst,int radix, int upcase) { char buffer[65]; register char *p; long long_val; + char *dig_vec= upcase ? _dig_vec_upper : _dig_vec_lower; ulonglong uval= (ulonglong) val; if (radix < 0) @@ -80,20 +81,19 @@ char *longlong2str(longlong val,char *dst,int radix) { ulonglong quo= uval/(uint) radix; uint rem= (uint) (uval- quo* (uint) radix); - *--p = _dig_vec_upper[rem]; + *--p= dig_vec[rem]; uval= quo; } long_val= (long) uval; while (long_val != 0) { long quo= long_val/radix; - *--p = _dig_vec_upper[(uchar) (long_val - quo*radix)]; + *--p= dig_vec[(uchar) (long_val - quo*radix)]; long_val= quo; } while ((*dst++ = *p++) != 0) ; return dst-1; } - #endif #ifndef longlong10_to_str diff --git a/strings/longlong2str_asm.c b/strings/longlong2str_asm.c index 637815e52c5..70fe5d7bd48 100644 --- a/strings/longlong2str_asm.c +++ b/strings/longlong2str_asm.c @@ -26,7 +26,7 @@ extern char *longlong2str_with_dig_vector(longlong val,char *dst,int radix, const char *dig_vector); -char *longlong2str(longlong val,char *dst,int radix) +char *ll2str(longlong val,char *dst,int radix, int upcase) { return longlong2str_with_dig_vector(val, dst, radix, _dig_vec_upper); } diff --git a/strings/my_vsnprintf.c b/strings/my_vsnprintf.c index ad8e7c8c776..251c3905d5a 100644 --- a/strings/my_vsnprintf.c +++ b/strings/my_vsnprintf.c @@ -221,6 +221,27 @@ static char *process_bin_arg(char *to, char *end, size_t width, char *par) /** + Prints double or float argument +*/ + +static char *process_dbl_arg(char *to, char *end, size_t width, + double par, char arg_type) +{ + if (width == SIZE_T_MAX) + width= FLT_DIG; /* width not set, use default */ + else if (width >= NOT_FIXED_DEC) + width= NOT_FIXED_DEC - 1; /* max.precision for my_fcvt() */ + width= min(width, (size_t)(end-to) - 1); + + if (arg_type == 'f') + to+= my_fcvt(par, (int)width , to, NULL); + else + to+= my_gcvt(par, MY_GCVT_ARG_DOUBLE, (int) width , to, NULL); + return to; +} + + +/** Prints integer argument */ @@ -235,19 +256,23 @@ static char *process_int_arg(char *to, char *end, size_t length, store_start= buff; if (arg_type == 'd') - store_end= int10_to_str(par, store_start, -10); + store_end= longlong10_to_str(par, store_start, -10); else if (arg_type == 'u') - store_end= int10_to_str(par, store_start, 10); + store_end= longlong10_to_str(par, store_start, 10); else if (arg_type == 'p') { store_start[0]= '0'; store_start[1]= 'x'; - store_end= int2str(par, store_start + 2, 16, 0); + store_end= ll2str(par, store_start + 2, 16, 0); + } + else if (arg_type == 'o') + { + store_end= ll2str(par, store_start, 8, 0); } else { DBUG_ASSERT(arg_type == 'X' || arg_type =='x'); - store_end= int2str(par, store_start, 16, (arg_type == 'X')); + store_end= ll2str(par, store_start, 16, (arg_type == 'X')); } if ((res_length= (size_t) (store_end - store_start)) > to_length) @@ -377,6 +402,7 @@ start: case 'u': case 'x': case 'X': + case 'o': case 'p': if (args_arr[i].have_longlong) args_arr[i].longlong_arg= va_arg(ap,longlong); @@ -395,21 +421,23 @@ start: /* Print result string */ for (i= 0; i <= idx; i++) { - uint width= 0, length= 0; + size_t width= 0, length= 0; switch (print_arr[i].arg_type) { case 's': { char *par= args_arr[print_arr[i].arg_idx].str_arg; - width= (print_arr[i].flags & WIDTH_ARG) ? - args_arr[print_arr[i].width].longlong_arg : print_arr[i].width; + width= (print_arr[i].flags & WIDTH_ARG) + ? (size_t)args_arr[print_arr[i].width].longlong_arg + : print_arr[i].width; to= process_str_arg(cs, to, end, width, par, print_arr[i].flags); break; } case 'b': { char *par = args_arr[print_arr[i].arg_idx].str_arg; - width= (print_arr[i].flags & WIDTH_ARG) ? - args_arr[print_arr[i].width].longlong_arg : print_arr[i].width; + width= (print_arr[i].flags & WIDTH_ARG) + ? (size_t)args_arr[print_arr[i].width].longlong_arg + : print_arr[i].width; to= process_bin_arg(to, end, width, par); break; } @@ -420,16 +448,27 @@ start: *to++= (char) args_arr[print_arr[i].arg_idx].longlong_arg; break; } + case 'f': + case 'g': + { + double d= args_arr[print_arr[i].arg_idx].double_arg; + width= (print_arr[i].flags & WIDTH_ARG) ? + (uint)args_arr[print_arr[i].width].longlong_arg : print_arr[i].width; + to= process_dbl_arg(to, end, width, d, print_arr[i].arg_type); + break; + } case 'd': case 'u': case 'x': case 'X': + case 'o': case 'p': { /* Integer parameter */ longlong larg; - length= (print_arr[i].flags & LENGTH_ARG) ? - args_arr[print_arr[i].length].longlong_arg : print_arr[i].length; + length= (print_arr[i].flags & LENGTH_ARG) + ? (size_t)args_arr[print_arr[i].length].longlong_arg + : print_arr[i].length; if (args_arr[print_arr[i].arg_idx].have_longlong) larg = args_arr[print_arr[i].arg_idx].longlong_arg; @@ -570,8 +609,14 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n, to= process_bin_arg(to, end, width, par); continue; } + else if (*fmt == 'f' || *fmt == 'g') + { + double d= va_arg(ap, double); + to= process_dbl_arg(to, end, width, d, *fmt); + continue; + } else if (*fmt == 'd' || *fmt == 'u' || *fmt == 'x' || *fmt == 'X' || - *fmt == 'p') + *fmt == 'p' || *fmt == 'o') { /* Integer parameter */ longlong larg; |