support 32 bit runes Reference: /n/sources/patch/saved/bloated-rune-cc Date: Fri Jan 29 07:00:26 CET 2010 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/cc/com.c Fri Jan 29 06:59:20 2010 +++ /sys/src/cmd/cc/com.c Fri Jan 29 06:59:18 2010 @@ -617,10 +617,10 @@ 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)); + outlstring(L"", sizeof(Rune)); o = outlstring(0, 0); } } --- /sys/src/cmd/cc/cc.y Fri Jan 29 06:59:28 2010 +++ /sys/src/cmd/cc/cc.y Fri Jan 29 06:59:26 2010 @@ -853,9 +853,9 @@ 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; @@ -865,16 +865,16 @@ 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: --- /sys/src/cmd/cc/pswt.c Fri Jan 29 06:59:35 2010 +++ /sys/src/cmd/cc/pswt.c Fri Jan 29 06:59:34 2010 @@ -78,10 +78,10 @@ } long -outlstring(ushort *s, long n) +outlstring(Rune *s, long n) { - char buf[2]; - int c; + char buf[UTFmax]; + int c, i; long r; if(suppress) @@ -92,14 +92,14 @@ while(n > 0) { c = *s++; if(align(0, types[TCHAR], Aarg1)) { - buf[0] = c>>8; - buf[1] = c; + for(i = 0; i < sizeof buf; i++) + buf[i] = c>>8*(sizeof buf - i - 1); } else { - buf[0] = c; - buf[1] = c>>8; + for(i = 0; i < sizeof buf; i++) + buf[i] = c>>8*i; } - outstring(buf, 2); - n -= sizeof(ushort); + outstring(buf, sizeof(Rune)); + n -= sizeof(Rune); } return r; } --- /sys/src/cmd/cc/cc.h Fri Jan 29 06:59:44 2010 +++ /sys/src/cmd/cc/cc.h Fri Jan 29 06:59:43 2010 @@ -51,7 +51,7 @@ 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; @@ -335,6 +335,12 @@ TFILE, TOLD, NALLTYPES, + + /* + * bootstrapping + */ +// TRUNE = TUINT, + TRUNE = TUSHORT + sizeof(Rune)==4, }; enum { @@ -735,7 +741,7 @@ 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*); --- /sys/src/cmd/cc/lex.c Fri Jan 29 06:59:56 2010 +++ /sys/src/cmd/cc/lex.c Fri Jan 29 06:59:54 2010 @@ -469,7 +469,7 @@ yyerror("missing '"); peekc = c1; } - yylval.vval = convvtox(c, TUSHORT); + yylval.vval = convvtox(c, TRUNE); return LUCONST; } if(c == '"') { @@ -543,15 +543,15 @@ 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; @@ -1029,7 +1029,7 @@ } else c = GETC(); for(;;) { - if(!isspace(c)) + if(c >= Runeself || !isspace(c)) return c; if(c == '\n') { lineno++;