aboutsummaryrefslogtreecommitdiff
path: root/bootstrap/cgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap/cgen.c')
-rw-r--r--bootstrap/cgen.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c
index 5c64a30..39cbba0 100644
--- a/bootstrap/cgen.c
+++ b/bootstrap/cgen.c
@@ -50,7 +50,11 @@ pristring(const char *s, u64 n) {
extern int isprint(int);
pri("\"");
for (int i = 0; i < n; ++i) {
- if (isprint(s[i]))
+ if (s[i] == '"')
+ pri("\\\"");
+ else if (s[i] == '\\')
+ pri("\\\\");
+ else if (isprint(s[i]))
pri("%c", s[i]);
else
fprintf(outfp, "\\%.3o", s[i]);
@@ -699,6 +703,7 @@ genstatic(bool externp, const char *cname, struct var *var) {
static void
gendecl(struct decl *decl, bool toplevel) {
const char *p = fileid2path(decl->span.fileid);
+ if (decl->_gen) return;
switch (decl->t) {
case Dfn:
pri("#line %d %S\n", decl->span.line, p, (u64)strlen(p));
@@ -718,6 +723,7 @@ gendecl(struct decl *decl, bool toplevel) {
case Dtype: case Ddef: case Dtepl: case Dmacro: case Dlabel:
break;
}
+ decl->_gen = 1;
}
static void