X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fbash.git;a=blobdiff_plain;f=copy_cmd.c;h=826e0c3a4650b1833888176d50c93d62a2ce9d4e;hp=991bbc9dafb99c09aef7920156826ec1682106be;hb=HEAD;hpb=726f63884db0132f01745f1fb4465e6621088ccf diff --git a/copy_cmd.c b/copy_cmd.c index 991bbc9..826e0c3 100644 --- a/copy_cmd.c +++ b/copy_cmd.c @@ -2,60 +2,78 @@ primarily for making function definitions, but I'm not sure that anyone else will need it. */ -/* Copyright (C) 1987,1991 Free Software Foundation, Inc. +/* Copyright (C) 1987-2009 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. - 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 version. + 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 3 of the License, or + (at your option) any later version. - Bash is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. + Bash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. 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. */ + along with Bash. If not, see . +*/ -#include +#include "config.h" + +#include "bashtypes.h" -#if defined (HAVE_STRING_H) -# include -#else /* !HAVE_STRING_H */ -# include -#endif /* !HAVE_STRING_H */ +#if defined (HAVE_UNISTD_H) +# include +#endif + +#include #include "shell.h" +static PATTERN_LIST *copy_case_clause __P((PATTERN_LIST *)); +static PATTERN_LIST *copy_case_clauses __P((PATTERN_LIST *)); +static FOR_COM *copy_for_command __P((FOR_COM *)); +#if defined (ARITH_FOR_COMMAND) +static ARITH_FOR_COM *copy_arith_for_command __P((ARITH_FOR_COM *)); +#endif +static GROUP_COM *copy_group_command __P((GROUP_COM *)); +static SUBSHELL_COM *copy_subshell_command __P((SUBSHELL_COM *)); +static COPROC_COM *copy_coproc_command __P((COPROC_COM *)); +static CASE_COM *copy_case_command __P((CASE_COM *)); +static WHILE_COM *copy_while_command __P((WHILE_COM *)); +static IF_COM *copy_if_command __P((IF_COM *)); +#if defined (DPAREN_ARITHMETIC) +static ARITH_COM *copy_arith_command __P((ARITH_COM *)); +#endif +#if defined (COND_COMMAND) +static COND_COM *copy_cond_command __P((COND_COM *)); +#endif +static SIMPLE_COM *copy_simple_command __P((SIMPLE_COM *)); + WORD_DESC * -copy_word (word) - WORD_DESC *word; +copy_word (w) + WORD_DESC *w; { - WORD_DESC *new_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC)); - FASTCOPY ((char *)word, (char *)new_word, sizeof (WORD_DESC)); - new_word->word = savestring (word->word); + WORD_DESC *new_word; + + new_word = make_bare_word (w->word); + new_word->flags = w->flags; return (new_word); } -/* Copy the chain of words in LIST. Return a pointer to +/* Copy the chain of words in LIST. Return a pointer to the new chain. */ WORD_LIST * copy_word_list (list) WORD_LIST *list; { - WORD_LIST *new_list = NULL; + WORD_LIST *new_list; + + for (new_list = (WORD_LIST *)NULL; list; list = list->next) + new_list = make_word_list (copy_word (list->word), new_list); - while (list) - { - WORD_LIST *temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST)); - temp->next = new_list; - new_list = temp; - new_list->word = copy_word (list->word); - list = list->next; - } return (REVERSE_LIST (new_list, WORD_LIST *)); } @@ -63,9 +81,12 @@ static PATTERN_LIST * copy_case_clause (clause) PATTERN_LIST *clause; { - PATTERN_LIST *new_clause = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST)); + PATTERN_LIST *new_clause; + + new_clause = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST)); new_clause->patterns = copy_word_list (clause->patterns); new_clause->action = copy_command (clause->action); + new_clause->flags = clause->flags; return (new_clause); } @@ -73,14 +94,13 @@ static PATTERN_LIST * copy_case_clauses (clauses) PATTERN_LIST *clauses; { - PATTERN_LIST *new_list = (PATTERN_LIST *)NULL; + PATTERN_LIST *new_list, *new_clause; - while (clauses) + for (new_list = (PATTERN_LIST *)NULL; clauses; clauses = clauses->next) { - PATTERN_LIST *new_clause = copy_case_clause (clauses); + new_clause = copy_case_clause (clauses); new_clause->next = new_list; new_list = new_clause; - clauses = clauses->next; } return (REVERSE_LIST (new_list, PATTERN_LIST *)); } @@ -90,89 +110,142 @@ REDIRECT * copy_redirect (redirect) REDIRECT *redirect; { - REDIRECT *new_redirect = (REDIRECT *)xmalloc (sizeof (REDIRECT)); + REDIRECT *new_redirect; + + new_redirect = (REDIRECT *)xmalloc (sizeof (REDIRECT)); +#if 0 FASTCOPY ((char *)redirect, (char *)new_redirect, (sizeof (REDIRECT))); +#else + *new_redirect = *redirect; /* let the compiler do the fast structure copy */ +#endif + + if (redirect->rflags & REDIR_VARASSIGN) + new_redirect->redirector.filename = copy_word (redirect->redirector.filename); + switch (redirect->instruction) { case r_reading_until: case r_deblank_reading_until: - new_redirect->here_doc_eof = savestring (redirect->here_doc_eof); - /* There is NO BREAK HERE ON PURPOSE!!!! */ + new_redirect->here_doc_eof = redirect->here_doc_eof ? savestring (redirect->here_doc_eof) : 0; + /*FALLTHROUGH*/ + case r_reading_string: case r_appending_to: case r_output_direction: case r_input_direction: case r_inputa_direction: case r_err_and_out: + case r_append_err_and_out: case r_input_output: case r_output_force: case r_duplicating_input_word: case r_duplicating_output_word: - new_redirect->redirectee.filename = - copy_word (redirect->redirectee.filename); + case r_move_input_word: + case r_move_output_word: + new_redirect->redirectee.filename = copy_word (redirect->redirectee.filename); + break; + case r_duplicating_input: + case r_duplicating_output: + case r_move_input: + case r_move_output: + case r_close_this: break; } return (new_redirect); } - + REDIRECT * copy_redirects (list) REDIRECT *list; { - REDIRECT *new_list = NULL; + REDIRECT *new_list, *temp; - while (list) + for (new_list = (REDIRECT *)NULL; list; list = list->next) { - REDIRECT *temp = copy_redirect (list); + temp = copy_redirect (list); temp->next = new_list; new_list = temp; - list = list->next; } return (REVERSE_LIST (new_list, REDIRECT *)); } - + static FOR_COM * copy_for_command (com) FOR_COM *com; { - FOR_COM *new_for = (FOR_COM *)xmalloc (sizeof (FOR_COM)); + FOR_COM *new_for; + + new_for = (FOR_COM *)xmalloc (sizeof (FOR_COM)); new_for->flags = com->flags; + new_for->line = com->line; new_for->name = copy_word (com->name); new_for->map_list = copy_word_list (com->map_list); new_for->action = copy_command (com->action); return (new_for); } -#if defined (SELECT_COMMAND) -static SELECT_COM * -copy_select_command (com) - SELECT_COM *com; +#if defined (ARITH_FOR_COMMAND) +static ARITH_FOR_COM * +copy_arith_for_command (com) + ARITH_FOR_COM *com; { - SELECT_COM *new_select = (SELECT_COM *)xmalloc (sizeof (SELECT_COM)); - new_select->flags = com->flags; - new_select->name = copy_word (com->name); - new_select->map_list = copy_word_list (com->map_list); - new_select->action = copy_command (com->action); - return (new_select); + ARITH_FOR_COM *new_arith_for; + + new_arith_for = (ARITH_FOR_COM *)xmalloc (sizeof (ARITH_FOR_COM)); + new_arith_for->flags = com->flags; + new_arith_for->line = com->line; + new_arith_for->init = copy_word_list (com->init); + new_arith_for->test = copy_word_list (com->test); + new_arith_for->step = copy_word_list (com->step); + new_arith_for->action = copy_command (com->action); + return (new_arith_for); } -#endif /* SELECT_COMMAND */ +#endif /* ARITH_FOR_COMMAND */ static GROUP_COM * copy_group_command (com) GROUP_COM *com; { - GROUP_COM *new_group = (GROUP_COM *)xmalloc (sizeof (GROUP_COM)); + GROUP_COM *new_group; + new_group = (GROUP_COM *)xmalloc (sizeof (GROUP_COM)); new_group->command = copy_command (com->command); return (new_group); } +static SUBSHELL_COM * +copy_subshell_command (com) + SUBSHELL_COM *com; +{ + SUBSHELL_COM *new_subshell; + + new_subshell = (SUBSHELL_COM *)xmalloc (sizeof (SUBSHELL_COM)); + new_subshell->command = copy_command (com->command); + new_subshell->flags = com->flags; + return (new_subshell); +} + +static COPROC_COM * +copy_coproc_command (com) + COPROC_COM *com; +{ + COPROC_COM *new_coproc; + + new_coproc = (COPROC_COM *)xmalloc (sizeof (COPROC_COM)); + new_coproc->name = savestring (com->name); + new_coproc->command = copy_command (com->command); + new_coproc->flags = com->flags; + return (new_coproc); +} + static CASE_COM * copy_case_command (com) CASE_COM *com; { - CASE_COM *new_case = (CASE_COM *)xmalloc (sizeof (CASE_COM)); + CASE_COM *new_case; + new_case = (CASE_COM *)xmalloc (sizeof (CASE_COM)); new_case->flags = com->flags; + new_case->line = com->line; new_case->word = copy_word (com->word); new_case->clauses = copy_case_clauses (com->clauses); return (new_case); @@ -182,8 +255,9 @@ static WHILE_COM * copy_while_command (com) WHILE_COM *com; { - WHILE_COM *new_while = (WHILE_COM *)xmalloc (sizeof (WHILE_COM)); + WHILE_COM *new_while; + new_while = (WHILE_COM *)xmalloc (sizeof (WHILE_COM)); new_while->flags = com->flags; new_while->test = copy_command (com->test); new_while->action = copy_command (com->action); @@ -194,36 +268,85 @@ static IF_COM * copy_if_command (com) IF_COM *com; { - IF_COM *new_if = (IF_COM *)xmalloc (sizeof (IF_COM)); + IF_COM *new_if; + new_if = (IF_COM *)xmalloc (sizeof (IF_COM)); new_if->flags = com->flags; new_if->test = copy_command (com->test); new_if->true_case = copy_command (com->true_case); - new_if->false_case = copy_command (com->false_case); + new_if->false_case = com->false_case ? copy_command (com->false_case) : com->false_case; return (new_if); } +#if defined (DPAREN_ARITHMETIC) +static ARITH_COM * +copy_arith_command (com) + ARITH_COM *com; +{ + ARITH_COM *new_arith; + + new_arith = (ARITH_COM *)xmalloc (sizeof (ARITH_COM)); + new_arith->flags = com->flags; + new_arith->exp = copy_word_list (com->exp); + new_arith->line = com->line; + + return (new_arith); +} +#endif + +#if defined (COND_COMMAND) +static COND_COM * +copy_cond_command (com) + COND_COM *com; +{ + COND_COM *new_cond; + + new_cond = (COND_COM *)xmalloc (sizeof (COND_COM)); + new_cond->flags = com->flags; + new_cond->line = com->line; + new_cond->type = com->type; + new_cond->op = com->op ? copy_word (com->op) : com->op; + new_cond->left = com->left ? copy_cond_command (com->left) : (COND_COM *)NULL; + new_cond->right = com->right ? copy_cond_command (com->right) : (COND_COM *)NULL; + + return (new_cond); +} +#endif + static SIMPLE_COM * copy_simple_command (com) SIMPLE_COM *com; { - SIMPLE_COM *new_simple = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM)); + SIMPLE_COM *new_simple; + new_simple = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM)); new_simple->flags = com->flags; new_simple->words = copy_word_list (com->words); - new_simple->redirects = copy_redirects (com->redirects); + new_simple->redirects = com->redirects ? copy_redirects (com->redirects) : (REDIRECT *)NULL; new_simple->line = com->line; return (new_simple); } -static FUNCTION_DEF * +FUNCTION_DEF * +copy_function_def_contents (old, new_def) + FUNCTION_DEF *old, *new_def; +{ + new_def->name = copy_word (old->name); + new_def->command = old->command ? copy_command (old->command) : old->command; + new_def->flags = old->flags; + new_def->line = old->line; + new_def->source_file = old->source_file ? savestring (old->source_file) : old->source_file; + return (new_def); +} + +FUNCTION_DEF * copy_function_def (com) FUNCTION_DEF *com; { - FUNCTION_DEF *new_def = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF)); + FUNCTION_DEF *new_def; - new_def->name = copy_word (com->name); - new_def->command = copy_command (com->command); + new_def = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF)); + new_def = copy_function_def_contents (com, new_def); return (new_def); } @@ -234,72 +357,94 @@ COMMAND * copy_command (command) COMMAND *command; { - COMMAND *new_command = (COMMAND *)NULL; + COMMAND *new_command; - if (command) - { - new_command = (COMMAND *)xmalloc (sizeof (COMMAND)); - FASTCOPY ((char *)command, (char *)new_command, sizeof (COMMAND)); - new_command->flags = command->flags; - new_command->line = command->line; + if (command == NULL) + return (command); - if (command->redirects) - new_command->redirects = copy_redirects (command->redirects); + new_command = (COMMAND *)xmalloc (sizeof (COMMAND)); + FASTCOPY ((char *)command, (char *)new_command, sizeof (COMMAND)); + new_command->flags = command->flags; + new_command->line = command->line; - switch (command->type) - { - case cm_for: - new_command->value.For = copy_for_command (command->value.For); - break; + if (command->redirects) + new_command->redirects = copy_redirects (command->redirects); + + switch (command->type) + { + case cm_for: + new_command->value.For = copy_for_command (command->value.For); + break; + +#if defined (ARITH_FOR_COMMAND) + case cm_arith_for: + new_command->value.ArithFor = copy_arith_for_command (command->value.ArithFor); + break; +#endif #if defined (SELECT_COMMAND) - case cm_select: - new_command->value.Select = copy_select_command (command->value.Select); - break; + case cm_select: + new_command->value.Select = + (SELECT_COM *)copy_for_command ((FOR_COM *)command->value.Select); + break; #endif - case cm_group: - new_command->value.Group = copy_group_command (command->value.Group); - break; + case cm_group: + new_command->value.Group = copy_group_command (command->value.Group); + break; - case cm_case: - new_command->value.Case = copy_case_command (command->value.Case); - break; - - case cm_until: - case cm_while: - new_command->value.While = copy_while_command (command->value.While); - break; - - case cm_if: - new_command->value.If = copy_if_command (command->value.If); - break; - - case cm_simple: - new_command->value.Simple = copy_simple_command (command->value.Simple); - break; - - case cm_connection: - { - CONNECTION *new_connection; - - new_connection = (CONNECTION *)xmalloc (sizeof (CONNECTION)); - new_connection->connector = command->value.Connection->connector; - new_connection->first = - copy_command (command->value.Connection->first); - new_connection->second = - copy_command (command->value.Connection->second); - new_command->value.Connection = new_connection; - break; - } - - /* Pathological case. I'm not even sure that you can have a - function definition as part of a function definition. */ - case cm_function_def: - new_command->value.Function_def = - copy_function_def (command->value.Function_def); + case cm_subshell: + new_command->value.Subshell = copy_subshell_command (command->value.Subshell); + break; + + case cm_coproc: + new_command->value.Coproc = copy_coproc_command (command->value.Coproc); + break; + + case cm_case: + new_command->value.Case = copy_case_command (command->value.Case); + break; + + case cm_until: + case cm_while: + new_command->value.While = copy_while_command (command->value.While); + break; + + case cm_if: + new_command->value.If = copy_if_command (command->value.If); + break; + +#if defined (DPAREN_ARITHMETIC) + case cm_arith: + new_command->value.Arith = copy_arith_command (command->value.Arith); + break; +#endif + +#if defined (COND_COMMAND) + case cm_cond: + new_command->value.Cond = copy_cond_command (command->value.Cond); + break; +#endif + + case cm_simple: + new_command->value.Simple = copy_simple_command (command->value.Simple); + break; + + case cm_connection: + { + CONNECTION *new_connection; + + new_connection = (CONNECTION *)xmalloc (sizeof (CONNECTION)); + new_connection->connector = command->value.Connection->connector; + new_connection->first = copy_command (command->value.Connection->first); + new_connection->second = copy_command (command->value.Connection->second); + new_command->value.Connection = new_connection; break; } + + case cm_function_def: + new_command->value.Function_def = copy_function_def (command->value.Function_def); + break; } return (new_command); }