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