summaryrefslogtreecommitdiff
path: root/mysys/mf_iocache2.c
diff options
context:
space:
mode:
authorcmiller@zippy.cornsilk.net <>2007-08-02 12:51:49 -0400
committercmiller@zippy.cornsilk.net <>2007-08-02 12:51:49 -0400
commitc9ffb4c1cb09751af90cb9da1ca5d5cc1b0743dc (patch)
tree226a52fa7b1462495f8ac34cd3f396e05ef504c9 /mysys/mf_iocache2.c
parente8eaca54a3d391e55b9e379e08c52acc28f657fb (diff)
parent28dbc263f679f4fea51a216135ec140415ca96b3 (diff)
downloadmariadb-git-c9ffb4c1cb09751af90cb9da1ca5d5cc1b0743dc.tar.gz
Merge zippy.cornsilk.net:/home/cmiller/work/mysql/.deleted/mysql-5.1-new-maint--bug27894
into zippy.cornsilk.net:/home/cmiller/work/mysql/mysql-5.1-maint
Diffstat (limited to 'mysys/mf_iocache2.c')
-rw-r--r--mysys/mf_iocache2.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c
index 8a5b91661c4..46a667977c2 100644
--- a/mysys/mf_iocache2.c
+++ b/mysys/mf_iocache2.c
@@ -304,6 +304,7 @@ size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args)
uint minimum_width; /* as yet unimplemented */
uint minimum_width_sign;
uint precision; /* as yet unimplemented for anything but %b */
+ my_bool is_zero_padded;
/*
Store the location of the beginning of a format directive, for the
@@ -337,11 +338,27 @@ size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args)
backtrack= fmt;
fmt++;
+ is_zero_padded= FALSE;
+ minimum_width_sign= 1;
minimum_width= 0;
precision= 0;
- minimum_width_sign= 1;
/* Skip if max size is used (to be compatible with printf) */
- while (*fmt == '-') { fmt++; minimum_width_sign= -1; }
+
+process_flags:
+ switch (*fmt)
+ {
+ case '-':
+ minimum_width_sign= -1; fmt++; goto process_flags;
+ case '0':
+ is_zero_padded= TRUE; fmt++; goto process_flags;
+ case '#':
+ /** @todo Implement "#" conversion flag. */ fmt++; goto process_flags;
+ case ' ':
+ /** @todo Implement " " conversion flag. */ fmt++; goto process_flags;
+ case '+':
+ /** @todo Implement "+" conversion flag. */ fmt++; goto process_flags;
+ }
+
if (*fmt == '*')
{
precision= (int) va_arg(args, int);
@@ -376,7 +393,7 @@ size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args)
{
reg2 char *par = va_arg(args, char *);
size_t length2 = strlen(par);
- /* TODO: implement minimum width and precision */
+ /* TODO: implement precision */
out_length+= length2;
if (my_b_write(info, par, length2))
goto err;
@@ -398,7 +415,21 @@ size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args)
if (*fmt == 'd')
length2= (size_t) (int10_to_str((long) iarg,buff, -10) - buff);
else
- length2= (size_t) (int10_to_str((long) (uint) iarg,buff,10)- buff);
+
+ /* minimum width padding */
+ if (minimum_width > length2)
+ {
+ char *buffz;
+
+ buffz= my_alloca(minimum_width - length2);
+ if (is_zero_padded)
+ memset(buffz, '0', minimum_width - length2);
+ else
+ memset(buffz, ' ', minimum_width - length2);
+ my_b_write(info, buffz, minimum_width - length2);
+ my_afree(buffz);
+ }
+
out_length+= length2;
if (my_b_write(info, buff, length2))
goto err;