diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c index 9e5162f26993..c857b91c63f3 100644 --- a/usr.bin/m4/eval.c +++ b/usr.bin/m4/eval.c @@ -269,8 +269,12 @@ expand_builtin(const char *argv[], int argc, int td) case INCLTYPE: if (argc > 2) if (!doincl(argv[2])) - err(1, "%s at line %lu: include(%s)", - CURRENT_NAME, CURRENT_LINE, argv[2]); + if (mimic_gnu) + warn("%s at line %lu: include(%s)", + CURRENT_NAME, CURRENT_LINE, argv[2]); + else + err(1, "%s at line %lu: include(%s)", + CURRENT_NAME, CURRENT_LINE, argv[2]); break; case SINCTYPE: diff --git a/usr.bin/m4/parser.y b/usr.bin/m4/parser.y index fac670931337..deda9625547e 100644 --- a/usr.bin/m4/parser.y +++ b/usr.bin/m4/parser.y @@ -18,6 +18,7 @@ * $FreeBSD$ */ #include +#include #define YYSTYPE int32_t extern int32_t end_result; extern int yylex(void); @@ -34,6 +35,7 @@ extern int yyparse(void); %left EQ NE %left '<' LE '>' GE %left LSHIFT RSHIFT +%right EXPONENT %left '+' '-' %left '*' '/' '%' %right UMINUS UPLUS '!' '~' @@ -44,6 +46,7 @@ top : expr { end_result = $1; } ; expr : expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } + | expr EXPONENT expr { $$ = pow($1, $3); } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { if ($3 == 0) { diff --git a/usr.bin/m4/tokenizer.l b/usr.bin/m4/tokenizer.l index e9c9e129aec8..ca3612e41441 100644 --- a/usr.bin/m4/tokenizer.l +++ b/usr.bin/m4/tokenizer.l @@ -57,6 +57,7 @@ radix 0[rR][0-9]+:[0-9a-zA-Z]+ "!=" { return(NE); } "&&" { return(LAND); } "||" { return(LOR); } +"**" { if (mimic_gnu) { return (EXPONENT); } } . { return yytext[0]; } %%