summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/cga.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/cga.c
parent6d99096136278f06f6333f927da34105a8dfe0bf (diff)
fix utf and rune handling in preparation for 32bit runes
Diffstat (limited to 'sys/src/9/pc/cga.c')
-rw-r--r--sys/src/9/pc/cga.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/src/9/pc/cga.c b/sys/src/9/pc/cga.c
index 2d8c42f2b..b07652b0c 100644
--- a/sys/src/9/pc/cga.c
+++ b/sys/src/9/pc/cga.c
@@ -99,7 +99,9 @@ cgascreenputc(Rune c)
int i;
uchar *p;
- if(c == '\n'){
+ if(c == '\0')
+ return;
+ else if(c == '\n'){
cgapos = cgapos/Width;
cgapos = (cgapos+1)*Width;
}
@@ -138,8 +140,10 @@ cgascreenputc(Rune c)
static void
cgascreenputs(char* s, int n)
{
+ static char rb[UTFmax];
+ static int nrb;
+ char *e;
Rune r;
- int i;
if(!islo()){
/*
@@ -152,11 +156,14 @@ cgascreenputs(char* s, int n)
else
lock(&cgascreenlock);
- while(n > 0){
- i = chartorune(&r, s);
- cgascreenputc(r);
- s += i;
- n -= i;
+ e = s + n;
+ while(s < e){
+ rb[nrb++] = *s++;
+ if(nrb >= UTFmax || fullrune(rb, nrb)){
+ chartorune(&r, rb);
+ cgascreenputc(r);
+ nrb = 0;
+ }
}
unlock(&cgascreenlock);