diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-31 21:09:46 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-31 21:09:46 +0100 |
commit | 6cadd03bbeace1c256ba875c2e6a877f924877cd (patch) | |
tree | 8079ea6f6ccdb1c2cbb2b7813f618837617cb33e /sys/src/9/pc/vga.c | |
parent | 6d99096136278f06f6333f927da34105a8dfe0bf (diff) |
fix utf and rune handling in preparation for 32bit runes
Diffstat (limited to 'sys/src/9/pc/vga.c')
-rw-r--r-- | sys/src/9/pc/vga.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/sys/src/9/pc/vga.c b/sys/src/9/pc/vga.c index 1dae2d193..c325fd4e2 100644 --- a/sys/src/9/pc/vga.c +++ b/sys/src/9/pc/vga.c @@ -119,9 +119,10 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr) static void vgascreenputs(char* s, int n) { - int i, gotdraw; - Rune r; - char buf[4]; + static char rb[UTFmax+1]; + static int nrb; + char *e; + int gotdraw; VGAscr *scr; Rectangle flushr; @@ -146,13 +147,14 @@ vgascreenputs(char* s, int n) flushr = Rect(10000, 10000, -10000, -10000); - while(n > 0){ - i = chartorune(&r, s); - memmove(buf, s, i); - buf[i] = 0; - n -= i; - s += i; - vgascreenputc(scr, buf, &flushr); + e = s + n; + while(s < e){ + rb[nrb++] = *s++; + if(nrb >= UTFmax || fullrune(rb, nrb)){ + rb[nrb] = 0; + vgascreenputc(scr, rb, &flushr); + nrb = 0; + } } flushmemscreen(flushr); |