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 1, or (at your option) any later
+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
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, 675 Mass Ave, Cambridge, MA 02139, USA.
+Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
$PRODUCES break.c
Exit from within a FOR, WHILE or UNTIL loop. If N is specified,
break N levels.
$END
+#include <config.h>
+
+#if defined (HAVE_UNISTD_H)
+# ifdef _MINIX
+# include <sys/types.h>
+# endif
+# include <unistd.h>
+#endif
#include "../shell.h"
+#include "common.h"
extern char *this_command_name;
+extern int posixly_correct;
-static int check_loop_level ();
+static int check_loop_level __P((void));
/* The depth of while's and until's. */
int loop_level = 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;
{
- int newbreak;
+ long newbreak;
- if (!check_loop_level ())
- return (EXECUTION_FAILURE);
+ if (check_loop_level () == 0)
+ return (EXECUTION_SUCCESS);
- newbreak = get_numeric_arg (list);
+ newbreak = get_numeric_arg (list, 1);
if (newbreak <= 0)
- return (EXECUTION_FAILURE);
+ {
+ builtin_error ("loop count must be > 0");
+ breaking = loop_level;
+ return (EXECUTION_FAILURE);
+ }
if (newbreak > loop_level)
newbreak = loop_level;
/* 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;
{
- int newcont;
+ long newcont;
- if (!check_loop_level ())
- return (EXECUTION_FAILURE);
+ if (check_loop_level () == 0)
+ return (EXECUTION_SUCCESS);
- newcont = get_numeric_arg (list);
+ newcont = get_numeric_arg (list, 1);
if (newcont <= 0)
- return (EXECUTION_FAILURE);
+ {
+ builtin_error ("loop count must be > 0");
+ breaking = loop_level;
+ return (EXECUTION_FAILURE);
+ }
if (newcont > loop_level)
newcont = loop_level;
check_loop_level ()
{
#if defined (BREAK_COMPLAINS)
- if (!loop_level)
- builtin_error ("Only meaningful in a `for', `while', or `until' loop");
+ if (loop_level == 0 && posixly_correct == 0)
+ builtin_error ("only meaningful in a `for', `while', or `until' loop");
#endif /* BREAK_COMPLAINS */
return (loop_level);