Upload Tizen:Base source
[external/bash.git] / builtins / shift.def
1 This file is shift.def, from which is created shift.c.
2 It implements the builtin "shift" in Bash.
3
4 Copyright (C) 1987-2009 Free Software Foundation, Inc.
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
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.
12
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.
17
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/>.
20
21 $PRODUCES shift.c
22
23 #include <config.h>
24
25 #if defined (HAVE_UNISTD_H)
26 #  ifdef _MINIX
27 #    include <sys/types.h>
28 #  endif
29 #  include <unistd.h>
30 #endif
31
32 #include "../bashansi.h"
33 #include "../bashintl.h"
34
35 #include "../shell.h"
36 #include "common.h"
37
38 $BUILTIN shift
39 $FUNCTION shift_builtin
40 $SHORT_DOC shift [n]
41 Shift positional parameters.
42
43 Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is
44 not given, it is assumed to be 1.
45
46 Exit Status:
47 Returns success unless N is negative or greater than $#.
48 $END
49
50 int print_shift_error;
51
52 /* Shift the arguments ``left''.  Shift DOLLAR_VARS down then take one
53    off of REST_OF_ARGS and place it into DOLLAR_VARS[9].  If LIST has
54    anything in it, it is a number which says where to start the
55    shifting.  Return > 0 if `times' > $#, otherwise 0. */
56 int
57 shift_builtin (list)
58      WORD_LIST *list;
59 {
60   intmax_t times;
61   register int count;
62   WORD_LIST *temp;
63
64   if (get_numeric_arg (list, 0, &times) == 0)
65     return (EXECUTION_FAILURE);
66
67   if (times == 0)
68     return (EXECUTION_SUCCESS);
69   else if (times < 0)
70     {
71       sh_erange (list ? list->word->word : NULL, _("shift count"));
72       return (EXECUTION_FAILURE);
73     }
74   else if (times > number_of_args ())
75     {
76       if (print_shift_error)
77         sh_erange (list ? list->word->word : NULL, _("shift count"));
78       return (EXECUTION_FAILURE);
79     }
80
81   while (times-- > 0)
82     {
83       if (dollar_vars[1])
84         free (dollar_vars[1]);
85
86       for (count = 1; count < 9; count++)
87         dollar_vars[count] = dollar_vars[count + 1];
88
89       if (rest_of_args)
90         {
91           temp = rest_of_args;
92           dollar_vars[9] = savestring (temp->word->word);
93           rest_of_args = rest_of_args->next;
94           temp->next = (WORD_LIST *)NULL;
95           dispose_words (temp);
96         }
97       else
98         dollar_vars[9] = (char *)NULL;
99     }
100   return (EXECUTION_SUCCESS);
101 }