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/cga.c | |
parent | 6d99096136278f06f6333f927da34105a8dfe0bf (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.c | 21 |
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); |