utf8: pick_one_utf8_char()
utf8_width() function was doing two different things. To pick a valid character from UTF-8 stream, and compute the display width of that character. This splits the former to a separate function pick_one_utf8_char(). Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
27
utf8.c
27
utf8.c
@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
/* This code is originally from http://www.cl.cam.ac.uk/~mgk25/ucs/ */
|
/* This code is originally from http://www.cl.cam.ac.uk/~mgk25/ucs/ */
|
||||||
|
|
||||||
typedef unsigned int ucs_char_t; /* assuming 32bit int */
|
|
||||||
|
|
||||||
struct interval {
|
struct interval {
|
||||||
int first;
|
int first;
|
||||||
int last;
|
int last;
|
||||||
@ -153,11 +151,14 @@ static int git_wcwidth(ucs_char_t ch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function returns the number of columns occupied by the character
|
* Pick one ucs character starting from the location *start points at,
|
||||||
* pointed to by the variable start. The pointer is updated to point at
|
* and return it, while updating the *start pointer to point at the
|
||||||
* the next character. If it was not valid UTF-8, the pointer is set to NULL.
|
* end of that character.
|
||||||
|
*
|
||||||
|
* If the string was not a valid UTF-8, *start pointer is set to NULL
|
||||||
|
* and the return value is undefined.
|
||||||
*/
|
*/
|
||||||
int utf8_width(const char **start)
|
ucs_char_t pick_one_utf8_char(const char **start)
|
||||||
{
|
{
|
||||||
unsigned char *s = (unsigned char *)*start;
|
unsigned char *s = (unsigned char *)*start;
|
||||||
ucs_char_t ch;
|
ucs_char_t ch;
|
||||||
@ -208,6 +209,20 @@ invalid:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function returns the number of columns occupied by the character
|
||||||
|
* pointed to by the variable start. The pointer is updated to point at
|
||||||
|
* the next character. If it was not valid UTF-8, the pointer is set to
|
||||||
|
* NULL.
|
||||||
|
*/
|
||||||
|
int utf8_width(const char **start)
|
||||||
|
{
|
||||||
|
ucs_char_t ch = pick_one_utf8_char(start);
|
||||||
|
if (!*start)
|
||||||
|
return 0;
|
||||||
return git_wcwidth(ch);
|
return git_wcwidth(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
utf8.h
3
utf8.h
@ -1,6 +1,9 @@
|
|||||||
#ifndef GIT_UTF8_H
|
#ifndef GIT_UTF8_H
|
||||||
#define GIT_UTF8_H
|
#define GIT_UTF8_H
|
||||||
|
|
||||||
|
typedef unsigned int ucs_char_t; /* assuming 32bit int */
|
||||||
|
|
||||||
|
ucs_char_t pick_one_utf8_char(const char **start);
|
||||||
int utf8_width(const char **start);
|
int utf8_width(const char **start);
|
||||||
int is_utf8(const char *text);
|
int is_utf8(const char *text);
|
||||||
int is_encoding_utf8(const char *name);
|
int is_encoding_utf8(const char *name);
|
||||||
|
Reference in New Issue
Block a user