[PATCH v6 05/12] lib: sbi: implifying the parameters of printi
Anup Patel
anup at brainfault.org
Mon Jul 3 21:52:55 PDT 2023
On Mon, Jun 12, 2023 at 1:40 PM Xiang W <wxjstz at 126.com> wrote:
>
> The information of sg/b/letbase can be obtained by the type character,
> simplifying the parameter by passing the type directly.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>
Looks good to me.
Reviewed-by: Anup Patel <anup at brainfault.org>
Regards,
Anup
> ---
> lib/sbi/sbi_console.c | 127 +++++++++++++++++-------------------------
> 1 file changed, 50 insertions(+), 77 deletions(-)
>
> diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c
> index 6780ff2..a9a2ed6 100644
> --- a/lib/sbi/sbi_console.c
> +++ b/lib/sbi/sbi_console.c
> @@ -184,15 +184,26 @@ static int prints(char **out, u32 *out_len, const char *string, int width,
> return pc;
> }
>
> -static int printi(char **out, u32 *out_len, long long i, int b, int sg,
> - int width, int flags, int letbase)
> +static int printi(char **out, u32 *out_len, long long i,
> + int width, int flags, int type)
> {
> - char *s, sign, print_buf[PRINT_BUF_LEN];
> int pc = 0;
> - u64 t;
> - unsigned long long u = i;
> + char *s, sign, letbase, print_buf[PRINT_BUF_LEN];
> + unsigned long long u, b, t;
> +
> + b = 10;
> + letbase = 'a';
> + if (type == 'o')
> + b = 8;
> + else if (type == 'x' || type == 'X' || type == 'p' || type == 'P') {
> + b = 16;
> + letbase &= ~0x20;
> + letbase |= type & 0x20;
> + }
>
> - if (sg && b == 10) {
> + u = i;
> + sign = 0;
> + if (type == 'i' || type == 'd') {
> if ((flags & PAD_SIGN) && i > 0)
> sign = '+';
> if (i < 0) {
> @@ -242,9 +253,8 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
> {
> bool flags_done;
> int width, flags, pc = 0;
> - char scr[2], *tout;
> + char type, scr[2], *tout;
> bool use_tbuf = (!out) ? true : false;
> - unsigned long long tmp;
>
> /*
> * The console_tbuf is protected by console_out_lock and
> @@ -315,83 +325,46 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
> }
> if ((*format == 'd') || (*format == 'i')) {
> pc += printi(out, out_len, va_arg(args, int),
> - 10, 1, width, flags, '0');
> - continue;
> - }
> - if (*format == 'x') {
> - pc += printi(out, out_len,
> - va_arg(args, unsigned int), 16, 0,
> - width, flags, 'a');
> + width, flags, *format);
> continue;
> }
> - if (*format == 'X') {
> - pc += printi(out, out_len,
> - va_arg(args, unsigned int), 16, 0,
> - width, flags, 'A');
> + if ((*format == 'u') || (*format == 'x') || (*format == 'X')) {
> + pc += printi(out, out_len, va_arg(args, unsigned int),
> + width, flags, *format);
> continue;
> }
> - if (*format == 'u') {
> - pc += printi(out, out_len,
> - va_arg(args, unsigned int), 10, 0,
> - width, flags, 'a');
> + if ((*format == 'p') || (*format == 'P')) {
> + pc += printi(out, out_len, (uintptr_t)va_arg(args, void*),
> + width, flags, *format);
> continue;
> }
> - if (*format == 'p') {
> - pc += printi(out, out_len,
> - va_arg(args, unsigned long), 16, 0,
> - width, flags, 'a');
> - continue;
> - }
> - if (*format == 'P') {
> - pc += printi(out, out_len,
> - va_arg(args, unsigned long), 16, 0,
> - width, flags, 'A');
> - continue;
> - }
> - if (*format == 'l' && *(format + 1) == 'l') {
> - tmp = va_arg(args, unsigned long long);
> - if (*(format + 2) == 'u') {
> - format += 2;
> - pc += printi(out, out_len, tmp, 10, 0,
> - width, flags, 'a');
> - } else if (*(format + 2) == 'x') {
> - format += 2;
> - pc += printi(out, out_len, tmp, 16, 0,
> - width, flags, 'a');
> - } else if (*(format + 2) == 'X') {
> - format += 2;
> - pc += printi(out, out_len, tmp, 16, 0,
> - width, flags, 'A');
> - } else {
> - format += 1;
> - pc += printi(out, out_len, tmp, 10, 1,
> - width, flags, '0');
> + if (*format == 'l') {
> + type = 'i';
> + if (format[1] == 'l') {
> + ++format;
> + if ((format[1] == 'u')
> + || (format[1] == 'd') || (format[1] == 'i')
> + || (format[1] == 'x') || (format[1] == 'X')) {
> + ++format;
> + type = *format;
> + }
> + pc += printi(out, out_len, va_arg(args, long long),
> + width, flags, type);
> + continue;
> }
> - continue;
> - } else if (*format == 'l') {
> - if (*(format + 1) == 'u') {
> - format += 1;
> - pc += printi(
> - out, out_len,
> - va_arg(args, unsigned long), 10,
> - 0, width, flags, 'a');
> - } else if (*(format + 1) == 'x') {
> - format += 1;
> - pc += printi(
> - out, out_len,
> - va_arg(args, unsigned long), 16,
> - 0, width, flags, 'a');
> - } else if (*(format + 1) == 'X') {
> - format += 1;
> - pc += printi(
> - out, out_len,
> - va_arg(args, unsigned long), 16,
> - 0, width, flags, 'A');
> - } else {
> - pc += printi(out, out_len,
> - va_arg(args, long), 10, 1,
> - width, flags, '0');
> + if ((format[1] == 'u')
> + || (format[1] == 'd') || (format[1] == 'i')
> + || (format[1] == 'x') || (format[1] == 'X')) {
> + ++format;
> + type = *format;
> }
> + if ((type == 'd') || (type == 'i'))
> + pc += printi(out, out_len, va_arg(args, long),
> + width, flags, type);
> + else
> + pc += printi(out, out_len, va_arg(args, unsigned long),
> + width, flags, type);
> + continue;
> }
> if (*format == 'c') {
> /* char are converted to int then pushed on the stack */
> --
> 2.39.2
>
More information about the opensbi
mailing list