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
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
9CSgZiYepP/F3JFOFCQXrH9/AA==
_______________________________________________
HelenOS-devel mailing list
[email protected]
http://lists.modry.cz/cgi-bin/listinfo/helenos-devel

Reply via email to