free: code shrink

function                                             old     new   delta
free_main                                            330     302     -28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/procps/free.c b/procps/free.c
index e8bea50..a941b62 100644
--- a/procps/free.c
+++ b/procps/free.c
@@ -15,54 +15,67 @@
 int free_main(int argc UNUSED_PARAM, char **argv)
 {
 	struct sysinfo info;
+	unsigned mem_unit;
+
+#if ENABLE_DESKTOP
+	if (argv[1] && argv[1][0] == '-')
+		bb_show_usage();
+#endif
+
 	sysinfo(&info);
 
 	/* Kernels prior to 2.4.x will return info.mem_unit==0, so cope... */
-	if (info.mem_unit == 0) {
-		info.mem_unit=1;
+	mem_unit = 1;
+	if (info.mem_unit != 0) {
+		mem_unit = info.mem_unit;
 	}
-	if (info.mem_unit == 1) {
-		info.mem_unit=1024;
 
-		/* TODO:  Make all this stuff not overflow when mem >= 4 Gib */
-		info.totalram/=info.mem_unit;
-		info.freeram/=info.mem_unit;
+	/* Convert values to kbytes */
+	if (mem_unit == 1) {
+		info.totalram >>= 10;
+		info.freeram >>= 10;
 #if BB_MMU
-		info.totalswap/=info.mem_unit;
-		info.freeswap/=info.mem_unit;
+		info.totalswap >>= 10;
+		info.freeswap >>= 10;
 #endif
-		info.sharedram/=info.mem_unit;
-		info.bufferram/=info.mem_unit;
+		info.sharedram >>= 10;
+		info.bufferram >>= 10;
 	} else {
-		info.mem_unit/=1024;
-		/* TODO:  Make all this stuff not overflow when mem >= 4 Gib */
-		info.totalram*=info.mem_unit;
-		info.freeram*=info.mem_unit;
+		mem_unit >>= 10;
+		/* TODO:  Make all this stuff not overflow when mem >= 4 Tb */
+		info.totalram *= mem_unit;
+		info.freeram *= mem_unit;
 #if BB_MMU
-		info.totalswap*=info.mem_unit;
-		info.freeswap*=info.mem_unit;
+		info.totalswap *= mem_unit;
+		info.freeswap *= mem_unit;
 #endif
-		info.sharedram*=info.mem_unit;
-		info.bufferram*=info.mem_unit;
+		info.sharedram *= mem_unit;
+		info.bufferram *= mem_unit;
 	}
 
-	if (argv[1] && argv[1][0] == '-')
-		bb_show_usage();
-
-	printf("%6s%13s%13s%13s%13s%13s\n", "", "total", "used", "free",
-			"shared", "buffers");
-
-	printf("%6s%13ld%13ld%13ld%13ld%13ld\n", "Mem:", info.totalram,
-			info.totalram-info.freeram, info.freeram,
-			info.sharedram, info.bufferram);
-
+	printf("      %13s%13s%13s%13s%13s\n",
+		"total",
+		"used",
+		"free",
+		"shared", "buffers" /* swap and total don't have these columns */
+	);
+	printf("%6s%13lu%13lu%13lu%13lu%13lu\n", "Mem:",
+		info.totalram,
+		info.totalram - info.freeram,
+		info.freeram,
+		info.sharedram, info.bufferram
+	);
 #if BB_MMU
-	printf("%6s%13ld%13ld%13ld\n", "Swap:", info.totalswap,
-			info.totalswap-info.freeswap, info.freeswap);
-
-	printf("%6s%13ld%13ld%13ld\n", "Total:", info.totalram+info.totalswap,
-			(info.totalram-info.freeram)+(info.totalswap-info.freeswap),
-			info.freeram+info.freeswap);
+	printf("%6s%13lu%13lu%13lu\n", "Swap:",
+		info.totalswap,
+		info.totalswap - info.freeswap,
+		info.freeswap
+	);
+	printf("%6s%13lu%13lu%13lu\n", "Total:",
+		info.totalram + info.totalswap,
+		(info.totalram - info.freeram) + (info.totalswap - info.freeswap),
+		info.freeram + info.freeswap
+	);
 #endif
 	return EXIT_SUCCESS;
 }