blob: 811534e485ef212aa44e2a804fb4ecf4362927f5 [file] [log] [blame]
cvpcs772f20a2010-06-02 11:02:31 -05001This 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:
Sebastian Schmidtf4b417c2012-04-17 11:23:35 +020064If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
cvpcs772f20a2010-06-02 11:02:31 -050065$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 /* Skip over leading `--' argument. */
90 if (list && list->word && ISOPTION (list->word->word, '-'))
91 list = list->next;
92
93 if (list == 0)
94 {
95 builtin_error (_("expression expected"));
96 return (EXECUTION_FAILURE);
97 }
98
99 for (; list; list = list->next)
100 {
101 ret = evalexp (list->word->word, &expok);
102 if (expok == 0)
103 return (EXECUTION_FAILURE);
104 }
105
106 return ((ret == 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
107}
108
109#ifdef INCLUDE_UNUSED
110int
111exp_builtin (list)
112 WORD_LIST *list;
113{
114 char *exp;
115 intmax_t ret;
116 int expok;
117
118 if (list == 0)
119 {
120 builtin_error (_("expression expected"));
121 return (EXECUTION_FAILURE);
122 }
123
124 exp = string_list (list);
125 ret = evalexp (exp, &expok);
126 (void)free (exp);
127 return (((ret == 0) || (expok == 0)) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
128}
129#endif