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/cmd/cc | |
parent | 6d99096136278f06f6333f927da34105a8dfe0bf (diff) |
fix utf and rune handling in preparation for 32bit runes
Diffstat (limited to 'sys/src/cmd/cc')
-rw-r--r-- | sys/src/cmd/cc/cc.h | 6 | ||||
-rw-r--r-- | sys/src/cmd/cc/cc.y | 12 | ||||
-rw-r--r-- | sys/src/cmd/cc/com.c | 5 | ||||
-rw-r--r-- | sys/src/cmd/cc/dpchk.c | 10 | ||||
-rw-r--r-- | sys/src/cmd/cc/lex.c | 16 | ||||
-rw-r--r-- | sys/src/cmd/cc/pswt.c | 20 |
6 files changed, 38 insertions, 31 deletions
diff --git a/sys/src/cmd/cc/cc.h b/sys/src/cmd/cc/cc.h index d66faaa11..01eb04562 100644 --- a/sys/src/cmd/cc/cc.h +++ b/sys/src/cmd/cc/cc.h @@ -51,7 +51,7 @@ struct Node double fconst; /* fp constant */ vlong vconst; /* non fp const */ char* cstring; /* character string */ - ushort* rstring; /* rune string */ + Rune* rstring; /* rune string */ Sym* sym; Type* type; @@ -336,6 +336,8 @@ enum TFILE, TOLD, NALLTYPES, + + TRUNE = sizeof(Rune)==4? TUINT: TUSHORT, }; enum { @@ -740,7 +742,7 @@ void gclean(void); void gextern(Sym*, Node*, long, long); void ginit(void); long outstring(char*, long); -long outlstring(ushort*, long); +long outlstring(Rune*, long); void sextern(Sym*, Node*, long, long); void xcom(Node*); long exreg(Type*); diff --git a/sys/src/cmd/cc/cc.y b/sys/src/cmd/cc/cc.y index 09b788598..eff930b23 100644 --- a/sys/src/cmd/cc/cc.y +++ b/sys/src/cmd/cc/cc.y @@ -855,9 +855,9 @@ lstring: LLSTRING { $$ = new(OLSTRING, Z, Z); - $$->type = typ(TARRAY, types[TUSHORT]); - $$->type->width = $1.l + sizeof(ushort); - $$->rstring = (ushort*)$1.s; + $$->type = typ(TARRAY, types[TRUNE]); + $$->type->width = $1.l + sizeof(Rune); + $$->rstring = (Rune*)$1.s; $$->sym = symstring; $$->etype = TARRAY; $$->class = CSTATIC; @@ -867,16 +867,16 @@ lstring: char *s; int n; - n = $1->type->width - sizeof(ushort); + n = $1->type->width - sizeof(Rune); s = alloc(n+$2.l+MAXALIGN); memcpy(s, $1->rstring, n); memcpy(s+n, $2.s, $2.l); - *(ushort*)(s+n+$2.l) = 0; + *(Rune*)(s+n+$2.l) = 0; $$ = $1; $$->type->width += $2.l; - $$->rstring = (ushort*)s; + $$->rstring = (Rune*)s; } zelist: diff --git a/sys/src/cmd/cc/com.c b/sys/src/cmd/cc/com.c index 8ff7c4663..a957c3acd 100644 --- a/sys/src/cmd/cc/com.c +++ b/sys/src/cmd/cc/com.c @@ -633,10 +633,11 @@ tcomo(Node *n, int f) break; case OLSTRING: - if(n->type->link != types[TUSHORT]) { + if(n->type->link != types[TRUNE]) { o = outstring(0, 0); while(o & 3) { - outlstring(L"", sizeof(ushort)); + Rune str[1] = {0}; + outlstring(str, sizeof(Rune)); o = outlstring(0, 0); } } diff --git a/sys/src/cmd/cc/dpchk.c b/sys/src/cmd/cc/dpchk.c index 99a49ee5a..aa7d468b8 100644 --- a/sys/src/cmd/cc/dpchk.c +++ b/sys/src/cmd/cc/dpchk.c @@ -67,13 +67,14 @@ getflag(char *s) { Bits flag; int f; - char *fmt; + char *fmt, *e; Rune c; fmt = fmtbuf; + e = fmtbuf + sizeof(fmtbuf)-1; flag = zbits; nstar = 0; - for(;;) { + while(fmt < e){ s += chartorune(&c, s); fmt += runetochar(fmt, &c); if(c == 0 || c >= nelem(flagbits)) @@ -175,7 +176,7 @@ pragvararg(void) { Sym *s; int n, c; - char *t; + char *t, *e; Rune r; Type *ty; @@ -225,12 +226,15 @@ cktype: if(c != '"') goto bad; t = fmtbuf; + e = t + sizeof(fmtbuf)-1; for(;;) { r = getr(); if(r == ' ' || r == '\n') goto bad; if(r == '"') break; + if(t >= e) + goto bad; t += runetochar(t, &r); } *t = 0; diff --git a/sys/src/cmd/cc/lex.c b/sys/src/cmd/cc/lex.c index 68a566ba0..48da7339f 100644 --- a/sys/src/cmd/cc/lex.c +++ b/sys/src/cmd/cc/lex.c @@ -467,7 +467,7 @@ l1: yyerror("missing '"); peekc = c1; } - yylval.vval = convvtox(c, TUSHORT); + yylval.vval = convvtox(c, TRUNE); return LUCONST; } if(c == '"') { @@ -541,15 +541,15 @@ l1: c = escchar('"', 1, 0); if(c == EOF) break; - cp = allocn(cp, c1, sizeof(ushort)); - *(ushort*)(cp + c1) = c; - c1 += sizeof(ushort); + cp = allocn(cp, c1, sizeof(Rune)); + *(Rune*)(cp + c1) = c; + c1 += sizeof(Rune); } yylval.sval.l = c1; do { - cp = allocn(cp, c1, sizeof(ushort)); - *(ushort*)(cp + c1) = 0; - c1 += sizeof(ushort); + cp = allocn(cp, c1, sizeof(Rune)); + *(Rune*)(cp + c1) = 0; + c1 += sizeof(Rune); } while(c1 & MAXALIGN); yylval.sval.s = cp; return LLSTRING; @@ -1027,7 +1027,7 @@ getnsc(void) } else c = GETC(); for(;;) { - if(!isspace(c)) + if(c >= Runeself || !isspace(c)) return c; if(c == '\n') { lineno++; diff --git a/sys/src/cmd/cc/pswt.c b/sys/src/cmd/cc/pswt.c index df1cda4a4..1eb495595 100644 --- a/sys/src/cmd/cc/pswt.c +++ b/sys/src/cmd/cc/pswt.c @@ -132,28 +132,28 @@ casf(void) } long -outlstring(ushort *s, long n) +outlstring(Rune *s, long n) { - char buf[2]; - int c; + char buf[sizeof(Rune)]; + int c, i; long r; if(suppress) return nstring; - while(nstring & 1) + while(nstring % sizeof buf) outstring("", 1); r = nstring; while(n > 0) { c = *s++; if(align(0, types[TCHAR], Aarg1)) { - buf[0] = c>>8; - buf[1] = c; + for(i = sizeof buf; i > 0; c >>= 8) + buf[--i] = c; } else { - buf[0] = c; - buf[1] = c>>8; + for(i = 0; i < sizeof buf; c >>= 8) + buf[i++] = c; } - outstring(buf, 2); - n -= sizeof(ushort); + outstring(buf, sizeof buf); + n -= sizeof buf; } return r; } |