From: <bar...@us...> - 2011-05-09 19:24:55
|
Revision: 1610 http://freedos.svn.sourceforge.net/freedos/?rev=1610&view=rev Author: bartoldeman Date: 2011-05-09 19:24:49 +0000 (Mon, 09 May 2011) Log Message: ----------- Support precision flag and size/precision from argument list in abbreviated printf function, to fix "dir /lfn". Modified Paths: -------------- freecom/trunk/lib/prf.c Modified: freecom/trunk/lib/prf.c =================================================================== --- freecom/trunk/lib/prf.c 2011-05-09 01:54:48 UTC (rev 1609) +++ freecom/trunk/lib/prf.c 2011-05-09 19:24:49 UTC (rev 1610) @@ -149,7 +149,7 @@ { int base; char s[11], far * p; - int c, flag, size, fill; + int c, flag, size, fill, precision; int longarg; long currentArg; @@ -162,28 +162,52 @@ } longarg = FALSE; - size = 0; flag = RIGHT; fill = ' '; - if (*fmt == '-') + if (*fmt == '0') { - flag = LEFT; + fill = '0'; fmt++; } - if (*fmt == '0') + if (*fmt == '-') { - fill = '0'; + flag = LEFT; fmt++; } - while (*fmt >= '0' && *fmt <= '9') + for(;;) { - size = size * 10 + (*fmt++ - '0'); + if (*fmt == '*') + { + precision = va_arg(arg, int); + fmt++; + } + else + { + precision = 0; + while (*fmt >= '0' && *fmt <= '9') + { + precision = precision * 10 + (*fmt++ - '0'); + } + } + + if(c == '%') + { + size = precision; + precision = -1; + if (size < 0) + { + size = -size; + flag = LEFT; + } + } + if((c = *fmt) != '.')break; + fmt++; } - if (*fmt == 'l') + if (c == 'l') { longarg = TRUE; fmt++; @@ -255,7 +279,7 @@ for (; size > 0; size--) handle_char(fill, f); } - for (; *p != '\0'; p++) + for (; *p != '\0' && precision != 0; p++, precision--) handle_char(*p, f); for (; size > 0; size--) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |