diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-10-11 14:49:26 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2010-10-11 15:19:40 -0700 |
commit | 011c1d1c0766c65517ebd495465c99e86edb63ec (patch) | |
tree | 30d8f6a13235af90897c3223554871ef52225462 /expr.c | |
parent | 40cfaccf7b178b6239b5cd0013ef80b7ff8e503e (diff) | |
download | vyatta-bash-011c1d1c0766c65517ebd495465c99e86edb63ec.tar.gz vyatta-bash-011c1d1c0766c65517ebd495465c99e86edb63ec.zip |
Update to bash-4.1
Diffstat (limited to 'expr.c')
-rw-r--r-- | expr.c | 47 |
1 files changed, 26 insertions, 21 deletions
@@ -1,22 +1,22 @@ /* expr.c -- arithmetic expression evaluation. */ -/* Copyright (C) 1990-2004 Free Software Foundation, Inc. +/* Copyright (C) 1990-2009 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. - Bash is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + Bash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - Bash is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. + Bash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Bash; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + along with Bash. If not, see <http://www.gnu.org/licenses/>. +*/ /* All arithmetic is done as intmax_t integers with no checking for overflow @@ -153,7 +153,7 @@ static void readtok __P((void)); /* lexical analyzer */ static intmax_t expr_streval __P((char *, int)); static intmax_t strlong __P((char *)); -static void evalerror __P((char *)); +static void evalerror __P((const char *)); static void pushexp __P((void)); static void popexp __P((void)); @@ -202,10 +202,10 @@ static int expr_depth; /* Location in the stack. */ static int expr_stack_size; /* Number of slots already allocated. */ extern char *this_command_name; -extern int unbound_vars_is_error; +extern int unbound_vars_is_error, last_command_exit_value; #if defined (ARRAY_VARS) -extern char *bash_badsub_errmsg; +extern const char * const bash_badsub_errmsg; #endif #define SAVETOK(X) \ @@ -286,6 +286,8 @@ expr_unwind () free (expr_stack[expr_depth]); } free (expr_stack[expr_depth]); /* free the allocated EXPR_CONTEXT */ + + noeval = 0; /* XXX */ } static void @@ -319,6 +321,7 @@ evalexp (expr, validp) procenv_t oevalbuf; val = 0; + noeval = 0; FASTCOPY (evalbuf, oevalbuf, sizeof (evalbuf)); @@ -517,7 +520,8 @@ expcond () set_noeval = 1; noeval++; } - val2 = explor (); + + val2 = expcond (); if (set_noeval) noeval--; rval = cval ? val1 : val2; @@ -919,6 +923,7 @@ expr_streval (tok, e) value = tok; #endif + last_command_exit_value = EXECUTION_FAILURE; err_unboundvar (value); #if defined (ARRAY_VARS) @@ -929,6 +934,7 @@ expr_streval (tok, e) if (interactive_shell) { expr_unwind (); + top_level_cleanup (); jump_to_top_level (DISCARD); } else @@ -1028,8 +1034,6 @@ readtok () if (c) cp++; - lasttp = tp = cp - 1; - if (c == '\0') { lasttok = curtok; @@ -1037,6 +1041,7 @@ readtok () tp = cp; return; } + lasttp = tp = cp - 1; if (legal_variable_starter (c)) { @@ -1053,7 +1058,7 @@ readtok () #if defined (ARRAY_VARS) if (c == '[') { - e = skipsubscript (cp, 0); + e = skipsubscript (cp, 0, 0); if (cp[e] == ']') { cp += e + 1; @@ -1187,14 +1192,14 @@ readtok () static void evalerror (msg) - char *msg; + const char *msg; { char *name, *t; name = this_command_name; for (t = expression; whitespace (*t); t++) ; - internal_error ("%s%s%s: %s (error token is \"%s\")", + internal_error (_("%s%s%s: %s (error token is \"%s\")"), name ? name : "", name ? ": " : "", t, msg, (lasttp && *lasttp) ? lasttp : ""); longjmp (evalbuf, 1); @@ -1321,7 +1326,7 @@ main (argc, argv) { v = evalexp (argv[i], &expok); if (expok == 0) - fprintf (stderr, "%s: expression error\n", argv[i]); + fprintf (stderr, _("%s: expression error\n"), argv[i]); else printf ("'%s' -> %ld\n", argv[i], v); } |