mirror of
https://github.com/rfivet/uemacs.git
synced 2024-12-18 15:26:23 -05:00
Handle wide character display based on wcwidth implementation (UTF-16 ready).
This commit is contained in:
parent
d18cfd2925
commit
b0362969a3
2
buffer.c
2
buffer.c
@ -340,7 +340,7 @@ static unsigned int utf8_disp_len( const char *s) {
|
||||
unicode_t c ;
|
||||
|
||||
s += utf8_to_unicode( s, 0, 4, &c) ;
|
||||
len += 1 ; /* single width unicode for now */
|
||||
len += utf8_width( c) ;
|
||||
}
|
||||
|
||||
return len ;
|
||||
|
16
display.c
16
display.c
@ -232,7 +232,7 @@ static int vtputs( const char *s) {
|
||||
|
||||
s += utf8_to_unicode( s, 0, 4, &c) ;
|
||||
vtputc( c) ;
|
||||
n += 1 ; /* Assume non wide char unicode */
|
||||
n += utf8_width( c) ;
|
||||
}
|
||||
|
||||
return n ;
|
||||
@ -569,10 +569,8 @@ void updpos(void)
|
||||
curcol += 2 ; /* displayed as ^c */
|
||||
else if( c >= 0x80 && c <= 0xA0)
|
||||
curcol += 3 ; /* displayed as \xx */
|
||||
else if( c >= 0x3000 && c <= 0x3FFF)
|
||||
curcol += 2 ; /* double width unicode character */
|
||||
else
|
||||
curcol += 1 ;
|
||||
curcol += utf8_width( c) ;
|
||||
}
|
||||
|
||||
/* if extended, flag so and update the virtual line image */
|
||||
@ -585,7 +583,7 @@ void updpos(void)
|
||||
|
||||
/*
|
||||
* upddex:
|
||||
* de-extend any line that derserves it
|
||||
* de-extend any line that deserves it
|
||||
*/
|
||||
void upddex(void)
|
||||
{
|
||||
@ -977,10 +975,10 @@ static int updateline(int row, struct video *vp1, struct video *vp2)
|
||||
|
||||
/* scan through the line and dump it to the screen and
|
||||
the virtual screen array */
|
||||
cp3 = &vp1->v_text[term.t_ncol];
|
||||
while (cp1 < cp3) {
|
||||
while( ttcol < term.t_ncol) {
|
||||
/* TODO: handle double width unicode char at last screen col */
|
||||
TTputc(*cp1);
|
||||
++ttcol;
|
||||
ttcol += utf8_width( *cp1) ;
|
||||
*cp2++ = *cp1++;
|
||||
}
|
||||
|
||||
@ -1048,7 +1046,7 @@ static int updateline(int row, struct video *vp1, struct video *vp2)
|
||||
|
||||
while (cp1 != cp5) { /* Ordinary. */
|
||||
TTputc(*cp1);
|
||||
++ttcol;
|
||||
ttcol += utf8_width( *cp1) ;
|
||||
*cp2++ = *cp1++;
|
||||
}
|
||||
|
||||
|
11
utf8.c
11
utf8.c
@ -1,8 +1,19 @@
|
||||
/* utf8.c -- implements utf8.h, converts between unicode and UTF-8 */
|
||||
|
||||
#define _XOPEN_SOURCE /* wcwidth in wchar.h */
|
||||
|
||||
#include "utf8.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <wchar.h>
|
||||
|
||||
/*
|
||||
* Display width of UTF-8 character
|
||||
*/
|
||||
unsigned utf8_width( unicode_t c) {
|
||||
assert( sizeof( wchar_t) == 2) ; /* wcwidth only handle UTF-16 */
|
||||
return (c < 0x10000) ? (unsigned) wcwidth( (wchar_t) c) : 2 ;
|
||||
}
|
||||
|
||||
/*
|
||||
* utf8_to_unicode()
|
||||
|
Loading…
Reference in New Issue
Block a user