1 /* copy_command.c -- copy a COMMAND structure. This is needed
2 primarily for making function definitions, but I'm not sure
3 that anyone else will need it. */
5 /* Copyright (C) 1987,1991 Free Software Foundation, Inc.
7 This file is part of GNU Bash, the Bourne Again SHell.
9 Bash is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 Bash is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
19 You should have received a copy of the GNU General Public License
20 along with Bash; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
25 #include "bashtypes.h"
27 #if defined (HAVE_UNISTD_H)
41 new_word
= (WORD_DESC
*)xmalloc (sizeof (WORD_DESC
));
43 new_word
->flags
= w
->flags
;
45 FASTCOPY ((char *)w
, (char *)new_word
, sizeof (WORD_DESC
));
47 new_word
->word
= savestring (w
->word
);
51 /* Copy the chain of words in LIST. Return a pointer to
57 WORD_LIST
*new_list
, *temp
;
59 for (new_list
= (WORD_LIST
*)NULL
; list
; list
= list
->next
)
61 temp
= (WORD_LIST
*)xmalloc (sizeof (WORD_LIST
));
62 temp
->next
= new_list
;
64 new_list
->word
= copy_word (list
->word
);
66 return (REVERSE_LIST (new_list
, WORD_LIST
*));
70 copy_case_clause (clause
)
73 PATTERN_LIST
*new_clause
;
75 new_clause
= (PATTERN_LIST
*)xmalloc (sizeof (PATTERN_LIST
));
76 new_clause
->patterns
= copy_word_list (clause
->patterns
);
77 new_clause
->action
= copy_command (clause
->action
);
82 copy_case_clauses (clauses
)
83 PATTERN_LIST
*clauses
;
85 PATTERN_LIST
*new_list
, *new_clause
;
87 for (new_list
= (PATTERN_LIST
*)NULL
; clauses
; clauses
= clauses
->next
)
89 new_clause
= copy_case_clause (clauses
);
90 new_clause
->next
= new_list
;
91 new_list
= new_clause
;
93 return (REVERSE_LIST (new_list
, PATTERN_LIST
*));
96 /* Copy a single redirect. */
98 copy_redirect (redirect
)
101 REDIRECT
*new_redirect
;
103 new_redirect
= (REDIRECT
*)xmalloc (sizeof (REDIRECT
));
104 FASTCOPY ((char *)redirect
, (char *)new_redirect
, (sizeof (REDIRECT
)));
105 switch (redirect
->instruction
)
107 case r_reading_until
:
108 case r_deblank_reading_until
:
109 new_redirect
->here_doc_eof
= savestring (redirect
->here_doc_eof
);
112 case r_output_direction
:
113 case r_input_direction
:
114 case r_inputa_direction
:
118 case r_duplicating_input_word
:
119 case r_duplicating_output_word
:
120 new_redirect
->redirectee
.filename
= copy_word (redirect
->redirectee
.filename
);
122 case r_duplicating_input
:
123 case r_duplicating_output
:
127 return (new_redirect
);
131 copy_redirects (list
)
134 REDIRECT
*new_list
, *temp
;
136 for (new_list
= (REDIRECT
*)NULL
; list
; list
= list
->next
)
138 temp
= copy_redirect (list
);
139 temp
->next
= new_list
;
142 return (REVERSE_LIST (new_list
, REDIRECT
*));
146 copy_for_command (com
)
151 new_for
= (FOR_COM
*)xmalloc (sizeof (FOR_COM
));
152 new_for
->flags
= com
->flags
;
153 new_for
->name
= copy_word (com
->name
);
154 new_for
->map_list
= copy_word_list (com
->map_list
);
155 new_for
->action
= copy_command (com
->action
);
159 #if defined (ARITH_FOR_COMMAND)
160 static ARITH_FOR_COM
*
161 copy_arith_for_command (com
)
164 ARITH_FOR_COM
*new_arith_for
;
166 new_arith_for
= (ARITH_FOR_COM
*)xmalloc (sizeof (ARITH_FOR_COM
));
167 new_arith_for
->flags
= com
->flags
;
168 new_arith_for
->line
= com
->line
;
169 new_arith_for
->init
= copy_word_list (com
->init
);
170 new_arith_for
->test
= copy_word_list (com
->test
);
171 new_arith_for
->step
= copy_word_list (com
->step
);
172 new_arith_for
->action
= copy_command (com
->action
);
173 return (new_arith_for
);
175 #endif /* ARITH_FOR_COMMAND */
178 copy_group_command (com
)
181 GROUP_COM
*new_group
;
183 new_group
= (GROUP_COM
*)xmalloc (sizeof (GROUP_COM
));
184 new_group
->command
= copy_command (com
->command
);
188 static SUBSHELL_COM
*
189 copy_subshell_command (com
)
192 SUBSHELL_COM
*new_subshell
;
194 new_subshell
= (SUBSHELL_COM
*)xmalloc (sizeof (SUBSHELL_COM
));
195 new_subshell
->command
= copy_command (com
->command
);
196 new_subshell
->flags
= com
->flags
;
197 return (new_subshell
);
201 copy_case_command (com
)
206 new_case
= (CASE_COM
*)xmalloc (sizeof (CASE_COM
));
207 new_case
->flags
= com
->flags
;
208 new_case
->word
= copy_word (com
->word
);
209 new_case
->clauses
= copy_case_clauses (com
->clauses
);
214 copy_while_command (com
)
217 WHILE_COM
*new_while
;
219 new_while
= (WHILE_COM
*)xmalloc (sizeof (WHILE_COM
));
220 new_while
->flags
= com
->flags
;
221 new_while
->test
= copy_command (com
->test
);
222 new_while
->action
= copy_command (com
->action
);
227 copy_if_command (com
)
232 new_if
= (IF_COM
*)xmalloc (sizeof (IF_COM
));
233 new_if
->flags
= com
->flags
;
234 new_if
->test
= copy_command (com
->test
);
235 new_if
->true_case
= copy_command (com
->true_case
);
236 new_if
->false_case
= copy_command (com
->false_case
);
240 #if defined (DPAREN_ARITHMETIC)
242 copy_arith_command (com
)
245 ARITH_COM
*new_arith
;
247 new_arith
= (ARITH_COM
*)xmalloc (sizeof (ARITH_COM
));
248 new_arith
->flags
= com
->flags
;
249 new_arith
->exp
= copy_word_list (com
->exp
);
250 new_arith
->line
= com
->line
;
256 #if defined (COND_COMMAND)
258 copy_cond_command (com
)
263 new_cond
= (COND_COM
*)xmalloc (sizeof (COND_COM
));
264 new_cond
->flags
= com
->flags
;
265 new_cond
->line
= com
->line
;
266 new_cond
->type
= com
->type
;
267 new_cond
->op
= com
->op
? copy_word (com
->op
) : com
->op
;
268 new_cond
->left
= com
->left
? copy_cond_command (com
->left
) : (COND_COM
*)NULL
;
269 new_cond
->right
= com
->right
? copy_cond_command (com
->right
) : (COND_COM
*)NULL
;
276 copy_simple_command (com
)
279 SIMPLE_COM
*new_simple
;
281 new_simple
= (SIMPLE_COM
*)xmalloc (sizeof (SIMPLE_COM
));
282 new_simple
->flags
= com
->flags
;
283 new_simple
->words
= copy_word_list (com
->words
);
284 new_simple
->redirects
= copy_redirects (com
->redirects
);
285 new_simple
->line
= com
->line
;
289 static FUNCTION_DEF
*
290 copy_function_def (com
)
293 FUNCTION_DEF
*new_def
;
295 new_def
= (FUNCTION_DEF
*)xmalloc (sizeof (FUNCTION_DEF
));
296 new_def
->name
= copy_word (com
->name
);
297 new_def
->command
= copy_command (com
->command
);
298 new_def
->flags
= com
->flags
;
299 new_def
->line
= com
->line
;
303 /* Copy the command structure in COMMAND. Return a pointer to the
304 copy. Don't you forget to dispose_command () on this pointer
307 copy_command (command
)
310 COMMAND
*new_command
;
315 new_command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
316 FASTCOPY ((char *)command
, (char *)new_command
, sizeof (COMMAND
));
317 new_command
->flags
= command
->flags
;
318 new_command
->line
= command
->line
;
320 if (command
->redirects
)
321 new_command
->redirects
= copy_redirects (command
->redirects
);
323 switch (command
->type
)
326 new_command
->value
.For
= copy_for_command (command
->value
.For
);
329 #if defined (ARITH_FOR_COMMAND)
331 new_command
->value
.ArithFor
= copy_arith_for_command (command
->value
.ArithFor
);
335 #if defined (SELECT_COMMAND)
337 new_command
->value
.Select
=
338 (SELECT_COM
*)copy_for_command ((FOR_COM
*)command
->value
.Select
);
343 new_command
->value
.Group
= copy_group_command (command
->value
.Group
);
347 new_command
->value
.Subshell
= copy_subshell_command (command
->value
.Subshell
);
351 new_command
->value
.Case
= copy_case_command (command
->value
.Case
);
356 new_command
->value
.While
= copy_while_command (command
->value
.While
);
360 new_command
->value
.If
= copy_if_command (command
->value
.If
);
363 #if defined (DPAREN_ARITHMETIC)
365 new_command
->value
.Arith
= copy_arith_command (command
->value
.Arith
);
369 #if defined (COND_COMMAND)
371 new_command
->value
.Cond
= copy_cond_command (command
->value
.Cond
);
376 new_command
->value
.Simple
= copy_simple_command (command
->value
.Simple
);
381 CONNECTION
*new_connection
;
383 new_connection
= (CONNECTION
*)xmalloc (sizeof (CONNECTION
));
384 new_connection
->connector
= command
->value
.Connection
->connector
;
385 new_connection
->first
= copy_command (command
->value
.Connection
->first
);
386 new_connection
->second
= copy_command (command
->value
.Connection
->second
);
387 new_command
->value
.Connection
= new_connection
;
391 case cm_function_def
:
392 new_command
->value
.Function_def
= copy_function_def (command
->value
.Function_def
);
395 return (new_command
);