summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cc
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/cmd/cc
parent6d99096136278f06f6333f927da34105a8dfe0bf (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.h6
-rw-r--r--sys/src/cmd/cc/cc.y12
-rw-r--r--sys/src/cmd/cc/com.c5
-rw-r--r--sys/src/cmd/cc/dpchk.c10
-rw-r--r--sys/src/cmd/cc/lex.c16
-rw-r--r--sys/src/cmd/cc/pswt.c20
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;
}