
On 12.12.23 09:52, lukas.funke-oss@weidmueller.com wrote:
From: Lukas Funke lukas.funke@weidmueller.com
Forward '%p' format specifier to the underlying format logic in order to print pointers, especially bitmaps.
Signed-off-by: Lukas Funke lukas.funke@weidmueller.com
(no changes since v1)
cmd/printf.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
diff --git a/cmd/printf.c b/cmd/printf.c index 0c6887e0d6..a90c923871 100644 --- a/cmd/printf.c +++ b/cmd/printf.c @@ -90,6 +90,7 @@ #include <stddef.h> #include <stdio.h> #include <stdlib.h> +#include <linux/bitmap.h>
#define WANT_HEX_ESCAPES 0 #define PRINT_CONVERSION_ERROR 1 @@ -476,6 +477,16 @@ static int get_width_prec(const char *str) return (int)v; }
+static int print_pointer(struct print_inf *inf, char *format,
unsigned int fmt_length, const char *argument)
+{
- u64 value = simple_strtoull(argument, NULL, 0);
- printf_str(inf, format, &value);
- return inf->error;
+}
- /* Print the text in FORMAT, using ARGV for arguments to any '%' directives.
*/
- Return advanced ARGV.
@@ -536,6 +547,24 @@ static char **print_formatted(struct print_inf *inf, char *f, char **argv, int * } } }
if (*f == 'p') {
static const char ptr_format_chars[] = "bl";
++f;
++direc_length;
char *p = strchr(ptr_format_chars, *f);
/* consume whole format token */
while (*f != '\0' && *(p++) == *f) {
++f;
++direc_length;
}
if (print_pointer(inf, direc_start, direc_length, *argv++)) {
printf("`%s': invalid format\n", direc_start);
There are different error codes. PRINT_TRUNCATED_ERROR does not indicate an invalid format.
Best regards
Heinrich
/* causes main() to exit with error */
return saved_argv - 1;
}
f--;
break;
} /* Remove "lLhz" size modifiers, repeatedly. * bash does not like "%lld", but coreutils