svn commit: branches/busybox_scratch/coreutils

aldot at busybox.net aldot at busybox.net
Mon Jul 3 18:29:30 UTC 2006


Author: aldot
Date: 2006-07-03 11:29:24 -0700 (Mon, 03 Jul 2006)
New Revision: 15588

Log:
- shrink printf a bit; Could need some more love..
   text	   data	    bss	    dec	    hex	filename
   1225	      0	      0	   1225	    4c9	coreutils/printf.o.orig
   1189	      0	      0	   1189	    4a5	coreutils/printf.o


Modified:
   branches/busybox_scratch/coreutils/printf.c


Changeset:
Modified: branches/busybox_scratch/coreutils/printf.c
===================================================================
--- branches/busybox_scratch/coreutils/printf.c	2006-07-03 18:11:39 UTC (rev 15587)
+++ branches/busybox_scratch/coreutils/printf.c	2006-07-03 18:29:24 UTC (rev 15588)
@@ -49,9 +49,6 @@
 #include <assert.h>
 #include "busybox.h"
 
-static int print_formatted (char *format, int argc, char **argv);
-static void print_direc (char *start, size_t length,
-			int field_width, int precision, char *argument);
 
 typedef int (*converter)(char *arg, void *result);
 static void multiconvert(char *arg, void *result, converter convert)
@@ -99,34 +96,86 @@
 	}
 }
 
-int printf_main(int argc, char **argv)
+static void print_direc(char *start, size_t length, int field_width,
+		int precision, char *argument)
 {
-	char *format;
-	int args_used;
+	char *p;					/* Null-terminated copy of % directive. */
 
-	if (argc <= 1 || **(argv + 1) == '-') {
-		bb_show_usage();
-	}
+	p = xmalloc((unsigned) (length + 1));
+	strncpy(p, start, length);
+	p[length] = 0;
 
-	format = argv[1];
-	argc -= 2;
-	argv += 2;
-
-	do {
-		args_used = print_formatted(format, argc, argv);
-		argc -= args_used;
-		argv += args_used;
+	switch (p[length - 1]) {
+	case 'd':
+	case 'i':
+		if (field_width < 0) {
+			if (precision < 0)
+				printf(p, xstrtol(argument));
+			else
+				printf(p, precision, xstrtol(argument));
+		} else {
+			if (precision < 0)
+				printf(p, field_width, xstrtol(argument));
+			else
+				printf(p, field_width, precision, xstrtol(argument));
+		}
+		break;
+	case 'o':
+	case 'u':
+	case 'x':
+	case 'X':
+		if (field_width < 0) {
+			if (precision < 0)
+				printf(p, xstrtoul(argument));
+			else
+				printf(p, precision, xstrtoul(argument));
+		} else {
+			if (precision < 0)
+				printf(p, field_width, xstrtoul(argument));
+			else
+				printf(p, field_width, precision, xstrtoul(argument));
+		}
+		break;
+	case 'f':
+	case 'e':
+	case 'E':
+	case 'g':
+	case 'G':
+		if (field_width < 0) {
+			if (precision < 0)
+				printf(p, xstrtod(argument));
+			else
+				printf(p, precision, xstrtod(argument));
+		} else {
+			if (precision < 0)
+				printf(p, field_width, xstrtod(argument));
+			else
+				printf(p, field_width, precision, xstrtod(argument));
+		}
+		break;
+	case 'c':
+		printf(p, *argument);
+		break;
+	case 's':
+		if (field_width < 0) {
+			if (precision < 0)
+				printf(p, argument);
+			else
+				printf(p, precision, argument);
+		} else {
+			if (precision < 0)
+				printf(p, field_width, argument);
+			else
+				printf(p, field_width, precision, argument);
+		}
+		break;
 	}
-	while (args_used > 0 && argc > 0);
 
-/*
-  if (argc > 0)
-    fprintf(stderr, "excess args ignored");
-*/
-
-	return EXIT_SUCCESS;
+	free(p);
 }
 
+
+
 /* Print the text in FORMAT, using ARGV (with ARGC elements) for
    arguments to any `%' directives.
    Return the number of elements of ARGV used.  */
@@ -143,6 +192,9 @@
 	for (f = format; *f; ++f) {
 		switch (*f) {
 		case '%':
+		{
+			char match;
+			int *whom;
 			direc_start = f++;
 			direc_length = 1;
 			field_width = precision = -1;
@@ -162,37 +214,27 @@
 				++f;
 				++direc_length;
 			}
-			if (*f == '*') {
+			match = '*';
+			whom = &field_width;
+try_match:
+			if (*f == match) {
 				++f;
 				++direc_length;
 				if (argc > 0) {
-					field_width = xstrtoul(*argv);
+					*whom = xstrtoul(*argv);
 					++argv;
 					--argc;
 				} else
-					field_width = 0;
+					*whom = 0;
 			} else
-				while (isdigit(*f)) {
+				while ((isdigit)(*f)) {
 					++f;
 					++direc_length;
 				}
-			if (*f == '.') {
-				++f;
-				++direc_length;
-				if (*f == '*') {
-					++f;
-					++direc_length;
-					if (argc > 0) {
-						precision = xstrtoul(*argv);
-						++argv;
-						--argc;
-					} else
-						precision = 0;
-				} else
-					while (isdigit(*f)) {
-						++f;
-						++direc_length;
-					}
+			if (match != '.') {
+				match = '.';
+				whom = &precision;
+				goto try_match;
 			}
 			if (*f == 'l' || *f == 'L' || *f == 'h') {
 				++f;
@@ -212,7 +254,7 @@
 				print_direc(direc_start, direc_length, field_width,
 							precision, "");
 			break;
-
+		}
 		case '\\':
 			if (*++f == 'c')
 				exit(0);
@@ -228,85 +270,31 @@
 	return save_argc - argc;
 }
 
-static void
-print_direc(char *start, size_t length, int field_width, int precision,
-			char *argument)
+int printf_main(int argc, char **argv)
 {
-	char *p;					/* Null-terminated copy of % directive. */
+	char *format;
+	int args_used;
 
-	p = xmalloc((unsigned) (length + 1));
-	strncpy(p, start, length);
-	p[length] = 0;
+	if (argc <= 1 || **(argv + 1) == '-') {
+		bb_show_usage();
+	}
 
-	switch (p[length - 1]) {
-	case 'd':
-	case 'i':
-		if (field_width < 0) {
-			if (precision < 0)
-				printf(p, xstrtol(argument));
-			else
-				printf(p, precision, xstrtol(argument));
-		} else {
-			if (precision < 0)
-				printf(p, field_width, xstrtol(argument));
-			else
-				printf(p, field_width, precision, xstrtol(argument));
-		}
-		break;
+	format = argv[1];
+	argc -= 2;
+	argv += 2;
 
-	case 'o':
-	case 'u':
-	case 'x':
-	case 'X':
-		if (field_width < 0) {
-			if (precision < 0)
-				printf(p, xstrtoul(argument));
-			else
-				printf(p, precision, xstrtoul(argument));
-		} else {
-			if (precision < 0)
-				printf(p, field_width, xstrtoul(argument));
-			else
-				printf(p, field_width, precision, xstrtoul(argument));
-		}
-		break;
-
-	case 'f':
-	case 'e':
-	case 'E':
-	case 'g':
-	case 'G':
-		if (field_width < 0) {
-			if (precision < 0)
-				printf(p, xstrtod(argument));
-			else
-				printf(p, precision, xstrtod(argument));
-		} else {
-			if (precision < 0)
-				printf(p, field_width, xstrtod(argument));
-			else
-				printf(p, field_width, precision, xstrtod(argument));
-		}
-		break;
-
-	case 'c':
-		printf(p, *argument);
-		break;
-
-	case 's':
-		if (field_width < 0) {
-			if (precision < 0)
-				printf(p, argument);
-			else
-				printf(p, precision, argument);
-		} else {
-			if (precision < 0)
-				printf(p, field_width, argument);
-			else
-				printf(p, field_width, precision, argument);
-		}
-		break;
+	do {
+		args_used = print_formatted(format, argc, argv);
+		argc -= args_used;
+		argv += args_used;
 	}
+	while (args_used > 0 && argc > 0);
 
-	free(p);
+/*
+  if (argc > 0)
+    fprintf(stderr, "excess args ignored");
+*/
+
+	return EXIT_SUCCESS;
 }
+




More information about the busybox-cvs mailing list