convert: use skip_iprefix() in validate_encoding()
diff mbox series

Message ID a61b60e4-77f4-10a9-65ff-f78348d4c4b7@web.de
State New
Headers show
Series
  • convert: use skip_iprefix() in validate_encoding()
Related show

Commit Message

René Scharfe Nov. 8, 2019, 8:27 p.m. UTC
Use skip_iprefix() to parse "UTF" case-insensitively instead of checking
with istarts_with(), building an upper-case version and then using
skip_prefix() on it.  This gets rid of duplicate code and of a small
allocation.

Signed-off-by: René Scharfe <l.s.r@web.de>
---
 convert.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

--
2.24.0

Comments

Jeff King Nov. 8, 2019, 10:19 p.m. UTC | #1
On Fri, Nov 08, 2019 at 09:27:34PM +0100, René Scharfe wrote:

> @@ -285,15 +289,10 @@ static int validate_encoding(const char *path, const char *enc,
>  			 */
>  			const char *advise_msg = _(
>  				"The file '%s' contains a byte order "
> -				"mark (BOM). Please use UTF-%s as "
> +				"mark (BOM). Please use UTF-%.*s as "
>  				"working-tree-encoding.");
> -			const char *stripped = NULL;
> -			char *upper = xstrdup_toupper(enc);
> -			upper[strlen(upper)-2] = '\0';
> -			if (skip_prefix(upper, "UTF", &stripped))
> -				skip_prefix(stripped, "-", &stripped);
> -			advise(advise_msg, path, stripped);
> -			free(upper);
> +			int stripped_len = strlen(stripped) - strlen("BE");
> +			advise(advise_msg, path, stripped_len, stripped);

I think we could drop xstrdup_toupper() after this.

Of course it _could_ come in handy in another spot, but in most cases
you can use xstrdup_tolower() interchangeably (e.g., that would have
worked here). And even the tolower() variant is seldom used.

-Peff

Patch
diff mbox series

diff --git a/convert.c b/convert.c
index 25ac525d5f..99f684bf3e 100644
--- a/convert.c
+++ b/convert.c
@@ -270,8 +270,12 @@  static int will_convert_lf_to_crlf(struct text_stat *stats,
 static int validate_encoding(const char *path, const char *enc,
 		      const char *data, size_t len, int die_on_error)
 {
+	const char *stripped;
+
 	/* We only check for UTF here as UTF?? can be an alias for UTF-?? */
-	if (istarts_with(enc, "UTF")) {
+	if (skip_iprefix(enc, "UTF", &stripped)) {
+		skip_prefix(stripped, "-", &stripped);
+
 		/*
 		 * Check for detectable errors in UTF encodings
 		 */
@@ -285,15 +289,10 @@  static int validate_encoding(const char *path, const char *enc,
 			 */
 			const char *advise_msg = _(
 				"The file '%s' contains a byte order "
-				"mark (BOM). Please use UTF-%s as "
+				"mark (BOM). Please use UTF-%.*s as "
 				"working-tree-encoding.");
-			const char *stripped = NULL;
-			char *upper = xstrdup_toupper(enc);
-			upper[strlen(upper)-2] = '\0';
-			if (skip_prefix(upper, "UTF", &stripped))
-				skip_prefix(stripped, "-", &stripped);
-			advise(advise_msg, path, stripped);
-			free(upper);
+			int stripped_len = strlen(stripped) - strlen("BE");
+			advise(advise_msg, path, stripped_len, stripped);
 			if (die_on_error)
 				die(error_msg, path, enc);
 			else {
@@ -308,12 +307,7 @@  static int validate_encoding(const char *path, const char *enc,
 				"mark (BOM). Please use UTF-%sBE or UTF-%sLE "
 				"(depending on the byte order) as "
 				"working-tree-encoding.");
-			const char *stripped = NULL;
-			char *upper = xstrdup_toupper(enc);
-			if (skip_prefix(upper, "UTF", &stripped))
-				skip_prefix(stripped, "-", &stripped);
 			advise(advise_msg, path, stripped, stripped);
-			free(upper);
 			if (die_on_error)
 				die(error_msg, path, enc);
 			else {