commit 027ea37e73f2faca232788a21dd1d1280c74adbc
parent 89f23214f7e97af01aea675a2a24650fbc5d77ea
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date: Thu, 18 Jun 2026 13:40:08 +0200
cc1: Pretty format cpp output
The output of cc1 -E was ugly because indentation was lost
and because spaces were blindly added just to avoid token
concatenation. This patch solves the problem in a easy way
because we can access directly the input line to recover
the leading spaces and we already have the variable yyspace,
which holds the last space seen, but it was mangled by
expandarg() to handle spaces correctly for stringize of
macro parameters. We just save the space value before the
macro and then we restore after the expansion was done
because we don't care about intermediate spaces, just spaces
before the expansion of the macro.
Diffstat:
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/cmd/scc-cc/cc1/cpp.c b/src/cmd/scc-cc/cc1/cpp.c
@@ -408,7 +408,6 @@ expandarg(char *arg, char *def, char *curdef, char *buf, int bufsiz)
buf += n;
bufsiz -= n;
}
-
delinput();
}
@@ -606,7 +605,7 @@ intersect(Symbol **dst, Symbol **set)
int
expand(Symbol *sym)
{
- int siz;
+ int spc, siz;
Macro *mp;
DBG("MACRO '%s' detected disexpand=%d hide=%d",
@@ -615,6 +614,7 @@ expand(Symbol *sym)
if (disexpand || sym->hide || sym->token != IDEN)
return 0;
+ spc = yyspace;
mp = newmacro(sym);
mp->fname = filenam;
memcpy(mp->hideset, input->hideset, sizeof(mp->hideset));
@@ -635,6 +635,7 @@ expand(Symbol *sym)
siz = copymacro(mp);
mp->buffer[siz] = '\0';
+ yyspace = spc;
DBG("MACRO '%s' expanded to :'%s'", mp->sym->name, mp->buffer);
@@ -1294,18 +1295,20 @@ ppragmaln(void)
}
nline = lineno;
printf(s, nline, file);
+
+ for (s = input->line; isspace(*s); ++s)
+ putchar(*s);
+ yyspace = 0;
}
void
outcpp(void)
{
- int c;
- char *s, *t;
-
for (next(); yytoken != EOFTOK; next()) {
if (onlyheader)
continue;
- printf("%s ", yytext);
+ printf("%s%s", yyspace ? " " : "", yytext);
+ yyspace = 0;
}
putchar('\n');
}