зеркало из https://github.com/microsoft/git.git
utf8: add function to align a string into given strbuf
Add strbuf_utf8_align() which will align a given string into a strbuf as per given align_type and width. If the width is greater than the string length then no alignment is performed. Helped-by: Eric Sunshine <sunshine@sunshineco.com> Mentored-by: Christian Couder <christian.couder@gmail.com> Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr> Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
574e96a241
Коммит
110dcda50d
21
utf8.c
21
utf8.c
|
@ -644,3 +644,24 @@ int skip_utf8_bom(char **text, size_t len)
|
|||
*text += strlen(utf8_bom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int width,
|
||||
const char *s)
|
||||
{
|
||||
int slen = strlen(s);
|
||||
int display_len = utf8_strnwidth(s, slen, 0);
|
||||
int utf8_compensation = slen - display_len;
|
||||
|
||||
if (display_len >= width) {
|
||||
strbuf_addstr(buf, s);
|
||||
return;
|
||||
}
|
||||
|
||||
if (position == ALIGN_LEFT)
|
||||
strbuf_addf(buf, "%-*s", width + utf8_compensation, s);
|
||||
else if (position == ALIGN_MIDDLE) {
|
||||
int left = (width - display_len) / 2;
|
||||
strbuf_addf(buf, "%*s%-*s", left, "", width - left + utf8_compensation, s);
|
||||
} else if (position == ALIGN_RIGHT)
|
||||
strbuf_addf(buf, "%*s", width + utf8_compensation, s);
|
||||
}
|
||||
|
|
15
utf8.h
15
utf8.h
|
@ -55,4 +55,19 @@ int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
|
|||
*/
|
||||
int is_hfs_dotgit(const char *path);
|
||||
|
||||
typedef enum {
|
||||
ALIGN_LEFT,
|
||||
ALIGN_MIDDLE,
|
||||
ALIGN_RIGHT
|
||||
} align_type;
|
||||
|
||||
/*
|
||||
* Align the string given and store it into a strbuf as per the
|
||||
* 'position' and 'width'. If the given string length is larger than
|
||||
* 'width' than then the input string is not truncated and no
|
||||
* alignment is done.
|
||||
*/
|
||||
void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int width,
|
||||
const char *s);
|
||||
|
||||
#endif
|
||||
|
|
Загрузка…
Ссылка в новой задаче