summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/vga.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-12-31 21:09:46 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2012-12-31 21:09:46 +0100
commit6cadd03bbeace1c256ba875c2e6a877f924877cd (patch)
tree8079ea6f6ccdb1c2cbb2b7813f618837617cb33e /sys/src/9/pc/vga.c
parent6d99096136278f06f6333f927da34105a8dfe0bf (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.c22
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);