Commit bbd4b75b by Richard Stallman

(skip_if_group): New arg op. All callers changed.

If output_conditionals is true, output text of failed conditionals.
(conditional_skip): New arg op.  All callers changed.
(main): Handle -ifoutput option.

From-SVN: r7917
parent 86b38416
...@@ -395,6 +395,11 @@ static int print_include_names = 0; ...@@ -395,6 +395,11 @@ static int print_include_names = 0;
static int no_line_commands; static int no_line_commands;
/* Nonzero means output the text in failing conditionals,
inside #failed ... #endfailed. */
static int output_conditionals;
/* dump_only means inhibit output of the preprocessed text /* dump_only means inhibit output of the preprocessed text
and instead output the definitions of all user-defined and instead output the definitions of all user-defined
macros in a form suitable for use as input to cccp. macros in a form suitable for use as input to cccp.
...@@ -1202,6 +1207,9 @@ main (argc, argv) ...@@ -1202,6 +1207,9 @@ main (argc, argv)
else else
include_prefix = argv[++i]; include_prefix = argv[++i];
} }
if (!strcmp (argv[i], "-ifoutput")) {
output_conditionals = 1;
}
if (!strcmp (argv[i], "-isystem")) { if (!strcmp (argv[i], "-isystem")) {
struct file_name_list *dirtmp; struct file_name_list *dirtmp;
...@@ -2502,7 +2510,7 @@ do { ip = &instack[indepth]; \ ...@@ -2502,7 +2510,7 @@ do { ip = &instack[indepth]; \
obp = op->bufp; } while (0) obp = op->bufp; } while (0)
if (no_output && instack[indepth].fname != 0) if (no_output && instack[indepth].fname != 0)
skip_if_group (&instack[indepth], 1); skip_if_group (&instack[indepth], 1, NULL);
obp = op->bufp; obp = op->bufp;
RECACHE; RECACHE;
...@@ -2615,7 +2623,7 @@ do { ip = &instack[indepth]; \ ...@@ -2615,7 +2623,7 @@ do { ip = &instack[indepth]; \
/* If not generating expanded output, /* If not generating expanded output,
what we do with ordinary text is skip it. what we do with ordinary text is skip it.
Discard everything until next # directive. */ Discard everything until next # directive. */
skip_if_group (&instack[indepth], 1); skip_if_group (&instack[indepth], 1, 0);
RECACHE; RECACHE;
beg_of_line = ibp; beg_of_line = ibp;
break; break;
...@@ -2639,7 +2647,7 @@ do { ip = &instack[indepth]; \ ...@@ -2639,7 +2647,7 @@ do { ip = &instack[indepth]; \
/* If not generating expanded output, ignore everything until /* If not generating expanded output, ignore everything until
next # directive. */ next # directive. */
if (no_output && instack[indepth].fname) if (no_output && instack[indepth].fname)
skip_if_group (&instack[indepth], 1); skip_if_group (&instack[indepth], 1, 0);
obp = op->bufp; obp = op->bufp;
RECACHE; RECACHE;
beg_of_line = ibp; beg_of_line = ibp;
...@@ -6686,7 +6694,7 @@ do_if (buf, limit, op, keyword) ...@@ -6686,7 +6694,7 @@ do_if (buf, limit, op, keyword)
FILE_BUF *ip = &instack[indepth]; FILE_BUF *ip = &instack[indepth];
value = eval_if_expression (buf, limit - buf); value = eval_if_expression (buf, limit - buf);
conditional_skip (ip, value == 0, T_IF, NULL_PTR); conditional_skip (ip, value == 0, T_IF, NULL_PTR, op);
return 0; return 0;
} }
...@@ -6720,11 +6728,11 @@ do_elif (buf, limit, op, keyword) ...@@ -6720,11 +6728,11 @@ do_elif (buf, limit, op, keyword)
} }
if (if_stack->if_succeeded) if (if_stack->if_succeeded)
skip_if_group (ip, 0); skip_if_group (ip, 0, op);
else { else {
value = eval_if_expression (buf, limit - buf); value = eval_if_expression (buf, limit - buf);
if (value == 0) if (value == 0)
skip_if_group (ip, 0); skip_if_group (ip, 0, op);
else { else {
++if_stack->if_succeeded; /* continue processing input */ ++if_stack->if_succeeded; /* continue processing input */
output_line_command (ip, op, 1, same_file); output_line_command (ip, op, 1, same_file);
...@@ -6846,7 +6854,7 @@ do_xifdef (buf, limit, op, keyword) ...@@ -6846,7 +6854,7 @@ do_xifdef (buf, limit, op, keyword)
} }
} }
conditional_skip (ip, skip, T_IF, control_macro); conditional_skip (ip, skip, T_IF, control_macro, op);
return 0; return 0;
} }
...@@ -6856,11 +6864,12 @@ do_xifdef (buf, limit, op, keyword) ...@@ -6856,11 +6864,12 @@ do_xifdef (buf, limit, op, keyword)
Otherwise, CONTROL_MACRO is 0. */ Otherwise, CONTROL_MACRO is 0. */
static void static void
conditional_skip (ip, skip, type, control_macro) conditional_skip (ip, skip, type, control_macro, op)
FILE_BUF *ip; FILE_BUF *ip;
int skip; int skip;
enum node_type type; enum node_type type;
U_CHAR *control_macro; U_CHAR *control_macro;
FILE_BUF *op;
{ {
IF_STACK_FRAME *temp; IF_STACK_FRAME *temp;
...@@ -6874,7 +6883,7 @@ conditional_skip (ip, skip, type, control_macro) ...@@ -6874,7 +6883,7 @@ conditional_skip (ip, skip, type, control_macro)
if_stack->type = type; if_stack->type = type;
if (skip != 0) { if (skip != 0) {
skip_if_group (ip, 0); skip_if_group (ip, 0, op);
return; return;
} else { } else {
++if_stack->if_succeeded; ++if_stack->if_succeeded;
...@@ -6888,9 +6897,10 @@ conditional_skip (ip, skip, type, control_macro) ...@@ -6888,9 +6897,10 @@ conditional_skip (ip, skip, type, control_macro)
* If ANY is nonzero, return at next directive of any sort. * If ANY is nonzero, return at next directive of any sort.
*/ */
static void static void
skip_if_group (ip, any) skip_if_group (ip, any, op)
FILE_BUF *ip; FILE_BUF *ip;
int any; int any;
FILE_BUF *op;
{ {
register U_CHAR *bp = ip->bufp, *cp; register U_CHAR *bp = ip->bufp, *cp;
register U_CHAR *endb = ip->buf + ip->length; register U_CHAR *endb = ip->buf + ip->length;
...@@ -6899,6 +6909,25 @@ skip_if_group (ip, any) ...@@ -6899,6 +6909,25 @@ skip_if_group (ip, any)
U_CHAR *beg_of_line = bp; U_CHAR *beg_of_line = bp;
register int ident_length; register int ident_length;
U_CHAR *ident, *after_ident; U_CHAR *ident, *after_ident;
/* Save info about where the group starts. */
U_CHAR *beg_of_group = bp;
int beg_lineno = ip->lineno;
if (output_conditionals && op != 0) {
char *ptr = "#failed\n";
int len = strlen (ptr);
if (op->bufp > op->buf && op->bufp[-1] != '\n')
{
*op->bufp++ = '\n';
op->lineno++;
}
check_expand (op, len);
bcopy (ptr, (char *) op->bufp, len);
op->bufp += len;
op->lineno++;
output_line_command (ip, op, 1, 0);
}
while (bp < endb) { while (bp < endb) {
switch (*bp++) { switch (*bp++) {
...@@ -7050,7 +7079,7 @@ skip_if_group (ip, any) ...@@ -7050,7 +7079,7 @@ skip_if_group (ip, any)
&& strncmp (cp, kt->name, kt->length) == 0) { && strncmp (cp, kt->name, kt->length) == 0) {
/* If we are asked to return on next directive, do so now. */ /* If we are asked to return on next directive, do so now. */
if (any) if (any)
return; goto done;
switch (kt->type) { switch (kt->type) {
case T_IF: case T_IF:
...@@ -7073,7 +7102,7 @@ skip_if_group (ip, any) ...@@ -7073,7 +7102,7 @@ skip_if_group (ip, any)
break; break;
} }
else if (if_stack == save_if_stack) else if (if_stack == save_if_stack)
return; /* found what we came for */ goto done; /* found what we came for */
if (kt->type != T_ENDIF) { if (kt->type != T_ENDIF) {
if (if_stack->type == T_ELSE) if (if_stack->type == T_ELSE)
...@@ -7095,10 +7124,32 @@ skip_if_group (ip, any) ...@@ -7095,10 +7124,32 @@ skip_if_group (ip, any)
pedwarn ("invalid preprocessor directive name"); pedwarn ("invalid preprocessor directive name");
} }
} }
ip->bufp = bp; ip->bufp = bp;
/* after this returns, rescan will exit because ip->bufp /* after this returns, rescan will exit because ip->bufp
now points to the end of the buffer. now points to the end of the buffer.
rescan is responsible for the error message also. */ rescan is responsible for the error message also. */
done:
if (output_conditionals && op != 0) {
char *ptr = "#endfailed\n";
int len = strlen (ptr);
if (op->bufp > op->buf && op->bufp[-1] != '\n')
{
*op->bufp++ = '\n';
op->lineno++;
}
check_expand (op, beg_of_line - beg_of_group);
bcopy ((char *) beg_of_group, (char *) op->bufp,
beg_of_line - beg_of_group);
op->bufp += beg_of_line - beg_of_group;
op->lineno += ip->lineno - beg_lineno;
check_expand (op, len);
bcopy (ptr, (char *) op->bufp, len);
op->bufp += len;
op->lineno++;
}
} }
/* /*
...@@ -7141,7 +7192,7 @@ do_else (buf, limit, op, keyword) ...@@ -7141,7 +7192,7 @@ do_else (buf, limit, op, keyword)
} }
if (if_stack->if_succeeded) if (if_stack->if_succeeded)
skip_if_group (ip, 0); skip_if_group (ip, 0, op);
else { else {
++if_stack->if_succeeded; /* continue processing input */ ++if_stack->if_succeeded; /* continue processing input */
output_line_command (ip, op, 1, same_file); output_line_command (ip, op, 1, same_file);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment