diff options
| author | Junio C Hamano <gitster@pobox.com> | 2013-02-14 10:29:08 -0800 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2013-02-14 10:29:08 -0800 | 
| commit | 3cc3cf970c5ce477bde78df73614d1efba2b52eb (patch) | |
| tree | 2bcc9526ccf586db926050ee6e01fe2e2e418982 | |
| parent | eb213fc3fce895e1b279247dd5e5fa6c168f90e4 (diff) | |
| parent | c082196575e13dd5960031f213b20e2df989ca18 (diff) | |
| download | git-3cc3cf970c5ce477bde78df73614d1efba2b52eb.tar.gz | |
Merge branch 'jx/utf8-printf-width'
Use a new helper that prints a message and counts its display width
to align the help messages parse-options produces.
* jx/utf8-printf-width:
  Add utf8_fprintf helper that returns correct number of columns
| -rw-r--r-- | parse-options.c | 5 | ||||
| -rw-r--r-- | utf8.c | 21 | ||||
| -rw-r--r-- | utf8.h | 1 | 
3 files changed, 25 insertions, 2 deletions
diff --git a/parse-options.c b/parse-options.c index 67e98a6323..a6ce9efb79 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)) @@ -430,6 +430,27 @@ 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 (0 <= columns) /* keep the error from the I/O */ +		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.   */ @@ -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);  | 
