source: trunk/essentials/app-shells/bash/builtins/break.def

Last change on this file was 3228, checked in by bird, 18 years ago

bash 3.1

File size: 3.2 KB
Line 
1This file is break.def, from which is created break.c.
2It implements the builtins "break" and "continue" in Bash.
3
4Copyright (C) 1987-2003 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 it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
12
13Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License along
19with Bash; see the file COPYING. If not, write to the Free Software
20Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
21
22$PRODUCES break.c
23
24$BUILTIN break
25$FUNCTION break_builtin
26$SHORT_DOC break [n]
27Exit from within a FOR, WHILE or UNTIL loop. If N is specified,
28break N levels.
29$END
30#include <config.h>
31
32#if defined (HAVE_UNISTD_H)
33# ifdef _MINIX
34# include <sys/types.h>
35# endif
36# include <unistd.h>
37#endif
38
39#include "../bashintl.h"
40
41#include "../shell.h"
42#include "common.h"
43
44extern char *this_command_name;
45extern int posixly_correct;
46
47static int check_loop_level __P((void));
48
49/* The depth of while's and until's. */
50int loop_level = 0;
51
52/* Non-zero when a "break" instruction is encountered. */
53int breaking = 0;
54
55/* Non-zero when we have encountered a continue instruction. */
56int continuing = 0;
57
58/* Set up to break x levels, where x defaults to 1, but can be specified
59 as the first argument. */
60int
61break_builtin (list)
62 WORD_LIST *list;
63{
64 intmax_t newbreak;
65
66 if (check_loop_level () == 0)
67 return (EXECUTION_SUCCESS);
68
69 newbreak = get_numeric_arg (list, 1);
70
71 if (newbreak <= 0)
72 {
73 sh_erange (list->word->word, "loop count");
74 breaking = loop_level;
75 return (EXECUTION_FAILURE);
76 }
77
78 if (newbreak > loop_level)
79 newbreak = loop_level;
80
81 breaking = newbreak;
82
83 return (EXECUTION_SUCCESS);
84}
85
86$BUILTIN continue
87$FUNCTION continue_builtin
88$SHORT_DOC continue [n]
89Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop.
90If N is specified, resume at the N-th enclosing loop.
91$END
92
93/* Set up to continue x levels, where x defaults to 1, but can be specified
94 as the first argument. */
95int
96continue_builtin (list)
97 WORD_LIST *list;
98{
99 intmax_t newcont;
100
101 if (check_loop_level () == 0)
102 return (EXECUTION_SUCCESS);
103
104 newcont = get_numeric_arg (list, 1);
105
106 if (newcont <= 0)
107 {
108 sh_erange (list->word->word, "loop count");
109 breaking = loop_level;
110 return (EXECUTION_FAILURE);
111 }
112
113 if (newcont > loop_level)
114 newcont = loop_level;
115
116 continuing = newcont;
117
118 return (EXECUTION_SUCCESS);
119}
120
121/* Return non-zero if a break or continue command would be okay.
122 Print an error message if break or continue is meaningless here. */
123static int
124check_loop_level ()
125{
126#if defined (BREAK_COMPLAINS)
127 if (loop_level == 0 && posixly_correct == 0)
128 builtin_error (_("only meaningful in a `for', `while', or `until' loop"));
129#endif /* BREAK_COMPLAINS */
130
131 return (loop_level);
132}
Note: See TracBrowser for help on using the repository browser.