Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Dec 2011 22:04:55 +0000 (UTC)
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228697 - head/usr.bin/m4
Message-ID:  <201112182204.pBIM4tGc027142@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bapt (ports committer)
Date: Sun Dec 18 22:04:55 2011
New Revision: 228697
URL: http://svn.freebsd.org/changeset/base/228697

Log:
  Reimplement support for the ** (exponent) gnu extension, make it available thought the -g (mimic gnu) option
  
  Reviewed by:	cognet
  Approved by:	cognet
  Discussed with:	espie@OpenBSD.org (upstream)

Replaced:
  head/usr.bin/m4/parser.y   (contents, props changed)
  head/usr.bin/m4/tokenizer.l   (contents, props changed)
Modified:
  head/usr.bin/m4/eval.c

Modified: head/usr.bin/m4/eval.c
==============================================================================
--- head/usr.bin/m4/eval.c	Sun Dec 18 20:41:58 2011	(r228696)
+++ head/usr.bin/m4/eval.c	Sun Dec 18 22:04:55 2011	(r228697)
@@ -269,8 +269,12 @@ expand_builtin(const char *argv[], int a
 	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:

Added: head/usr.bin/m4/parser.y
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/m4/parser.y	Sun Dec 18 22:04:55 2011	(r228697)
@@ -0,0 +1,86 @@
+%{
+/* $OpenBSD: parser.y,v 1.6 2008/08/21 21:00:14 espie Exp $ */
+/*
+ * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $FreeBSD$
+ */
+#include <stdint.h>
+#include <math.h>
+#define YYSTYPE	int32_t
+extern int32_t end_result;
+extern int yylex(void);
+extern int yyerror(const char *);
+extern int yyparse(void);
+%}
+%token NUMBER
+%token ERROR
+%left LOR
+%left LAND
+%left '|'
+%left '^'
+%left '&'
+%left EQ NE
+%left '<' LE '>' GE
+%left LSHIFT RSHIFT
+%right EXPONENT
+%left '+' '-'
+%left '*' '/' '%'
+%right UMINUS UPLUS '!' '~'
+
+%%
+
+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) {
+			yyerror("division by zero");
+			exit(1);
+		}
+		$$ = $1 / $3;
+	}
+	| expr '%' expr { 
+		if ($3 == 0) {
+			yyerror("modulo zero");
+			exit(1);
+		}
+		$$ = $1 % $3;
+	}
+	| expr LSHIFT expr { $$ = $1 << $3; }
+	| expr RSHIFT expr { $$ = $1 >> $3; }
+	| expr '<' expr { $$ = $1 < $3; }
+	| expr '>' expr { $$ = $1 > $3; }
+	| expr LE expr { $$ = $1 <= $3; }
+	| expr GE expr { $$ = $1 >= $3; }
+	| expr EQ expr { $$ = $1 == $3; }
+	| expr NE expr { $$ = $1 != $3; }
+	| expr '&' expr { $$ = $1 & $3; }
+	| expr '^' expr { $$ = $1 ^ $3; }
+	| expr '|' expr { $$ = $1 | $3; }
+	| expr LAND expr { $$ = $1 && $3; }
+	| expr LOR expr { $$ = $1 || $3; }
+	| '(' expr ')' { $$ = $2; }
+	| '-' expr %prec UMINUS { $$ = -$2; }
+	| '+' expr %prec UPLUS  { $$ = $2; }
+	| '!' expr { $$ = !$2; }
+	| '~' expr { $$ = ~$2; }
+	| NUMBER
+	;
+%%
+

Added: head/usr.bin/m4/tokenizer.l
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/m4/tokenizer.l	Sun Dec 18 22:04:55 2011	(r228697)
@@ -0,0 +1,112 @@
+%option nounput noinput
+%{
+/* $OpenBSD: tokenizer.l,v 1.7 2010/03/22 20:40:44 espie Exp $ */
+/*
+ * Copyright (c) 2004 Marc Espie <espie@cvs.openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $FreeBSD$
+ */
+#include "parser.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdint.h>
+#include <limits.h>
+
+extern int mimic_gnu;
+extern int32_t yylval;
+
+int32_t number(void);
+int32_t parse_radix(void);
+extern int yylex(void);
+%}
+
+delim 	[ \t\n]
+ws	{delim}+
+hex	0[xX][0-9a-fA-F]+
+oct	0[0-7]*
+dec	[1-9][0-9]*
+radix	0[rR][0-9]+:[0-9a-zA-Z]+
+
+%%
+{ws}			{/* just skip it */}
+{hex}|{oct}|{dec}	{ yylval = number(); return(NUMBER); }
+{radix}			{ if (mimic_gnu) {
+				yylval = parse_radix(); return(NUMBER);
+			  } else {
+			  	return(ERROR);
+			  }
+			}
+"<="			{ return(LE); }
+">="			{ return(GE); }
+"<<"			{ return(LSHIFT); }
+">>"			{ return(RSHIFT); }
+"=="			{ return(EQ); }
+"!="			{ return(NE); }
+"&&"			{ return(LAND); }
+"||"			{ return(LOR); }
+"**"			{ if (mimic_gnu) { return (EXPONENT); } }
+.			{ return yytext[0]; }
+%%
+
+int32_t
+number(void)
+{
+	long l;
+
+	errno = 0;
+	l = strtol(yytext, NULL, 0);
+	if (((l == LONG_MAX || l == LONG_MIN) && errno == ERANGE) ||
+	    l > INT32_MAX || l < INT32_MIN) {
+		fprintf(stderr, "m4: numeric overflow in expr: %s\n", yytext);
+	}
+	return l;
+}
+
+int32_t
+parse_radix(void)
+{
+	long base;
+	char *next;
+	long l;
+	int d;
+
+	l = 0;
+	base = strtol(yytext+2, &next, 0);
+	if (base > 36 || next == NULL) {
+		fprintf(stderr, "m4: error in number %s\n", yytext);
+	} else {
+		next++;
+		while (*next != 0) {
+			if (*next >= '0' && *next <= '9')
+				d = *next - '0';
+			else if (*next >= 'a' && *next <= 'z')
+				d = *next - 'a' + 10;
+			else {
+				assert(*next >= 'A' && *next <= 'Z');
+				d = *next - 'A' + 10;
+			}
+			if (d >= base) {
+				fprintf(stderr, 
+				    "m4: error in number %s\n", yytext);
+				return 0;
+			}
+			l = base * l + d;
+			next++;
+		}
+	}
+	return l;
+}
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112182204.pBIM4tGc027142>