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 1, 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
25 #if defined (HAVE_STRING_H)
27 #else /* !HAVE_STRING_H */
29 #endif /* !HAVE_STRING_H */
37 WORD_DESC
*new_word
= (WORD_DESC
*)xmalloc (sizeof (WORD_DESC
));
38 FASTCOPY ((char *)word
, (char *)new_word
, sizeof (WORD_DESC
));
39 new_word
->word
= savestring (word
->word
);
43 /* Copy the chain of words in LIST. Return a pointer to
49 WORD_LIST
*new_list
= NULL
;
53 WORD_LIST
*temp
= (WORD_LIST
*)xmalloc (sizeof (WORD_LIST
));
54 temp
->next
= new_list
;
56 new_list
->word
= copy_word (list
->word
);
59 return (REVERSE_LIST (new_list
, WORD_LIST
*));
63 copy_case_clause (clause
)
66 PATTERN_LIST
*new_clause
= (PATTERN_LIST
*)xmalloc (sizeof (PATTERN_LIST
));
67 new_clause
->patterns
= copy_word_list (clause
->patterns
);
68 new_clause
->action
= copy_command (clause
->action
);
73 copy_case_clauses (clauses
)
74 PATTERN_LIST
*clauses
;
76 PATTERN_LIST
*new_list
= (PATTERN_LIST
*)NULL
;
80 PATTERN_LIST
*new_clause
= copy_case_clause (clauses
);
81 new_clause
->next
= new_list
;
82 new_list
= new_clause
;
83 clauses
= clauses
->next
;
85 return (REVERSE_LIST (new_list
, PATTERN_LIST
*));
88 /* Copy a single redirect. */
90 copy_redirect (redirect
)
93 REDIRECT
*new_redirect
= (REDIRECT
*)xmalloc (sizeof (REDIRECT
));
94 FASTCOPY ((char *)redirect
, (char *)new_redirect
, (sizeof (REDIRECT
)));
95 switch (redirect
->instruction
)
98 case r_deblank_reading_until
:
99 new_redirect
->here_doc_eof
= savestring (redirect
->here_doc_eof
);
100 /* There is NO BREAK HERE ON PURPOSE!!!! */
102 case r_output_direction
:
103 case r_input_direction
:
104 case r_inputa_direction
:
108 case r_duplicating_input_word
:
109 case r_duplicating_output_word
:
110 new_redirect
->redirectee
.filename
=
111 copy_word (redirect
->redirectee
.filename
);
114 return (new_redirect
);
118 copy_redirects (list
)
121 REDIRECT
*new_list
= NULL
;
125 REDIRECT
*temp
= copy_redirect (list
);
126 temp
->next
= new_list
;
130 return (REVERSE_LIST (new_list
, REDIRECT
*));
134 copy_for_command (com
)
137 FOR_COM
*new_for
= (FOR_COM
*)xmalloc (sizeof (FOR_COM
));
138 new_for
->flags
= com
->flags
;
139 new_for
->name
= copy_word (com
->name
);
140 new_for
->map_list
= copy_word_list (com
->map_list
);
141 new_for
->action
= copy_command (com
->action
);
145 #if defined (SELECT_COMMAND)
147 copy_select_command (com
)
150 SELECT_COM
*new_select
= (SELECT_COM
*)xmalloc (sizeof (SELECT_COM
));
151 new_select
->flags
= com
->flags
;
152 new_select
->name
= copy_word (com
->name
);
153 new_select
->map_list
= copy_word_list (com
->map_list
);
154 new_select
->action
= copy_command (com
->action
);
157 #endif /* SELECT_COMMAND */
160 copy_group_command (com
)
163 GROUP_COM
*new_group
= (GROUP_COM
*)xmalloc (sizeof (GROUP_COM
));
165 new_group
->command
= copy_command (com
->command
);
170 copy_case_command (com
)
173 CASE_COM
*new_case
= (CASE_COM
*)xmalloc (sizeof (CASE_COM
));
175 new_case
->flags
= com
->flags
;
176 new_case
->word
= copy_word (com
->word
);
177 new_case
->clauses
= copy_case_clauses (com
->clauses
);
182 copy_while_command (com
)
185 WHILE_COM
*new_while
= (WHILE_COM
*)xmalloc (sizeof (WHILE_COM
));
187 new_while
->flags
= com
->flags
;
188 new_while
->test
= copy_command (com
->test
);
189 new_while
->action
= copy_command (com
->action
);
194 copy_if_command (com
)
197 IF_COM
*new_if
= (IF_COM
*)xmalloc (sizeof (IF_COM
));
199 new_if
->flags
= com
->flags
;
200 new_if
->test
= copy_command (com
->test
);
201 new_if
->true_case
= copy_command (com
->true_case
);
202 new_if
->false_case
= copy_command (com
->false_case
);
207 copy_simple_command (com
)
210 SIMPLE_COM
*new_simple
= (SIMPLE_COM
*)xmalloc (sizeof (SIMPLE_COM
));
212 new_simple
->flags
= com
->flags
;
213 new_simple
->words
= copy_word_list (com
->words
);
214 new_simple
->redirects
= copy_redirects (com
->redirects
);
215 new_simple
->line
= com
->line
;
219 static FUNCTION_DEF
*
220 copy_function_def (com
)
223 FUNCTION_DEF
*new_def
= (FUNCTION_DEF
*)xmalloc (sizeof (FUNCTION_DEF
));
225 new_def
->name
= copy_word (com
->name
);
226 new_def
->command
= copy_command (com
->command
);
230 /* Copy the command structure in COMMAND. Return a pointer to the
231 copy. Don't you forget to dispose_command () on this pointer
234 copy_command (command
)
237 COMMAND
*new_command
= (COMMAND
*)NULL
;
241 new_command
= (COMMAND
*)xmalloc (sizeof (COMMAND
));
242 FASTCOPY ((char *)command
, (char *)new_command
, sizeof (COMMAND
));
243 new_command
->flags
= command
->flags
;
244 new_command
->line
= command
->line
;
246 if (command
->redirects
)
247 new_command
->redirects
= copy_redirects (command
->redirects
);
249 switch (command
->type
)
252 new_command
->value
.For
= copy_for_command (command
->value
.For
);
255 #if defined (SELECT_COMMAND)
257 new_command
->value
.Select
= copy_select_command (command
->value
.Select
);
262 new_command
->value
.Group
= copy_group_command (command
->value
.Group
);
266 new_command
->value
.Case
= copy_case_command (command
->value
.Case
);
271 new_command
->value
.While
= copy_while_command (command
->value
.While
);
275 new_command
->value
.If
= copy_if_command (command
->value
.If
);
279 new_command
->value
.Simple
= copy_simple_command (command
->value
.Simple
);
284 CONNECTION
*new_connection
;
286 new_connection
= (CONNECTION
*)xmalloc (sizeof (CONNECTION
));
287 new_connection
->connector
= command
->value
.Connection
->connector
;
288 new_connection
->first
=
289 copy_command (command
->value
.Connection
->first
);
290 new_connection
->second
=
291 copy_command (command
->value
.Connection
->second
);
292 new_command
->value
.Connection
= new_connection
;
296 /* Pathological case. I'm not even sure that you can have a
297 function definition as part of a function definition. */
298 case cm_function_def
:
299 new_command
->value
.Function_def
=
300 copy_function_def (command
->value
.Function_def
);
304 return (new_command
);