Add strings as 'b "foo"'

This commit is contained in:
Ori Bernstein 2016-02-28 20:36:01 -08:00
parent 50c5af4290
commit 8a9b0c5513
4 changed files with 56 additions and 46 deletions

View file

@ -549,9 +549,12 @@ emitdat(Dat *d, FILE *f)
d->u.str, d->u.str, d->u.str d->u.str, d->u.str, d->u.str
); );
break; break;
case DA: case DB:
fprintf(f, "\t.asciz \"%s\"\n", d->u.str); if (d->isstr) {
fprintf(f, "\t.ascii \"%s\"\n", d->u.str);
break; break;
}
/* fallthrough */
default: default:
if (d->isref) if (d->isref)
fprintf(f, "%s %s+%"PRId64"\n", dtoa[d->type], d->u.ref.nam, d->u.ref.off); fprintf(f, "%s %s+%"PRId64"\n", dtoa[d->type], d->u.ref.nam, d->u.ref.off);

View file

@ -429,7 +429,6 @@ struct Dat {
DEnd, DEnd,
DName, DName,
DAlign, DAlign,
DA,
DB, DB,
DH, DH,
DW, DW,
@ -446,6 +445,7 @@ struct Dat {
} ref; } ref;
} u; } u;
char isref; char isref;
char isstr;
}; };

View file

@ -769,10 +769,13 @@ parsetyp()
static void static void
parsedataref(Dat *d) parsedataref(Dat *d)
{ {
int t;
d->isref = 1; d->isref = 1;
d->u.ref.nam = tokval.str; d->u.ref.nam = tokval.str;
d->u.ref.off = 0; d->u.ref.off = 0;
if (peek() == TPlus) { t = peek();
if (t == TPlus) {
next(); next();
if (next() != TInt) if (next() != TInt)
err("invalid token after offset in ref"); err("invalid token after offset in ref");
@ -780,6 +783,13 @@ parsedataref(Dat *d)
} }
} }
static void
parsedatastr(Dat *d)
{
d->isstr = 1;
d->u.str = tokval.str;
}
static void static void
parsedat(void cb(Dat *)) parsedat(void cb(Dat *))
{ {
@ -804,14 +814,9 @@ parsedat(void cb(Dat *))
d.type = DName; d.type = DName;
d.u.str = s; d.u.str = s;
cb(&d); cb(&d);
if (t == TStr) {
d.type = DA;
d.u.str = tokval.str;
d.isref = 0;
cb(&d);
} else {
if (t != TLBrace) if (t != TLBrace)
err("data contents must be { .. } or \" .. \""); err("expected data contents in { .. }");
for (;;) { for (;;) {
switch (nextnl()) { switch (nextnl()) {
default: err("invalid size specifier %c in data", tokval.chr); default: err("invalid size specifier %c in data", tokval.chr);
@ -826,6 +831,7 @@ parsedat(void cb(Dat *))
t = nextnl(); t = nextnl();
do { do {
d.isref = 0; d.isref = 0;
d.isstr = 0;
memset(&d.u, 0, sizeof d.u); memset(&d.u, 0, sizeof d.u);
if (t == TFlts) if (t == TFlts)
d.u.flts = tokval.flts; d.u.flts = tokval.flts;
@ -835,6 +841,8 @@ parsedat(void cb(Dat *))
d.u.num = tokval.num; d.u.num = tokval.num;
else if (t == TGlo) else if (t == TGlo)
parsedataref(&d); parsedataref(&d);
else if (t == TStr)
parsedatastr(&d);
else else
err("constant literal expected"); err("constant literal expected");
cb(&d); cb(&d);
@ -845,7 +853,6 @@ parsedat(void cb(Dat *))
if (t != TComma) if (t != TComma)
err(", or } expected"); err(", or } expected");
} }
}
Done: Done:
d.type = DEnd; d.type = DEnd;
cb(&d); cb(&d);

View file

@ -950,6 +950,6 @@ main()
if (yyparse() != 0) if (yyparse() != 0)
die("parse error"); die("parse error");
for (i=1; i<nglo; i++) for (i=1; i<nglo; i++)
fprintf(of, "data $glo%d = %s\n", i, ini[i]); fprintf(of, "data $glo%d = {b %s, b 0 }\n", i, ini[i]);
return 0; return 0;
} }