This file is break.def, from which is created break.c. It implements the builtins "break" and "continue" in Bash. Copyright (C) 1987-2003 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 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. $PRODUCES break.c $BUILTIN break $FUNCTION break_builtin $SHORT_DOC break [n] Exit from within a FOR, WHILE or UNTIL loop. If N is specified, break N levels. $END #include #if defined (HAVE_UNISTD_H) # ifdef _MINIX # include # endif # include #endif #include "../bashintl.h" #include "../shell.h" #include "common.h" extern char *this_command_name; extern int posixly_correct; static int check_loop_level __P((void)); /* The depth of while's and until's. */ int loop_level = 0; /* Non-zero when a "break" instruction is encountered. */ int breaking = 0; /* Non-zero when we have encountered a continue instruction. */ int continuing = 0; /* Set up to break x levels, where x defaults to 1, but can be specified as the first argument. */ int break_builtin (list) WORD_LIST *list; { intmax_t newbreak; if (check_loop_level () == 0) return (EXECUTION_SUCCESS); newbreak = get_numeric_arg (list, 1); if (newbreak <= 0) { sh_erange (list->word->word, "loop count"); breaking = loop_level; return (EXECUTION_FAILURE); } if (newbreak > loop_level) newbreak = loop_level; breaking = newbreak; return (EXECUTION_SUCCESS); } $BUILTIN continue $FUNCTION continue_builtin $SHORT_DOC continue [n] Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop. If N is specified, resume at the N-th enclosing loop. $END /* Set up to continue x levels, where x defaults to 1, but can be specified as the first argument. */ int continue_builtin (list) WORD_LIST *list; { intmax_t newcont; if (check_loop_level () == 0) return (EXECUTION_SUCCESS); newcont = get_numeric_arg (list, 1); if (newcont <= 0) { sh_erange (list->word->word, "loop count"); breaking = loop_level; return (EXECUTION_FAILURE); } if (newcont > loop_level) newcont = loop_level; continuing = newcont; return (EXECUTION_SUCCESS); } /* Return non-zero if a break or continue command would be okay. Print an error message if break or continue is meaningless here. */ static int check_loop_level () { #if defined (BREAK_COMPLAINS) if (loop_level == 0 && posixly_correct == 0) builtin_error (_("only meaningful in a `for', `while', or `until' loop")); #endif /* BREAK_COMPLAINS */ return (loop_level); }