acid: 4-byte Runes

R=rsc
http://codereview.appspot.com/3860041
This commit is contained in:
Russ Cox 2011-01-02 16:01:05 -05:00
parent b567422f98
commit 839c052a93

View file

@ -205,7 +205,7 @@ convflt(Node *r, char *flt)
void void
indir(Map *m, ulong addr, char fmt, Node *r) indir(Map *m, ulong addr, char fmt, Node *r)
{ {
int i; int i, j, k;
u32int ival; u32int ival;
u64int vval; u64int vval;
int ret; int ret;
@ -280,16 +280,19 @@ indir(Map *m, ulong addr, char fmt, Node *r)
break; break;
case 'R': case 'R':
r->type = TSTRING; r->type = TSTRING;
for(i = 0; i < sizeof(buf)-2; i += 2) { assert(sizeof(Rune) == 4);
ret = get1(m, addr, (uchar*)&buf[i], 2); for(i = 0; i < sizeof(buf)-4; i += 4) {
ret = get4(m, addr, &ival);
if (ret < 0) if (ret < 0)
error("indir: %r"); error("indir: %r");
addr += 2; rval = ival;
if(buf[i] == 0 && buf[i+1] == 0) memmove(buf+i, &ival, 4);
addr += 4;
if(ival == 0)
break; break;
} }
buf[i++] = 0; ival = 0;
buf[i] = 0; memmove(buf+i, &ival, 4);
r->store.u.string = runenode((Rune*)buf); r->store.u.string = runenode((Rune*)buf);
break; break;
case 'i': case 'i':