public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Florian Weimer <fw@sourceware.org>
To: glibc-cvs@sourceware.org
Subject: [glibc] vfprintf: Consolidate some multibyte/wide character processing
Date: Mon, 23 May 2022 09:08:25 +0000 (GMT)	[thread overview]
Message-ID: <20220523090825.96300383A336@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=859e7a00af63ca0c28092c57316e9b832ceafb5e

commit 859e7a00af63ca0c28092c57316e9b832ceafb5e
Author: Florian Weimer <fweimer@redhat.com>
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  <adhemerval.zanella@linaro.org>

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 */
 }


                 reply	other threads:[~2022-05-23  9:08 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220523090825.96300383A336@sourceware.org \
    --to=fw@sourceware.org \
    --cc=glibc-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).