[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