Ok, didn't manage to fix it entirely. I just changed uint64_t to uint32_t. Tested on amd64 a ia32, compiled on arm32 as well. Couldn't find any other piece of code in helenos, that would do int/float conversions, and didn't realy understand the rules,ie:
uint32_t small=5; uint64_t long=10; double fraction=0.5; fraction = small; // compiles fraction = long; //compiles small = fraction; // compiles long = fraction // error under 32bit systems I changed the default precision value to 6 and fixed the tests. And I hope the source is finally styled correctly :-) Adam
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: [email protected] # target_branch: bzr://bzr.helenos.org/mainline/ # testament_sha1: aca7b0df4fb2b7d5fe287ada3c70449011f2f584 # timestamp: 2012-04-11 00:38:03 +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-10 19:53:10 +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 %%0.6f %%f %%0.2f %%0.3f %%5.5f , 1.2345678,1.2345678,1.2345678, 3.1415,-3.1415,123.4567):\n"); + TPRINTF("Expected output: [1] [1.234567] [1.234567] [3.14] [-3.141] [00123.45670] \n"); + TPRINTF("Real output: [%0.0f] [%0.6f] [%f] [%0.2f] [%0.3f] [%5.5f] \n\n", 1.2345678,1.2345678,1.2345678, 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-10 22:36:41 +0000 @@ -38,6 +38,7 @@ #include <unistd.h> #include <stdio.h> +#include "stdlib.h" #include <io/printf_core.h> #include <ctype.h> #include <str.h> @@ -98,6 +99,7 @@ PrintfQualifierByte = 0, PrintfQualifierShort, PrintfQualifierInt, + PrintfQualifierFloat, PrintfQualifierLong, PrintfQualifierLongLong, PrintfQualifierPointer, @@ -360,7 +362,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 +528,77 @@ 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*/ + uint32_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*/ + uint32_t fraction; + { + num -= whole; + while (precision>1) { + num *= 10; + precision--; + } + num *= 10; + fraction = num; //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 @@ -701,7 +776,9 @@ /* Precision and '*' operator */ int precision = 0; + int precision_set = false; if (uc == '.') { + precision_set = true; i = nxt; uc = str_decode(fmt, &nxt, STR_NO_LIMIT); if (isdigit(uc)) { @@ -756,6 +833,10 @@ qualifier = PrintfQualifierLongLong; } break; + case 'f': + /* Float */ + qualifier = PrintfQualifierFloat; + break; case 'z': qualifier = PrintfQualifierSize; i = nxt; @@ -821,6 +902,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 +964,32 @@ 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); + /*Set default precision*/ + if (false == precision_set) { + precision = 6; + } + 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 IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWV6x/fwAC+RfgHgwWv///3ul fY6////+YBFcPr772997Npb6Hq23jbG2xPQaKNBt7u8buGhe7jo8oqqUtzta67j3O9h4jVR5E9Q0 NAZNAAAANGmgAaAAAkiCYRlNAJqp40U9T1HqNpG0hoAAD1AaAZARJqJ+jRpQe1QPUNtSAAMjQAA0 ACTSkmp6p6U9kmKZtUPTU8SNNDymjTQG0gDQANBFIhNMKYyUyn5NDUxoDUCYEMgNDQ9RoAkSE0TK ZoAJpiGpppQZiT01PUNNHqaepkaGnlMjNnetgqsFGSBvQAQRIxBFFFgM8FIWAwgxIgwRkFYDBWDB FQFTwbsr/t7+5sx3h+zfmmZva7TPQrRqZ3X6tUmNQYVFMpOhywTM0xjOoMMsWsk1aySKuYyQiy5z 73adzjv6hmaXPbmwMzM1oorwWjxs43GbqfT+hs7uFv6rj8cLPd4vX5Mjk2/fpSnCR0QQ5MIRt68l sHW7oytapRABXClUJAtg1EkTZRcVeyHUS6KqiNjoZOe0BZFZoGBnaDJJGCYI5xLgSVQCVJ0QBMBH abGG/ohMjOAbHGDjqUnn1zmUQHhlFzSzTvZ+BVotpw6l5l5VhGIIgY0hMY2vaWMG1m70AU592WQa Q1GqRkVvHZ6fONfODxxtKKsnWiXrWYmEoUtSQTBq0VoKmg+qu9YNUKIKuoZAyFGChki1Zqu2xRFK 0cQqhbLYkzJlpO5OHc4ZcSC+Rc7nV2NViNedfnEJ9A4atEUlJuCxtknIiDmlqmQdrpoyB8gR3sGM KBWnnWnxlxvLEdap8NWnjP6ffpenuG9lLNA9EC3zbfjnzknUmh6p9NK555f4A5aym9dfmVKJy03u BKxKYDM+Mbieg+OLcgajG12M6ck6jZKaiVngZWwMOyLEOCleDkjNnpBD3SP8aym1Z0Meet+Wz0ts JY1DmzMqcxp0QGSbotfhGxXQIY0teEEAiEGG3LcqdTgY5AYpecDG+AfXo9fi5Spkv7Yb+pdwDHsQ F1t2T4IKIA5eznLIv0n7jGLFWMpZ0eU0KZTdsPugeBMo2uvOX2DnKlxNTJRD6NQJyH3eNVN8Q7mS mX9PYq30NQmitE7rkF6F+79RBC0QZK88DqzCsVDyVwKLT+RBBYWPPPE0DXlZXvzb+xmVWYVLRRot PYYBQRcUpqGZAtmZY8jaIOk/SLqDAxXzN7iCncPQ2NqJ5rauZHgC0PWji6QgfIGILWdIdeHRw8nG u+vEuRfoSRDIAhIhB2hBmz77EhCAPKAOg6Q83Jm3K/V2byGUAcf0QvFbwFtLaW0398vvbtN3V2Nb 2Y8fLy9+cJJ5GGTOrFipwgBEn9XIIF72m2P0hJC7vWE6wC76ea8EOZB5zgkgOdq1wDYERA8dPbur MmlpVTeKRVkKRLobXmhOVtLVCHJIUy5l6Rha6EWtJAaBQGQfBiKvEgfP+TB7Jv85wISvSkNIGwMH gOAL4IUTuCIT5BoskkKTAc9nDaEDQLF8DtJKwV8gtN5iF4KRjUFDF/TKZeAG7dVkGwsqNoa3OXIm oaoDXeiXBeGNaqXGIurnlEoKcqX6uz9vEZS2DyPrQuduvYGJneF0lwBEgOyFjB7A6BNdhB0QsdD1 EesWDd+4Gy27E7zdCPdWFTuCfSYFjilovRY8+Rcc8jB6KVLP2oWtCxDEzPI8dFOKpEKVKXGrX5CN q2IQwaA7L1U2bPYHEeLPDddfcPZaYDQ8ssaENUizjA1AkO65rc8JjTgVpVcCnLBA666D+J1gg4T9 6FVXNanqILi/lqsAMqGdhKpnuuxO1CMDCWsV6FhnhouyTnMLBNWwqHbJvPAYWk0Iqd4PtEwa5otQ a3u9IK+twLVTDdaSxrbibOSM+mZFKhyIFnq0C7EQIoNjCEaFCRqeGvSIm8g4Fdb68WuSshcqEDUl 69+89yOwxKcS7nAfvY83TjYNp1HRSNbroKBk1szBowaATIuckmBNxJvlhSSQPFAdOLreHhXguZfO gGByUEJ7YLaHoXU5oIAUgVM7aoUOG74NLlqEk4D8TpqSL2eAFlBIdXVChU3OVSm8IE9kL6xc0Iqh GrHNGzWejMbQyPogPuAyFHJigGFbPTTYud9qHRRK6DO2UImC+0hEDUYzOiFoRyN6es7dSpYjYjS0 NgwhE0A8zCrDOM7DGCjINxzixtsPVibJXGI9rExBK5us6kDHEMkyO0Cp3D2AtYyzVM2VAeRhCKzw ZyNi6caeGqG8bcCWMUFT1LDwYC5MoaK9REKOAzKMqBfpDAFV3rTYbTZxu2VxjtQjTrM6eOiSloyu NgqITysQzJc1kuhZXYGE5d5UptwIc9qychsYxJpYmqSOdyKwo0FDhGrUOdX/6sudQikrFDrqcpdz lsbmYl10FRC1ZM1qatyvJZiKCEaPO8Ulrgey+A2ai2uKTa8ERgocghg4twEXuqCBVyA6A9uJsUcL bhk46x6H/DbE6nF9ipM1fx2yvAsblNORMLcpdYyYJwlIi2iOCEbNiKmQqcfBcfc48zgVNi4zDTOC FeBKYJpmeqk5WON5Bci52GHMlrljiXj2A1li5YnrflvoHtQvp6tFxaqlQdBxCDWr+FaiCZxCQPMM g1UqCdIiDpJgWA5pFwBZUGHyvvOt90hlN3hX3M97dQx2lIqPDnatSEWHajOJee3ISH38QRJQDyEh PL3hqnqGGGRNpTh2mgJwSJsNyKK1kwmTAwW1YhREypX3B9CUTIMVAFoL3r5HyPUjDSNgMQ2Da/Df Kf6FP9GjFfog+Yypb+ObEthuPAo/tTKVfEtPkpV/FSFBNP0PjI+lPmpgzC3RipmK0Km8wawYhWy1 gxZuthmDvfGHkIPZ2tLwnIeIynp6ipGDvLwkvKqQE/xoZi0/i+JuzDFke5S+Mj5j6LiR0MctH+o2 LEjoVg5pEsejaenza8zx3gPo9EykMjlPIdMTnIliUiWJYMgcfgGcx1YUiRoI15d/EMwBIS0gvYAK 8+LNq4zkuUf+D+qCVOKzhgiaXQN4ApgCeNAa5kvp5T4cbF3ImxC8WGc25kLfgmP73AH32MMjEQBn gNxaUxC7XrOXidh1P5qc+p0JcHt9BIu8iB7SUYSIFKHg+Hy/moKEtfgw/3vu314FTHprIqN6RKZs WQMxI+J7QEt0IRq8ZZOzQOm0zElI897OGkZYVNI9dKxWDXhvJgC0ZnuTxMLTEyluKmbJTKeXpDDy MKpBkmiCmwAW8LKoWYgYM8AVVckW2mknJpsTemkpLszm/0BWs4INezec8JRpDxLSfdCNMgs9oZSX XyJhoeMV2EGTZUPiG4AtGIUJmWb7WpjA54/YnnBhbXUOaMiRuAlMMmO3hXWSZ82xnWiddOE3/gNU nW1Etlt1OAtERhu8kKSUHDr+WnKcyet8DdcTORw4crcl8sJRESH0v2lmxniRk0am+e9L1JSt1tHM GiAqlnAPReuDOB8F24muwAVndLSWgDIT+U3x+vOpzge7p5HLzDoHI284BYNcHqGWCJ3BwpWu3kHX vl4B694d/kEgN/X85egly0cUiYJpLw1nLRF8rWBMmSYRIZBtsgJs2ACojv3TpQJYYVDwDplgLl/F MkArz7Myj5TSMrSCwQWhT8l4+G/lmA9W7vvf8Mkfiq0UoQkFGs2nebg7uA3FD4ydBnmcZKm1MMS9 hllapYtQt1Jlx3xoRvNBkzcJomTUpsPJWA+5e9bRMBlPeHycg+0oR7g7wVZz8mj3B9pE7YHKJg76 k5+T1SmDPA3gyBPbM+0p7wa8th7QBk9yNQWC+wdiOnbeEcO2SQH5ox3imj/JtOeBOGABrjcD7iWd EkhZP3G0VMsmaaHAHOGtCSyx7SyOr7AlpDkIGGb6NFexpFgc+9gFUPYpZFwQQkGLoEHx2LEC+q+7 QQBk0rXM+fIAjawwYazOWtuAI6kJLwAYj1hMhC0dgcoWB8A6/MjovISIYIEghYIQg8FfteoR6gbS GMGvdI+W7z9Yd15ImviuWVBZU0sDcnIR1o7gDajm+CPoajI2QsHlEHuAOhHiRMyf0jAtQUh1sA34 GMA2c5C6t0SVl9JzISY0soXRXlNIkPoHUMFg2JtjCiuIoEeAMLeYaAKkICYKQsBsAG04zpQpFqWY UAVGwNhAyDkHPsawrUgAaWwALreSMaCk5EikOV1ETP+oJpQ0CZCdBVKYR2dUgAPKWBhwlJLiCm4f UhHgNM+bUGaEUmAQIyITWQQkoRGSa/EG2Mq/Km54GdIZ4MaBL2nh6BJZkCuyEkjsUNQejiqqhiIi xz84dCHv2gDUQlVy7Od0kEJBdD5ANEL6eKDUiCb79j1Mq0ETHqPBk7k2WSI0h50TiK/WnQElhWAp UyBSelpgAnCD0Qmdoaz3/WOk/LnNIdTR8r5hZ8kvuEmGGQuATmEBATZhRI9qWImodYPoUWSxeKDU zFsYgRWOQiYBCPWDhCg1B+sKUCNeA4pI7iBmzNkJK8xDyhUpXdvH7a3PhkMpIGQwBNB0A5SiHtvQ 0uDgw+iFQObLfw6pi+HVjuUZMWTt3tITE06oaBkTrRQF4tkxe6goiGJNkNkgHHiTGs8SRQWNOIyu +TCHJz2ZM1gCUQI3tm3b3HaGiEIoyFySqummgo6ih30eVQlkAjUstRQ0VoTIqjSVsoyUrOKYULRn WMWIwFCvWLcMBtZiTgYMQkTznRABWFCjpWanUAO7lw3am4a8gHM3iphskMVSgARBWaYow5zdZpKQ ZwTnTcLehHmH0RTMs+jDwn29Fg2/EMqmBCOhU+RAFFYlBuRNQGU1Ul2AyXaD70fg5K3iM0HADj9o OpQ5kdaOXIxfZ4iadR2STtIn2uca6OJsDMPxcH7HQIcgT45aID1EB50ZnSVdINwlqNBYHAR83hgd 9CSgZiYepP/F3JFOFCQXrH9/AA==
_______________________________________________ HelenOS-devel mailing list [email protected] http://lists.modry.cz/cgi-bin/listinfo/helenos-devel
