Bug 624 wants quoted char support for printf, so you can do something like: printf '%d\n' '"x"' and have it print out 120. This is the smallest implementation I can think of at the moment.
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -1,20 +1,11 @@ | |
| /* vi: set sw=4 ts=4: */ | |
| /* printf - format and print data | |
| - | Copyright (C) 90, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. |
| - | This program is free software; you can redistribute it and/or modify |
| - | it under the terms of the GNU General Public License as published by |
| - | the Free Software Foundation; either version 2, or (at your option) |
| - | any later version. |
| + | Copyright 1999 Dave Cinege |
| + | Portions copyright (C) 1990-1996 Free Software Foundation, Inc. |
| - | This program is distributed in the hope that it will be useful, |
| - | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| - | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| - | GNU General Public License for more details. |
| - | |
| - | You should have received a copy of the GNU General Public License |
| - | along with this program; if not, write to the Free Software Foundation, |
| - | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
| + | Licensed under GPL v2 or later, see file LICENSE in this tarball for details. |
| + | */ |
| /* Usage: printf format [argument...] | |
| @@ -58,14 +49,56 @@ | |
| #include <assert.h> | |
| #include "busybox.h" | |
| - | static double xstrtod __P((char *s)); |
| - | static long xstrtol __P((char *s)); |
| - | static unsigned long xstrtoul __P((char *s)); |
| - | static void print_esc_string __P((char *str)); |
| static int print_formatted __P((char *format, int argc, char **argv)); | |
| static void print_direc __P( (char *start, size_t length, | |
| int field_width, int precision, char *argument)); | |
| + | typedef int (*converter)(char *arg, void *result); |
| + | void multiconvert(char *arg, void *result, converter convert) |
| + | { |
| + | char s[16]; |
| + | if (*arg == '"' || *arg == '\'') { |
| + | sprintf(s,"%d",(unsigned)*(++arg)); |
| + | arg=s; |
| + | } |
| + | if(convert(arg,result)) fprintf(stderr, "%s", arg); |
| + | } |
| + | |
| + | static unsigned long xstrtoul(char *arg) |
| + | { |
| + | unsigned long result; |
| + | |
| + | multiconvert(arg,&result, (converter)safe_strtoul); |
| + | return result; |
| + | } |
| + | |
| + | static long xstrtol(char *arg) |
| + | { |
| + | long result; |
| + | multiconvert(arg, &result, (converter)safe_strtol); |
| + | return result; |
| + | } |
| + | |
| + | static double xstrtod(char *arg) |
| + | { |
| + | double result; |
| + | multiconvert(arg, &result, (converter)safe_strtod); |
| + | return result; |
| + | } |
| + | |
| + | static void print_esc_string(char *str) |
| + | { |
| + | for (; *str; str++) { |
| + | if (*str == '\\') { |
| + | str++; |
| + | putchar(bb_process_escape_sequence((const char **)&str)); |
| + | } else { |
| + | putchar(*str); |
| + | } |
| + | |
| + | } |
| + | } |
| + | |
| int printf_main(int argc, char **argv) | |
| { | |
| char *format; | |
| @@ -277,40 +310,3 @@ print_direc(char *start, size_t length, int field_width, int precision, | |
| free(p); | |
| } | |
| - | |
| - | static unsigned long xstrtoul(char *arg) |
| - | { |
| - | unsigned long result; |
| - | if (safe_strtoul(arg, &result)) |
| - | fprintf(stderr, "%s", arg); |
| - | return result; |
| - | } |
| - | |
| - | static long xstrtol(char *arg) |
| - | { |
| - | long result; |
| - | if (safe_strtol(arg, &result)) |
| - | fprintf(stderr, "%s", arg); |
| - | return result; |
| - | } |
| - | |
| - | static double xstrtod(char *arg) |
| - | { |
| - | double result; |
| - | if (safe_strtod(arg, &result)) |
| - | fprintf(stderr, "%s", arg); |
| - | return result; |
| - | } |
| - | |
| - | static void print_esc_string(char *str) |
| - | { |
| - | for (; *str; str++) { |
| - | if (*str == '\\') { |
| - | str++; |
| - | putchar(bb_process_escape_sequence((const char **)&str)); |
| - | } else { |
| - | putchar(*str); |
| - | } |
| - | |
| - | } |
| - | } |