From 2f243de6ce9402f880677a07b832c0e56a7f688d Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 29 Aug 2022 21:57:58 +0200 Subject: many things ,varags --- bootstrap/cgen.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'bootstrap') diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c index e4ba1fd..0bd7851 100644 --- a/bootstrap/cgen.c +++ b/bootstrap/cgen.c @@ -64,6 +64,7 @@ pristring(const char *s, u64 n) { static void genexpr(struct expr *expr); static void geniniex(struct expr *ex); +static void geneuiniex(struct expr *ex); void pri(const char *fmt, ...) { @@ -127,7 +128,8 @@ pri(const char *fmt, ...) { genexpr(va_arg(ap, struct expr *)); break; case 'n': - geniniex(va_arg(ap, struct expr *)); + ; struct expr *ex = va_arg(ap, struct expr *); + ex->t == Eini ? geniniex(ex) : ex->t == Eeuini ? geneuiniex(ex) : assert(0); break; default: fprintf(outfp, "pri(): bad fmt '%%%c'\n", c); @@ -150,12 +152,12 @@ geniniex(struct expr *ex) { for (int i = 0; i < ex->ini.args.n; ++i) { struct iniarg *arg = &ex->ini.args.d[i]; if (ex->ty->t == TYarr) - if (arg->ex.t == Eini) + if (arg->ex.t == Eini || arg->ex.t == Eeuini) pri("[%I] = %n, ", arg->idx, &arg->ex); else pri("[%I] = %e, ", arg->idx, &arg->ex); else - if (arg->ex.t == Eini) + if (arg->ex.t == Eini || arg->ex.t == Eeuini) pri(".%s_ = %n, ", arg->fld, &arg->ex); else pri(".%s_ = %e, ", arg->fld, &arg->ex); @@ -171,9 +173,14 @@ geneuiniex(struct expr *ex) { pri("{0}"); else { assert(ex->t == Eeuini); - if (ex->euini.ini) - pri("{ /* %s */ %I, .u.%s_ = %e }", ex->euini.fnam, ex->euini.tag, - ex->euini.fnam, ex->euini.ini); + if (ex->euini.ini) { + pri("{ /* %s */ %I, .u.%s_ = ", ex->euini.fnam, ex->euini.tag, ex->euini.fnam); + struct expr *it = ex->euini.ini; + if (it->t == Eini || it->t == Eeuini) + pri("%n }", it); + else + pri("%e }", it); + } else pri("{ /* %s */ %I }", ex->euini.fnam, ex->euini.tag); } @@ -722,7 +729,7 @@ genstatic(bool externp, const char *cname, struct var *var) { pri("static "); pri("%t %s",var->ty, cname); if (var->ini) - pri(" = %e", var->ini); + pri((var->ini->t == Eini || var->ini->t == Eeuini) ? " = %n" : " = %e", var->ini); pri(";\n"); } -- cgit v1.2.3