1This file is let.def, from which is created let.c.
2It implements the builtin "let" in Bash.
3
4Copyright (C) 1987-2009 Free Software Foundation, Inc.
5
6This file is part of GNU Bash, the Bourne Again SHell.
7
8Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
12
13Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with Bash.  If not, see <http://www.gnu.org/licenses/>.
20
21$BUILTIN let
22$FUNCTION let_builtin
23$PRODUCES let.c
24$SHORT_DOC let arg [arg ...]
25Evaluate arithmetic expressions.
26
27Evaluate each ARG as an arithmetic expression.  Evaluation is done in
28fixed-width integers with no check for overflow, though division by 0
29is trapped and flagged as an error.  The following list of operators is
30grouped into levels of equal-precedence operators.  The levels are listed
31in order of decreasing precedence.
32
33	id++, id--	variable post-increment, post-decrement
34	++id, --id	variable pre-increment, pre-decrement
35	-, +		unary minus, plus
36	!, ~		logical and bitwise negation
37	**		exponentiation
38	*, /, %		multiplication, division, remainder
39	+, -		addition, subtraction
40	<<, >>		left and right bitwise shifts
41	<=, >=, <, >	comparison
42	==, !=		equality, inequality
43	&		bitwise AND
44	^		bitwise XOR
45	|		bitwise OR
46	&&		logical AND
47	||		logical OR
48	expr ? expr : expr
49			conditional operator
50	=, *=, /=, %=,
51	+=, -=, <<=, >>=,
52	&=, ^=, |=	assignment
53
54Shell variables are allowed as operands.  The name of the variable
55is replaced by its value (coerced to a fixed-width integer) within
56an expression.  The variable need not have its integer attribute
57turned on to be used in an expression.
58
59Operators are evaluated in order of precedence.  Sub-expressions in
60parentheses are evaluated first and may override the precedence
61rules above.
62
63Exit Status:
64If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
65$END
66
67#include <config.h>
68
69#if defined (HAVE_UNISTD_H)
70#  ifdef _MINIX
71#    include <sys/types.h>
72#  endif
73#  include <unistd.h>
74#endif
75
76#include "../bashintl.h"
77
78#include "../shell.h"
79#include "common.h"
80
81/* Arithmetic LET function. */
82int
83let_builtin (list)
84     WORD_LIST *list;
85{
86  intmax_t ret;
87  int expok;
88
89  CHECK_HELPOPT (list);
90
91  /* Skip over leading `--' argument. */
92  if (list && list->word && ISOPTION (list->word->word, '-'))
93    list = list->next;
94
95  if (list == 0)
96    {
97      builtin_error (_("expression expected"));
98      return (EXECUTION_FAILURE);
99    }
100
101  for (; list; list = list->next)
102    {
103      ret = evalexp (list->word->word, EXP_EXPANDED, &expok);
104      if (expok == 0)
105	return (EXECUTION_FAILURE);
106    }
107
108  return ((ret == 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
109}
110
111#ifdef INCLUDE_UNUSED
112int
113exp_builtin (list)
114     WORD_LIST *list;
115{
116  char *exp;
117  intmax_t ret;
118  int expok;
119
120  if (list == 0)
121    {
122      builtin_error (_("expression expected"));
123      return (EXECUTION_FAILURE);
124    }
125
126  exp = string_list (list);
127  ret = evalexp (exp, EXP_EXPANDED, &expok);
128  (void)free (exp);
129  return (((ret == 0) || (expok == 0)) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
130}
131#endif
132