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

Re: [PATCH v4] Add utf8_fprintf helper which returns correct columns

From
Torsten Bögershausen <tboegi@web.de>
Date
Feb 8, 2013, 06:03 UTC
Message-ID
<51149542.8060307@web.de>
In-Reply-To
<4ea03e99bad13e2910b137fd3991951244fa23f1.1360289411.git.worldhello.net@gmail.com>
On 08.02.13 03:10, Jiang Xin wrote:
Show 71 quoted lines
> 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          | 22 ++++++++++++++++++++++
>  utf8.h          |  1 +
>  3 files changed, 26 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..05925 100644
> --- a/utf8.c
> +++ b/utf8.c
> @@ -430,6 +430,28 @@ 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);
> +
> +	columns = fputs(buf.buf, stream);
> +	/* If no error occurs, returns columns really required with utf8_strwidth. */
> +	if (0 <= columns)
> +		columns = utf8_strwidth(buf.buf);
> +	strbuf_release(&buf);
> +	return columns;
> +}
> +
I don't think we handle the return code from fputs() correctly.
Please dee below for specifications on fprintf(),
something like the following could do:
 
int utf8_fprintf(FILE *stream, const char *format, ...)
{
	struct strbuf buf = STRBUF_INIT;
	va_list arg;
	int columns = 0;
	va_start (arg, format);
	strbuf_vaddf(&buf, format, arg);
	va_end (arg);
	if (EOF != fputs(buf.buf, stream))
		columns = utf8_strwidth(buf.buf);
	strbuf_release(&buf);
	return columns;
}
And as a side note: would fprintf_strwidth() be a better name?
Linux:
RETURN VALUE
       fputc(), putc() and  putchar()  return  the  character  written  as  an
       unsigned char cast to an int or EOF on error.
       puts()  and  fputs()  return a nonnegative number on success, or EOF on
       error.
Mac OS:
COMPATIBILITY
     fputs() now returns a non-negative number (as opposed to 0) on successful
     completion.  As a result, many tests (e.g., "fputs() == 0", "fputs() !=
     0") do not give the desired result.  Use "fputs() != EOF" or "fputs() ==
     EOF" to determine success or failure.
Posix:
RETURN VALUE
       Upon successful completion, fputs() shall return a non-negative number.
       Otherwise, it shall return EOF, set an error indicator for the  stream,
       and set errno to indicate the error.
Previous: Jiang XinNext: Torsten Bögershausen
Message 15 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.