From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2178) id 96300383A336; Mon, 23 May 2022 09:08:25 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 96300383A336 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Florian Weimer To: glibc-cvs@sourceware.org Subject: [glibc] vfprintf: Consolidate some multibyte/wide character processing X-Act-Checkin: glibc X-Git-Author: Florian Weimer X-Git-Refname: refs/heads/master X-Git-Oldrev: 5442ea7ffe79dfef3b89e21f46211cc42d347210 X-Git-Newrev: 859e7a00af63ca0c28092c57316e9b832ceafb5e Message-Id: <20220523090825.96300383A336@sourceware.org> Date: Mon, 23 May 2022 09:08:25 +0000 (GMT) X-BeenThere: glibc-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Glibc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 May 2022 09:08:25 -0000 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=859e7a00af63ca0c28092c57316e9b832ceafb5e commit 859e7a00af63ca0c28092c57316e9b832ceafb5e Author: Florian Weimer Date: Mon May 23 10:08:18 2022 +0200 vfprintf: Consolidate some multibyte/wide character processing form_character and form_string processing a sufficiently similar that the logic can be shared. Reviewed-by: Adhemerval Zanella Diff: --- stdio-common/vfprintf-process-arg.c | 130 ++++++++++++------------------------ 1 file changed, 43 insertions(+), 87 deletions(-) diff --git a/stdio-common/vfprintf-process-arg.c b/stdio-common/vfprintf-process-arg.c index a28afce7de..4fe369e111 100644 --- a/stdio-common/vfprintf-process-arg.c +++ b/stdio-common/vfprintf-process-arg.c @@ -335,29 +335,20 @@ LABEL (form_strerror): goto LABEL (print_string); } -#ifdef COMPILE_WPRINTF LABEL (form_character): /* Character. */ if (is_long) goto LABEL (form_wcharacter); --width; /* Account for the character itself. */ if (!left) - PAD (L' '); + PAD (L_(' ')); +#ifdef COMPILE_WPRINTF outchar (__btowc ((unsigned char) process_arg_int ())); /* Promoted. */ +#else + outchar ((unsigned char) process_arg_int ()); /* Promoted. */ +#endif if (left) - PAD (L' '); - break; - -LABEL (form_wcharacter): - { - /* Wide character. */ - --width; - if (!left) - PAD (L' '); - outchar (process_arg_wchar_t ()); - if (left) - PAD (L' '); - } + PAD (L_(' ')); break; LABEL (form_string): @@ -366,8 +357,11 @@ LABEL (form_string): /* The string argument could in fact be `char *' or `wchar_t *'. But this should not make a difference here. */ +#ifdef COMPILE_WPRINTF string = (CHAR_T *) process_arg_wstring (); - +#else + string = (CHAR_T *) process_arg_string (); +#endif /* Entry point for printing other strings. */ LABEL (print_string): @@ -387,21 +381,39 @@ LABEL (form_string): } else if (!is_long && spec != L_('S')) { +#ifdef COMPILE_WPRINTF done = outstring_converted_wide_string (s, (const char *) string, prec, width, left, done); if (done < 0) goto all_done; /* The padding has already been written. */ break; +#else + if (prec != -1) + /* Search for the end of the string, but don't search past + the length (in bytes) specified by the precision. */ + len = __strnlen (string, prec); + else + len = strlen (string); +#endif } else { +#ifdef COMPILE_WPRINTF if (prec != -1) /* Search for the end of the string, but don't search past the length specified by the precision. */ len = __wcsnlen (string, prec); else len = __wcslen (string); +#else + done = outstring_converted_wide_string + (s, (const wchar_t *) string, prec, width, left, done); + if (done < 0) + goto all_done; + /* The padding has already been written. */ + break; +#endif } if ((width -= len) < 0) @@ -411,25 +423,27 @@ LABEL (form_string): } if (!left) - PAD (L' '); + PAD (L_(' ')); outstring (string, len); if (left) - PAD (L' '); + PAD (L_(' ')); } break; -#else /* !COMPILE_WPRINTF */ -LABEL (form_character): - /* Character. */ - if (is_long) - goto LABEL (form_wcharacter); - --width; /* Account for the character itself. */ - if (!left) - PAD (' '); - outchar ((unsigned char) process_arg_int ()); /* Promoted. */ - if (left) - PAD (' '); + +#ifdef COMPILE_WPRINTF +LABEL (form_wcharacter): + { + /* Wide character. */ + --width; + if (!left) + PAD (L' '); + outchar (process_arg_wchar_t ()); + if (left) + PAD (L' '); + } break; +#else /* !COMPILE_WPRINTF */ LABEL (form_wcharacter): { /* Wide character. */ @@ -453,63 +467,5 @@ LABEL (form_wcharacter): PAD (' '); } break; - -LABEL (form_string): - { - size_t len; - - /* The string argument could in fact be `char *' or `wchar_t *'. - But this should not make a difference here. */ - string = (char *) process_arg_string (); - - /* Entry point for printing other strings. */ - LABEL (print_string): - - if (string == NULL) - { - /* Write "(null)" if there's space. */ - if (prec == -1 || prec >= (int) sizeof (null) - 1) - { - string = (char *) null; - len = sizeof (null) - 1; - } - else - { - string = (char *) ""; - len = 0; - } - } - else if (!is_long && spec != L_('S')) - { - if (prec != -1) - /* Search for the end of the string, but don't search past - the length (in bytes) specified by the precision. */ - len = __strnlen (string, prec); - else - len = strlen (string); - } - else - { - done = outstring_converted_wide_string - (s, (const wchar_t *) string, prec, width, left, done); - if (done < 0) - goto all_done; - /* The padding has already been written. */ - break; - } - - if ((width -= len) < 0) - { - outstring (string, len); - break; - } - - if (!left) - PAD (' '); - outstring (string, len); - if (left) - PAD (' '); - } - break; #endif /* !COMPILE_WPRINTF */ }