coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/4] stat: refactor printf directive parsing


From: Pádraig Brady
Subject: [PATCH 2/4] stat: refactor printf directive parsing
Date: Mon, 3 Jun 2019 03:55:50 +0100

* src/stat.c (format_code_offset): A new function refactored
from print_it() and format_to_mask().
---
 src/stat.c | 49 ++++++++++++++++++++++++-------------------------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/src/stat.c b/src/stat.c
index 1cb9552..fe52e0f 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -1078,6 +1078,17 @@ print_esc_char (char c)
   putchar (c);
 }
 
+static size_t __attribute__((pure))
+format_code_offset (char const* directive)
+{
+  size_t len = strspn (directive + 1, printf_flags);
+  char const *fmt_char = directive + len + 1;
+  fmt_char += strspn (fmt_char, digits);
+  if (*fmt_char == '.')
+    fmt_char += 1 + strspn (fmt_char + 1, digits);
+  return fmt_char - directive;
+}
+
 /* Print the information specified by the format string, FORMAT,
    calling PRINT_FUNC for each %-directive encountered.
    Return zero upon success, nonzero upon failure.  */
@@ -1107,33 +1118,28 @@ print_it (char const *format, int fd, char const 
*filename,
         {
         case '%':
           {
-            size_t len = strspn (b + 1, printf_flags);
-            char const *fmt_char = b + len + 1;
-            fmt_char += strspn (fmt_char, digits);
-            if (*fmt_char == '.')
-              fmt_char += 1 + strspn (fmt_char + 1, digits);
-            len = fmt_char - (b + 1);
-            unsigned int fmt_code = *fmt_char;
-            memcpy (dest, b, len + 1);
-
-            b = fmt_char;
-            switch (fmt_code)
+            size_t len = format_code_offset (b);
+            char const *fmt_char = b + len;
+            memcpy (dest, b, len);
+            b += len;
+
+            switch (*fmt_char)
               {
               case '\0':
                 --b;
                 FALLTHROUGH;
               case '%':
-                if (0 < len)
+                if (1 < len)
                   {
-                    dest[len + 1] = *fmt_char;
-                    dest[len + 2] = '\0';
+                    dest[len] = *fmt_char;
+                    dest[len + 1] = '\0';
                     die (EXIT_FAILURE, 0, _("%s: invalid directive"),
                          quote (dest));
                   }
                 putchar ('%');
                 break;
               default:
-                fail |= print_func (dest, len + 1, fmt_code,
+                fail |= print_func (dest, len, to_uchar (*fmt_char),
                                     fd, filename, data);
                 break;
               }
@@ -1461,17 +1467,10 @@ format_to_mask (char const *format)
       if (*b != '%')
         continue;
 
-      size_t len = strspn (b + 1, printf_flags);
-      char const *fmt_char = b + len + 1;
-      fmt_char += strspn (fmt_char, digits);
-      if (*fmt_char == '.')
-        fmt_char += 1 + strspn (fmt_char + 1, digits);
-      char fmt_code = *fmt_char;
-
-      b = fmt_char;
-      if (fmt_code == '\0')
+      b += format_code_offset (b);
+      if (*b == '\0')
         break;
-      mask |= fmt_to_mask (fmt_code);
+      mask |= fmt_to_mask (*b);
     }
   return mask;
 }
-- 
2.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]