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:       es...@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 <es...@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 <es...@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;
+}
+
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to