> 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
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWRCvSWQABzTfgHgwUv///3Ol
fY6////+YAy8fdd2rqtBVAAAAnaVUAANUooUKNYJKTJomiNqPUybUaDRiaaaDRoAaNB6Jo0AaEp5
U/CYpqGjQDIyBoMQyAMhoaBpocZMmjENNDATQxNGmTEDIwmjTTCDJhJqiJhBqanqepH6RtU2T1Gn
qjNJ6jJ6gaBo9RoYmhxkyaMQ00MBNDE0aZMQMjCaNNMIMmEkQEAmIJiACZDVPSeJqm2pGn6oep+q
MTT9TRZmZtpSKyIEugRBEiIiiigJzUIUgJAYkQQjAYKwYqgK81X4U2psK+vCcuYwd2a+IzNXH42y
WhRUUrJ4WUAnWEJuwRhViLKrEEUZOInY0+2vS0PAxYOqLyoMnxSk6TUzJ7CiajNC3qUm/vmQpkg3
DBlFpEu1afx72rQSiySwZBdGhIsazjZCx+gkWjVKSnAajwua9OdPUr1RFUYCLCj+NmY8qI3mQ8Mk
8SynHPBFnpCmVMq6ZX+zXjZxDeHMDAUUkRPQWs09pJ4M9DYZuVU+e3ph1vdd13Fo5QXcdseKGHGp
Ilba8lNFog5qX6PFWttM7hbhSqY2VuGiXYmNS9vbn27dE3YdG1m0kTZmIQfrS1gOdTS32n6iXaME
CyvXZXnXVguVDiZI3a8+zgY+2G22uVsoHw6F1CEUWeScWZcwYFbqXYbLXajf0v8mpGTa2R5y9gcH
x0bkNVjZc2VNRyNoMKoHSGhIQCGQeFVQuCkC5vRqiCQBZaFsNzGy236V9l4GNwbWZlPCE85EJ+hy
jNmWWsNgxIPLzbyY8zlDyUHad3qGvQbvMboI64F13YSsgcu0Xs/pETDjnT8Sg5FWn+4uogRXdx+J
GMJVIkSDdTChAbo66KPCBbz/InbI0BkVkNysQXIXy8hx0xZPlcdjF216B3KxIep/EccmTbPYHxjL
qx9L2MFbMqD50PgRAoRjqMVCkTF+83iOyPgHcMGZ+x7VohHmHgWlwL1un1gYlx8kLVbT3G47NzU4
9jPznzKLXAFEiTvmnLjdEiH0SQ1HA7+/xEn29PqGQ05BxtvHd18Lh99N/eMzeXDUvSHY+DCE3r1k
PoyZR4BX5OosSc1njN8JoJPAJCaS3SLXn2+OoE9ULuVULuHQmqC8yAFqxtoCpICRYMl7WIlxzb0I
+76OWjHE9oEDglXcTMIoWkSB+nIgryZe1TdwDhrJhjfI+ZuMzeC3BNi4FaXEwFkDFSQPTOnQz8D8
AZfbQYiawqBxSUlqBwuO00Jm0S0QsOs1dhtwXK7UsmC8KcSAVNgXlDqmcZD+9C2AcS7qbGHIi7mc
q+XkluMwTDCFz1AX0LdpWyofJ1zwsEwxVbF1G5bzjgsCbGlW4TcV/mhXmLHNanPhFBgSNJ5HEE3M
KAUwdg3wdSTF72HKGjl1CIKnaHIHBjxCoteOjWxMr8Td0mWcR5THMzhsDQFImcayOBiUrsuKkaga
OZFbzsWTlTMtobxjoO5ZmMTAZaV2QiJOArwGBUdJcC9aFbZKwclAB6ZHDiuZmKjlTDG4CG1qjLAJ
d1hNgxTiczJHQZlhsa5C0BXgrGNLWo9jNbiUQvIZCkFysJm+BmrlaC7wTlRrJIUoHTrbqRM0cQcg
Jr2JMWmb4jcGA0mlZhMzu2GwhdgWHAe+gzXzfEwBSvOFS26hCmBd0ls6MFhMvNlyUKDkaGZcBYtI
nQdHLZP8At95pk5C3aEQIaD3xNC83oWB2jIjPErtLBh78NP2UTaQAiZj8DYVmsUK5hmpXTOJi4Kd
XEWbSmUStls5QM2uBU3wKQnsSa/bmWbDI1PwW6lheaKy/HKJPJzWTzVoKEn4mGJcSKFGZtpcA5bq
8pDO2JqV0CuzaabYLvA+PNouG7K4cN5DH5GxKRtIjzMhqowBxRHAYJjRFYgnQY/W648auMR6O+f5
sf6M1Al7nRU+OUK1QzyjR4S949/MUUx9ZH1dTRfiMCuRTk03jpByNyNEKiImOhK3mYwMOJ6As7gm
EkLieWdp2nmmw0sYLF9k+gbmNWU0C/BhJlqyxMVMzjtAEY/1JCgB+d4nEEff9XPoH9gMyBv1AyKC
kXmhRJmQWWjGpA2Bg1LiLQdV4caxZJiM6Lg9JhfKhAG0hMBuSACHFykpIi2oDDGCwlPCykSD5iHA
Y6MUd5kh1405BE/I7kx1iYdMP+piYfxulkQv38TBBAS+KSKnswmU7mlmD7MiTYZ5SmhwbZXSQ5JD
KsIxWW/113R3TXNIO9gzN+SFwvTDfZnA+02VjIHDNzoIyhHWrSFoxl4tk1guEEA52uYM1Cam28DC
Lgu3r5GakTig3ISltVTAgf9HySS3uC174dZBkx5nHYMbDoOiLS4m3XiRSRswboTdBTIwpkom6ET2
FviWySKxTm1JHAmlgUGBiRRBWhsIwYZkNFnMN/gS5am3gbDwH2gsMEsHvA0iWSsEWr4mCSOIxxaN
HlA1PwS1PWmp5i9gVyZdno+xBLoF6/B8Cz0JB+5nYYd07vKAOOMMjb6pQBzfldwPfwNtDabuudjj
FnAhp3nVlm24PMIZ1XqMnJhgg7rlvY3n6GJnJJEuMMygDDjfeO/4bCDHj1e493sOk54OVLcDmNeR
N45SvA7ODmO/+ZAOH4fvPDpx5CiJgO3M6eL3QqwEYkGB4DD7ZuRY1SRIOzdGUiF0ztOrByp9RoIR
gfd0i5hEREy/+Zbpym31k//qnIg6ByPUeXM7zzXMidjm4sDv8S4YtIehICBnihdRftMnFhQ91EB/
APMLRe8Yl9A+7QXzJD/InCHgy+R83jR2g8Rr5rt5/m75jJH0c+xKlT6JIdewC0sEuCF587hhdp/2
A3mCxdRwYRmySN7fNsATgVhyQKjr81ebk6uf98n7GuIZHEQxh+zIoIkckiSJ0EvcYiCck70CXh1o
GOOoQzayXVPlgOrIzMiYzgP1DpHSDCPcRHSCPecSw+p2+gGjKLEYKCMT2zP3XuSdYClPZt5+Jy4l
Sxfa8UpmauXEb1A7UH5gY/VC/cplFawmPagXsA7QNwLJH/yEyJkjyTCw8DVgXdcH08mgpxhUoCIa
i/fSBUfCcDOZ1gqJdWENJhSSiTA6EMDHNJFhxPFEhKYQIhM5nMcw5KhQTJIoySPG0gYVINAgSdod
UkR/sKInZJMOOFgTMGVZoHlLEYclJL5guBOPOQVZIWFRgCCQwIJAoREDDpDUMovW7mXcEoEKCf9D
w62Q6iMzYITgcUlxDdFSsWPUdoH/HekiYxcHLudJFki5Pigol8M0XkRetp0srKiJD2BjT0RytcbU
/wC3lfkjuHBgGCQqBI/eOQSRsOwCcHLS47DpmHY/xIMvyH9BxEpCZFaiJWVLKHpheE7wecJ6bTng
a01LDAhTfpAigdHqOkxmfdkREq5rRDnmMKCgcWQ+Boe8mKt/gth6YhiADAwiSNQNJROy2pS0HGHT
MHGFxYN2xjY4yUHSnRCdU61QigMvRj2szLEMEYCDSAQtPFhM+ZF7ggxsSqYQGjCDT8pq1XuoB4Sx
PvtMG2Z22SiEdXnN5bKEBjUonaAO1WBPMGtQmIAvEC5MewgBBhNoOQ2eDIKkUBqlBI8UkZOXGTVy
L9QcyuiTMEDFgoIIitaYReEaQAgSgmWAV1fwRaaltQT7i3h6EVEgoGANeIcWwXQBmcJF2QOj6gf7
KdFob2MBctwjrQu5CrOOfDZUOB5KQ6Rr0y6u2YftOSdhkQ3ld1Mk6xPPCdBmxkxAqYGh902JOLZK
kKp/4u5IpwoSAhXpLIA=
_______________________________________________
HelenOS-devel mailing list
[email protected]
http://lists.modry.cz/cgi-bin/listinfo/helenos-devel

Reply via email to