1 This file is break.def, from which is created break.c.
2 It implements the builtins "break" and "continue" in Bash.
4 Copyright (C) 1987-2009 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 Bash is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 Bash is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
24 $FUNCTION break_builtin
26 Exit for, while, or until loops.
28 Exit a FOR, WHILE or UNTIL loop. If N is specified, break N enclosing
32 The exit status is 0 unless N is not greater than or equal to 1.
36 #if defined (HAVE_UNISTD_H)
38 # include <sys/types.h>
43 #include "../bashintl.h"
46 #include "../execute_cmd.h"
49 static int check_loop_level __P((void));
51 /* The depth of while's and until's. */
54 /* Non-zero when a "break" instruction is encountered. */
57 /* Non-zero when we have encountered a continue instruction. */
60 /* Set up to break x levels, where x defaults to 1, but can be specified
61 as the first argument. */
70 if (check_loop_level () == 0)
71 return (EXECUTION_SUCCESS);
73 (void)get_numeric_arg (list, 1, &newbreak);
77 sh_erange (list->word->word, _("loop count"));
78 breaking = loop_level;
79 return (EXECUTION_FAILURE);
82 if (newbreak > loop_level)
83 newbreak = loop_level;
87 return (EXECUTION_SUCCESS);
91 $FUNCTION continue_builtin
92 $SHORT_DOC continue [n]
93 Resume for, while, or until loops.
95 Resumes the next iteration of the enclosing FOR, WHILE or UNTIL loop.
96 If N is specified, resumes the Nth enclosing loop.
99 The exit status is 0 unless N is not greater than or equal to 1.
102 /* Set up to continue x levels, where x defaults to 1, but can be specified
103 as the first argument. */
105 continue_builtin (list)
110 CHECK_HELPOPT (list);
112 if (check_loop_level () == 0)
113 return (EXECUTION_SUCCESS);
115 (void)get_numeric_arg (list, 1, &newcont);
119 sh_erange (list->word->word, _("loop count"));
120 breaking = loop_level;
121 return (EXECUTION_FAILURE);
124 if (newcont > loop_level)
125 newcont = loop_level;
127 continuing = newcont;
129 return (EXECUTION_SUCCESS);
132 /* Return non-zero if a break or continue command would be okay.
133 Print an error message if break or continue is meaningless here. */
137 #if defined (BREAK_COMPLAINS)
138 if (loop_level == 0 && posixly_correct == 0)
139 builtin_error (_("only meaningful in a `for', `while', or `until' loop"));
140 #endif /* BREAK_COMPLAINS */