Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/bin/sh Finish support for all required $(( )) (shell arithme...



details:   https://anonhg.NetBSD.org/src/rev/84a501acbbde
branches:  trunk
changeset: 822436:84a501acbbde
user:      kre <kre%NetBSD.org@localhost>
date:      Mon Mar 20 11:26:07 2017 +0000

description:
Finish support for all required $(( )) (shell arithmetic) operators,
closing PR bin/50958

That meant adding the assignment operators ('=', and all of the +=, *= ...)
Currently, ++, --, and ',' are not implemented (none of those are required
by posix) but support for them (most likely ',' first) might be added later.

To do this, I removed the yacc/lex arithmetic parser completely, and
replaced it with a hand written recursive descent parser, that I obtained
from FreeBSD, who earlier had obtained it from dash (Herbert Xu).

While doing the import, I cleaned up the sources (changed some file names
to avoid requiring a clean build, or signifigant surgery to the obj
directories if "build.sh -u" was to be used - "build.sh -u" should work
fine as it is now) removed some dashisms, applied some KNF, ...

diffstat:

 bin/sh/Makefile       |   27 +--
 bin/sh/arith.y        |  208 -------------------------
 bin/sh/arith_lex.l    |  105 ------------
 bin/sh/arith_token.c  |  232 ++++++++++++++++++++++++++++
 bin/sh/arith_tokens.h |  115 ++++++++++++++
 bin/sh/arithmetic.c   |  406 ++++++++++++++++++++++++++++++++++++++++++++++++++
 bin/sh/arithmetic.h   |   42 +++++
 bin/sh/expand.c       |   28 ++-
 bin/sh/expand.h       |    7 +-
 bin/sh/sh.1           |   35 ++++-
 10 files changed, 861 insertions(+), 344 deletions(-)

diffs (truncated from 1328 to 300 lines):

diff -r 9bf9e0778123 -r 84a501acbbde bin/sh/Makefile
--- a/bin/sh/Makefile   Mon Mar 20 10:44:24 2017 +0000
+++ b/bin/sh/Makefile   Mon Mar 20 11:26:07 2017 +0000
@@ -1,16 +1,15 @@
-#      $NetBSD: Makefile,v 1.103 2017/03/16 13:09:06 kre Exp $
+#      $NetBSD: Makefile,v 1.104 2017/03/20 11:26:07 kre Exp $
 #      @(#)Makefile    8.4 (Berkeley) 5/5/95
 
 .include <bsd.own.mk>
 
-YHEADER=1
 PROG=  sh
-SHSRCS=        alias.c cd.c echo.c error.c eval.c exec.c expand.c \
-       histedit.c input.c jobs.c mail.c main.c memalloc.c miscbltin.c \
-       mystring.c options.c parser.c redir.c show.c trap.c output.c var.c \
-       test.c kill.c syntax.c
-GENSRCS=arith.c arith_lex.c builtins.c init.c nodes.c
-GENHDRS=arith.h builtins.h nodes.h token.h nodenames.h
+SHSRCS=        alias.c arith_token.c arithmetic.c cd.c echo.c error.c eval.c exec.c \
+       expand.c histedit.c input.c jobs.c mail.c main.c memalloc.c \
+       miscbltin.c mystring.c options.c parser.c redir.c show.c trap.c \
+       output.c var.c test.c kill.c syntax.c
+GENSRCS=builtins.c init.c nodes.c
+GENHDRS=builtins.h nodes.h token.h nodenames.h
 SRCS=  ${SHSRCS} ${GENSRCS}
 
 DPSRCS+=${GENHDRS}
@@ -18,21 +17,11 @@
 LDADD+=        -ll -ledit -lterminfo
 DPADD+=        ${LIBL} ${LIBEDIT} ${LIBTERMINFO}
 
-LFLAGS=        -8      # 8-bit lex scanner for arithmetic
-
 # Environment for scripts executed during build.
 SCRIPT_ENV= \
        AWK=${TOOL_AWK:Q} \
        SED=${TOOL_SED:Q}
 
-# The .depend file can get references to these temporary files
-.OPTIONAL: lex.yy.c y.tab.c
-
-.ifdef CRUNCHEDPROG
-LFLAGS+=-L
-YFLAGS+=-l
-.endif
-
 CPPFLAGS+=-DSHELL -I. -I${.CURDIR}
 #XXX: For testing only.
 #CPPFLAGS+=-DDEBUG=2
@@ -53,7 +42,7 @@
        ${NETBSDSRCDIR}/usr.bin/printf \
        ${NETBSDSRCDIR}/bin/kill
 
-CLEANFILES+= ${GENSRCS} ${GENHDRS} y.tab.h sh.html1
+CLEANFILES+= ${GENSRCS} ${GENHDRS} sh.html1
 CLEANFILES+= trace.*
 
 token.h: mktokens
diff -r 9bf9e0778123 -r 84a501acbbde bin/sh/arith.y
--- a/bin/sh/arith.y    Mon Mar 20 10:44:24 2017 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-%{
-/*     $NetBSD: arith.y,v 1.25 2016/05/12 13:05:18 kre Exp $   */
-
-/*-
- * Copyright (c) 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kenneth Almquist.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)arith.y    8.3 (Berkeley) 5/4/95";
-#else
-__RCSID("$NetBSD: arith.y,v 1.25 2016/05/12 13:05:18 kre Exp $");
-#endif
-#endif /* not lint */
-
-#include <stdlib.h>
-#include "expand.h"
-#include "builtins.h"
-#include "shell.h"
-#include "error.h"
-#include "output.h"
-#include "memalloc.h"
-
-typedef intmax_t YYSTYPE;
-#define YYSTYPE YYSTYPE
-
-intmax_t arith_result;
-const char *arith_buf, *arith_startbuf;
-
-__dead static void yyerror(const char *);
-#ifdef TESTARITH
-int main(int , char *[]);
-int error(char *);
-#endif
-
-%}
-%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN
-
-%right ARITH_QM ARITH_COLON
-%left ARITH_OR
-%left ARITH_AND
-%left ARITH_BOR
-%left ARITH_BXOR
-%left ARITH_BAND
-%left ARITH_EQ ARITH_NE
-%left ARITH_LT ARITH_GT ARITH_GE ARITH_LE
-%left ARITH_LSHIFT ARITH_RSHIFT
-%left ARITH_ADD ARITH_SUB
-%left ARITH_MUL ARITH_DIV ARITH_REM
-%left ARITH_UNARYMINUS ARITH_UNARYPLUS ARITH_NOT ARITH_BNOT
-%%
-
-exp:   expr {
-                       /*
-                        * yyparse() returns int, so we have to save
-                        * the desired result elsewhere.
-                        */
-                       arith_result = $1;
-               }
-       ;
-
-
-expr:  ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; }
-       | expr ARITH_QM expr ARITH_COLON expr { $$ = $1 ? $3 : $5; }
-       | expr ARITH_OR expr    { $$ = ($1 ? 1 : $3 ? 1 : 0); }
-       | expr ARITH_AND expr   { $$ = ($1 ? ( $3 ? 1 : 0 ) : 0); }
-       | expr ARITH_BOR expr   { $$ = $1 | $3; }
-       | expr ARITH_BXOR expr  { $$ = $1 ^ $3; }
-       | expr ARITH_BAND expr  { $$ = $1 & $3; }
-       | expr ARITH_EQ expr    { $$ = $1 == $3; }
-       | expr ARITH_GT expr    { $$ = $1 > $3; }
-       | expr ARITH_GE expr    { $$ = $1 >= $3; }
-       | expr ARITH_LT expr    { $$ = $1 < $3; }
-       | expr ARITH_LE expr    { $$ = $1 <= $3; }
-       | expr ARITH_NE expr    { $$ = $1 != $3; }
-       | expr ARITH_LSHIFT expr { $$ = $1 << $3; }
-       | expr ARITH_RSHIFT expr { $$ = $1 >> $3; }
-       | expr ARITH_ADD expr   { $$ = $1 + $3; }
-       | expr ARITH_SUB expr   { $$ = $1 - $3; }
-       | expr ARITH_MUL expr   { $$ = $1 * $3; }
-       | expr ARITH_DIV expr   {
-                       if ($3 == 0)
-                               yyerror("division by zero");
-                       $$ = $1 / $3;
-                       }
-       | expr ARITH_REM expr   {
-                       if ($3 == 0)
-                               yyerror("division by zero");
-                       $$ = $1 % $3;
-                       }
-       | ARITH_NOT expr        { $$ = !($2); }
-       | ARITH_BNOT expr       { $$ = ~($2); }
-       | ARITH_SUB expr %prec ARITH_UNARYMINUS { $$ = -($2); }
-       | ARITH_ADD expr %prec ARITH_UNARYPLUS { $$ = $2; }
-       | ARITH_NUM
-       ;
-%%
-intmax_t
-arith(const char *s)
-{
-       intmax_t result;
-
-       arith_buf = arith_startbuf = s;
-
-       INTOFF;
-       (void) yyparse();
-       result = arith_result;
-       arith_lex_reset();      /* reprime lex */
-       INTON;
-
-       return (result);
-}
-
-
-/*
- *  The exp(1) builtin.
- */
-int
-expcmd(int argc, char **argv)
-{
-       const char *p;
-       char *concat;
-       char **ap;
-       intmax_t i;
-
-       if (argc > 1) {
-               p = argv[1];
-               if (argc > 2) {
-                       /*
-                        * concatenate arguments
-                        */
-                       STARTSTACKSTR(concat);
-                       ap = argv + 2;
-                       for (;;) {
-                               while (*p)
-                                       STPUTC(*p++, concat);
-                               if ((p = *ap++) == NULL)
-                                       break;
-                               STPUTC(' ', concat);
-                       }
-                       STPUTC('\0', concat);
-                       p = grabstackstr(concat);
-               }
-       } else
-               p = "";
-
-       (void)arith(p);
-       i = arith_result;
-
-       out1fmt("%"PRIdMAX"\n", i);
-       return (! i);
-}
-
-/*************************/
-#ifdef TEST_ARITH
-#include <stdio.h>
-main(argc, argv)
-       char *argv[];
-{
-       printf("%"PRIdMAX"\n", exp(argv[1]));
-}
-error(s)
-       char *s;
-{
-       fprintf(stderr, "exp: %s\n", s);
-       exit(1);
-}
-#endif
-
-static void
-yyerror(const char *s)
-{
-
-       yyerrok;
-       yyclearin;
-       arith_lex_reset();      /* reprime lex */
-       error("arithmetic expression: %s: \"%s\"", s, arith_startbuf);
-       /* NOTREACHED */
-}
diff -r 9bf9e0778123 -r 84a501acbbde bin/sh/arith_lex.l
--- a/bin/sh/arith_lex.l        Mon Mar 20 10:44:24 2017 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-%{
-/*     $NetBSD: arith_lex.l,v 1.18 2016/03/16 15:42:33 christos Exp $  */
-
-/*-
- * Copyright (c) 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Kenneth Almquist.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE



Home | Main Index | Thread Index | Old Index