Add strings as 'b "foo"'
This commit is contained in:
parent
50c5af4290
commit
8a9b0c5513
4 changed files with 56 additions and 46 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
25
lisc/parse.c
25
lisc/parse.c
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue