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:
Junio C Hamano
2008-01-06 19:02:22 -08:00
parent 40f162b04b
commit 396ccf1fcb
2 changed files with 24 additions and 6 deletions

27
utf8.c
View File

@ -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
View File

@ -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);