You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.9 KiB
149 lines
3.9 KiB
Index: ./lib/__v_printf.c |
|
=================================================================== |
|
RCS file: /cvs/dietlibc/lib/__v_printf.c,v |
|
retrieving revision 1.33 |
|
retrieving revision 1.35 |
|
diff -u -r1.33 -r1.35 |
|
--- ./lib/__v_printf.c 10 Jan 2007 22:51:09 -0000 1.33 |
|
+++ ./lib/__v_printf.c 17 May 2007 05:00:42 -0000 1.35 |
|
@@ -19,9 +19,9 @@ |
|
#define B_WRITE(fn,buf,sz) { if ((unsigned long)(sz) > (((unsigned long)(int)(-1))>>1) || len+(int)(sz)<len) return -1; A_WRITE(fn,buf,sz); } while (0) |
|
|
|
static const char pad_line[2][16]= { " ", "0000000000000000", }; |
|
-static int write_pad(int* dlen,struct arg_printf* fn, int len, int padwith) { |
|
+static int write_pad(unsigned int* dlen,struct arg_printf* fn, unsigned int len, int padwith) { |
|
int nr=0; |
|
- if (len<0 || *dlen+len<len) return -1; |
|
+ if ((int)len<0 || *dlen+len<len) return -1; |
|
for (;len>15;len-=16,nr+=16) { |
|
A_WRITE(fn,pad_line[(padwith=='0')?1:0],16); |
|
} |
|
@@ -34,7 +34,7 @@ |
|
|
|
int __v_printf(struct arg_printf* fn, const char *format, va_list arg_ptr) |
|
{ |
|
- int len=0; |
|
+ unsigned int len=0; |
|
#ifdef WANT_ERROR_PRINTF |
|
int _errno = errno; |
|
#endif |
|
@@ -51,7 +51,7 @@ |
|
#define s u_str.s |
|
|
|
int retval; |
|
- unsigned char ch, padwith=' '; |
|
+ unsigned char ch, padwith=' ', precpadwith=' '; |
|
|
|
char flag_in_sign=0; |
|
char flag_upcase=0; |
|
@@ -172,7 +172,7 @@ |
|
if (flag_dot && sz>preci) sz=preci; |
|
preci=0; |
|
flag_dot^=flag_dot; |
|
- padwith=' '; |
|
+ padwith=precpadwith=' '; |
|
|
|
print_out: |
|
{ |
|
@@ -192,46 +192,46 @@ |
|
sz-=todo; |
|
width-=todo; |
|
} |
|
- |
|
- if (!flag_left) { |
|
- if (flag_dot) { |
|
- vs=preci>sz?preci:sz; |
|
- if (write_pad(&len,fn,(signed int)width-(signed int)vs,' ')) |
|
- return -1; |
|
- if (todo) { |
|
- B_WRITE(fn,sign,todo); |
|
- len+=todo; |
|
- } |
|
- if (write_pad(&len,fn,(signed int)preci-(signed int)sz,'0')) |
|
- return -1; |
|
- } else { |
|
- if (todo && padwith=='0') { |
|
- B_WRITE(fn,sign,todo); |
|
- len+=todo; todo=0; |
|
- } |
|
- if (write_pad(&len,fn,(signed int)width-(signed int)sz, padwith)) |
|
- return -1; |
|
- if (todo) { |
|
- B_WRITE(fn,sign,todo); |
|
- len+=todo; |
|
- } |
|
- } |
|
- B_WRITE(fn,s,sz); len+=sz; |
|
- } else if (flag_left) { |
|
- if (todo) { |
|
- B_WRITE(fn,sign,todo); |
|
- len+=todo; |
|
- } |
|
- if (write_pad(&len,fn,(signed int)preci-(signed int)sz, '0')) |
|
+ |
|
+ /* These are the cases for 1234 or "1234" respectively: |
|
+ %.6u -> "001234" |
|
+ %6u -> " 1234" |
|
+ %06u -> "001234" |
|
+ %-6u -> "1234 " |
|
+ %.6s -> "1234" |
|
+ %6s -> " 1234" |
|
+ %06s -> " 1234" |
|
+ %-6s -> "1234 " |
|
+ %6.5u -> " 01234" |
|
+ %6.5s -> " 1234" |
|
+ In this code, for %6.5s, 6 is width, 5 is preci. |
|
+ flag_dot means there was a '.' and preci is set. |
|
+ flag_left means there was a '-'. |
|
+ sz is 4 (strlen("1234")). |
|
+ padwith will be '0' for %06u, ' ' otherwise. |
|
+ precpadwith is '0' for %u, ' ' for %s. |
|
+ */ |
|
+ |
|
+ if (flag_dot && width==0) width=preci; |
|
+ if (!flag_dot) preci=sz; |
|
+ if (!flag_left) { /* do left-side padding */ |
|
+ if (write_pad(&len,fn,width-preci,padwith)) |
|
return -1; |
|
- B_WRITE(fn,s,sz); len+=sz; |
|
- vs=preci>sz?preci:sz; |
|
- if ((signed int)width-(signed int)vs<0) return -1; |
|
- if (write_pad(&len,fn,(signed int)width-(signed int)vs, ' ')) |
|
+ } |
|
+ if (todo) { |
|
+ B_WRITE(fn,sign,todo); |
|
+ len+=todo; |
|
+ } |
|
+ /* do preci padding */ |
|
+ if (write_pad(&len,fn,preci-sz,precpadwith)) |
|
+ return -1; |
|
+ /* write actual string */ |
|
+ B_WRITE(fn,s,sz); len+=sz; |
|
+ if (flag_left) { |
|
+ if (write_pad(&len,fn,width-preci,padwith)) |
|
return -1; |
|
- } else { |
|
- B_WRITE(fn,s,sz); len+=sz; |
|
} |
|
+ |
|
break; |
|
} |
|
|
|
@@ -327,6 +327,8 @@ |
|
++sz; |
|
} else flag_in_sign=0; |
|
|
|
+ precpadwith='0'; |
|
+ |
|
goto print_out; |
|
|
|
#ifdef WANT_FLOATING_POINT_IN_PRINTF |
|
@@ -374,6 +376,8 @@ |
|
} |
|
|
|
sz=strlen(s); |
|
+ if (width<sz) width=sz; |
|
+ padwith='0'; |
|
flag_dot=0; |
|
flag_hash=0; |
|
goto print_out;
|
|
|