git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3] Add utf8_fprintf helper which returns correct columns

From
Jiang Xin <worldhello.net@gmail.com>
Date
Feb 6, 2013, 01:16 UTC
Message-ID
<00fcfef24710f03485186a23be82ca3c851d2a99.1360113349.git.worldhello.net@gmail.com>
In-Reply-To
<7vd2weu1sq.fsf@alter.siamese.dyndns.org>

Since command usages can be translated, they may not align well especially when they are translated to CJK. A wrapper utf8_fprintf can help to return the correct columns required.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 parse-options.c |  5 +++--
 utf8.c          | 20 ++++++++++++++++++++
 utf8.h          |  1 +
 3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 67e98..a6ce9e 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -3,6 +3,7 @@
 #include "cache.h"
 #include "commit.h"
 #include "color.h"
+#include "utf8.h"
 
 static int parse_options_usage(struct parse_opt_ctx_t *ctx,
 			       const char * const *usagestr,
@@ -482,7 +483,7 @@ static int usage_argh(const struct option *opts, FILE *outfile)
 			s = literal ? "[%s]" : "[<%s>]";
 	else
 		s = literal ? " %s" : " <%s>";
-	return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
+	return utf8_fprintf(outfile, s, opts->argh ? _(opts->argh) : _("..."));
 }
 
 #define USAGE_OPTS_WIDTH 24
@@ -541,7 +542,7 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx,
 		if (opts->long_name)
 			pos += fprintf(outfile, "--%s", opts->long_name);
 		if (opts->type == OPTION_NUMBER)
-			pos += fprintf(outfile, "-NUM");
+			pos += utf8_fprintf(outfile, _("-NUM"));
 
 		if ((opts->flags & PARSE_OPT_LITERAL_ARGHELP) ||
 		    !(opts->flags & PARSE_OPT_NOARG))
diff --git a/utf8.c b/utf8.c
index a4ee6..52dbd 100644
--- a/utf8.c
+++ b/utf8.c
@@ -430,6 +430,26 @@ int same_encoding(const char *src, const char *dst)
 }
 
 /*
+ * Wrapper for fprintf and returns the total number of columns required
+ * for the printed string, assuming that the string is utf8.
+ */
+int utf8_fprintf(FILE *stream, const char *format, ...)
+{
+	struct strbuf buf = STRBUF_INIT;
+	va_list arg;
+	int columns;
+
+	va_start (arg, format);
+	strbuf_vaddf(&buf, format, arg);
+	va_end (arg);
+
+	fputs(buf.buf, stream);
+	columns = utf8_strwidth(buf.buf);
+	strbuf_release(&buf);
+	return columns;
+}
+
+/*
  * Given a buffer and its encoding, return it re-encoded
  * with iconv.  If the conversion fails, returns NULL.
  */
diff --git a/utf8.h b/utf8.h
index a2142..501b2 100644
--- a/utf8.h
+++ b/utf8.h
@@ -8,6 +8,7 @@ int utf8_strwidth(const char *string);
 int is_utf8(const char *text);
 int is_encoding_utf8(const char *name);
 int same_encoding(const char *, const char *);
+int utf8_fprintf(FILE *, const char *, ...);
 
 void strbuf_add_wrapped_text(struct strbuf *buf,
 		const char *text, int indent, int indent2, int width);
-- 
1.8.1.1.370.g47b6ee8.dirty
Previous: Jiang Xin
Message 20 of 20 in “Get correct column with for options in command usage”
  1. Get correct column with for options in command usageJiang Xin, Feb 5, 2013
  2. Duy NguyenFeb 5, 2013
  3. Duy NguyenFeb 5, 2013
  4. Junio C HamanoFeb 5, 2013
  5. 1/2 Get correct column with for options in command usageJiang Xin, Feb 5, 2013
  6. 2/2 i18n: mark OPTION_NUMBER (-NUM) for translationJiang Xin, Feb 5, 2013
  7. Junio C HamanoFeb 5, 2013
  8. Jiang XinFeb 6, 2013
  9. Junio C HamanoFeb 6, 2013
  10. Jiang XinFeb 6, 2013
  11. Junio C HamanoFeb 6, 2013
  12. Duy NguyenFeb 6, 2013
  13. Junio C HamanoFeb 6, 2013
  14. Add utf8_fprintf helper which returns correct columnsJiang Xin, Feb 8, 2013
  15. Torsten BögershausenFeb 8, 2013
  16. Torsten BögershausenFeb 8, 2013
  17. Jiang XinFeb 8, 2013
  18. Torsten BögershausenFeb 8, 2013
  19. Add utf8_fprintf helper that returns correct columnsJiang Xin, Feb 9, 2013
  20. Add utf8_fprintf helper which returns correct columnsJiang Xin, Feb 6, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.