> Hi Adam, > thanks for the patch. > > I have a few comments. > > Please, use the same C style as we do. In general, we are more > generous with spaces than you were in your patch. We do put them > around operators or after keywords (such as if or while).
Ok, looked into the style guide, hope I fixed few things :) > And it seems to me that there is one bug in your implementation. > Specifier %5.0f shall print the number without the fractional part. > But your implementation prints at least one digit. Fixed, added a test. > Unless you want to provide your own fix, I will probably fix these > some time next week because this is something I would like to have > merged into mainline. > > Thanks. > > - Vojta > > Dne 7. dubna 2012 16:05 Adam Saleh <[email protected]> napsal(a): >> Sending my patch. Hopefully fixes trac.helenos.org/ticket/221 >> >> Adam >> >> _______________________________________________ >> HelenOS-devel mailing list >> [email protected] >> http://lists.modry.cz/cgi-bin/listinfo/helenos-devel >> > > _______________________________________________ > HelenOS-devel mailing list > [email protected] > http://lists.modry.cz/cgi-bin/listinfo/helenos-devel
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: [email protected] # target_branch: bzr://bzr.helenos.org/mainline/ # testament_sha1: 0cfa6f7738543d146058b7811a1f3c0335c3b6e8 # timestamp: 2012-04-08 16:42:18 +0200 # base_revision_id: jiri@wiwaxia-20120405224251-l7sx79xi2488v3ko # # Begin patch === modified file 'uspace/app/tester/print/print2.c' --- uspace/app/tester/print/print2.c 2011-08-23 17:44:33 +0000 +++ uspace/app/tester/print/print2.c 2012-04-08 14:39:47 +0000 @@ -51,6 +51,10 @@ TPRINTF("Testing printf(\"%%#x %%5.3#x %%-5.3#x %%3.5#x %%-3.5#x\", 17, 18, 19, 20, 21):\n"); TPRINTF("Expected output: [0x11] [0x012] [0x013] [0x00014] [0x00015]\n"); TPRINTF("Real output: [%#x] [%#5.3x] [%#-5.3x] [%#3.5x] [%#-3.5x]\n\n", 17, 18, 19, 20, 21); + + TPRINTF("Testing printf(\"%%0.0f\ %%f %%0.2f\", 3.1415,3.1415,-3.1415,123.4567):\n"); + TPRINTF("Expected output: [3] [3.1] [3.14] [-3.141] [00123.45670] \n"); + TPRINTF("Real output: [%0.0f] [%f] [%0.2f] [%0.3f] [%5.5f] \n\n", 3.1415, 3.1415,3.1415,-3.1415,123.4567); return NULL; } === modified file 'uspace/lib/c/generic/io/printf_core.c' --- uspace/lib/c/generic/io/printf_core.c 2011-08-23 17:44:33 +0000 +++ uspace/lib/c/generic/io/printf_core.c 2012-04-08 14:39:47 +0000 @@ -98,6 +98,7 @@ PrintfQualifierByte = 0, PrintfQualifierShort, PrintfQualifierInt, + PrintfQualifierFloat, PrintfQualifierLong, PrintfQualifierLongLong, PrintfQualifierPointer, @@ -360,7 +361,7 @@ return ((int) counter); } -/** Print a number in a given base. +/** Print an integer in a given base. * * Print significant digits of a number in given base. * @@ -526,6 +527,78 @@ return ((int) counter); } + +/** Print a float in base 10. + * + * Print significant digits of a number in given base. + * + * @param num Number to print. + * @param width Width modifier. + * @param precision Precision modifier. + * @param flags Flags that modify the way the number is printed. + * + * @return Number of characters printed. + * + */ +static int print_float(double num, int width, int precision, + uint32_t flags, printf_spec_t *ps) +{ + int base; + base = 10; + int counter; counter=0; + int result; + + /*handle negative numbers*/ + uint32_t flags_fraction=flags; + if(num < 0){ + (flags) |= __PRINTF_FLAG_NEGATIVE; + num *= -1; + } + + /*get the whole part*/ + uint64_t whole = num; + + /*print the whole part*/ + result = print_number(whole,0,width,base,flags,ps); + if(result < 0){ + return result; + } + counter += result; + + /*If i don't want to printout the fractional part, I can end*/ + if(precision == 0){ + return ((int) counter); + } + + /*print the dot*/ + result = print_char('.',1,flags,ps); + if(result < 0){ + return result; + } + counter++; + + /*get fraction*/ + uint64_t fraction; + { + num -= whole; + while(precision>1){ + num *= 10; + precision--; + } + num *= 10; + fraction = num; + } + + /*print the rest (witout negative flag)*/ + result = print_number(fraction,0,0,base,flags_fraction,ps); + if(result < 0){ + return result; + } + counter += result; + + return ((int) counter); +} + /** Print formatted string. * * Print string formatted according to the fmt parameter and variadic arguments. @@ -601,7 +674,9 @@ * * - d, i Print signed decimal number. There is no difference between d * and i conversion. - * + * + * - f Print signed decimal float. + * * - u Print unsigned decimal number. * * - X, x Print hexadecimal number with upper- or lower-case. Prefix is @@ -756,6 +831,10 @@ qualifier = PrintfQualifierLongLong; } break; + case 'f': + /* Float */ + qualifier = PrintfQualifierFloat; + break; case 'z': qualifier = PrintfQualifierSize; i = nxt; @@ -821,6 +900,9 @@ break; case 'd': case 'i': + /* necessary to case 'f' again, so it won't fall through + * and have signed printing in sub routines */ + case 'f': flags |= __PRINTF_FLAG_SIGNED; case 'u': break; @@ -880,14 +962,28 @@ size = sizeof(size_t); number = (uint64_t) va_arg(ap, size_t); break; + /*Float is a known qualifier, but will be a special case*/ + case PrintfQualifierFloat: + break; default: /* Unknown qualifier */ counter = -counter; goto out; } - if ((retval = print_number(number, width, precision, - base, flags, ps)) < 0) { + /*Either float or integer*/ + if(PrintfQualifierFloat == qualifier) { + double fnumber; + size = sizeof(float); + fnumber = (float) va_arg(ap, double); + retval = print_float(fnumber, width, precision, + flags, ps); + }else{ + retval = print_number(number, width, precision, + base, flags, ps); + } + + if (retval < 0) { counter = -counter; goto out; } # Begin bundle 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 kKp/4u5IpwoSAhXpLIA=
_______________________________________________ HelenOS-devel mailing list [email protected] http://lists.modry.cz/cgi-bin/listinfo/helenos-devel
