summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorAlexey Kopytov <Alexey.Kopytov@Sun.com>2009-12-28 15:54:16 +0300
committerAlexey Kopytov <Alexey.Kopytov@Sun.com>2009-12-28 15:54:16 +0300
commit6c716007d13ffd74bb5c3dd7c512d4d7026a23d8 (patch)
tree0bab5217d4ea83929d314c2ce29f962a949c95c8 /strings
parentc3eabe01fc30ee38f64b17fabfd58c6328751660 (diff)
parente7441f0b602735e2c40b0e0e7cfb01a2443aaa5a (diff)
downloadmariadb-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.c10
-rw-r--r--strings/longlong2str_asm.c2
-rw-r--r--strings/my_vsnprintf.c69
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;