diff options
author | Jari Aalto <jari.aalto@cante.net> | 1996-08-26 18:22:31 +0000 |
---|---|---|
committer | Jari Aalto <jari.aalto@cante.net> | 2009-09-12 16:46:49 +0000 |
commit | 726f63884db0132f01745f1fb4465e6621088ccf (patch) | |
tree | 6c2f7765a890a97e0e513cb539df43283a8f7c4d /dispose_cmd.c | |
download | bash-726f63884db0132f01745f1fb4465e6621088ccf.tar.gz |
Imported from ../bash-1.14.7.tar.gz.
Diffstat (limited to 'dispose_cmd.c')
-rw-r--r-- | dispose_cmd.c | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/dispose_cmd.c b/dispose_cmd.c new file mode 100644 index 00000000..f420fe16 --- /dev/null +++ b/dispose_cmd.c @@ -0,0 +1,207 @@ +/* dispose_command.c -- dispose of a COMMAND structure. */ + +/* Copyright (C) 1987,1991 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 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. */ + +#include "shell.h" + +/* Dispose of the command structure passed. */ +void +dispose_command (command) + COMMAND *command; +{ + if (!command) return; + + if (command->redirects) + dispose_redirects (command->redirects); + + switch (command->type) + { + case cm_for: + { + register FOR_COM *c = command->value.For; + dispose_word (c->name); + dispose_words (c->map_list); + dispose_command (c->action); + free (c); + break; + } + +#if defined (SELECT_COMMAND) + case cm_select: + { + register SELECT_COM *c = command->value.Select; + dispose_word (c->name); + dispose_words (c->map_list); + dispose_command (c->action); + free (c); + break; + } +#endif + + case cm_group: + { + dispose_command (command->value.Group->command); + free (command->value.Group); + break; + } + + case cm_case: + { + register CASE_COM *c = command->value.Case; + PATTERN_LIST *t, *p = c->clauses; + + dispose_word (c->word); + + while (p) + { + dispose_words (p->patterns); + dispose_command (p->action); + t = p; + p = p->next; + free (t); + } + free (c); + break; + } + + case cm_until: + case cm_while: + { + register WHILE_COM *c = command->value.While; + + dispose_command (c->test); + dispose_command (c->action); + free (c); + break; + } + + case cm_if: + { + register IF_COM *c = command->value.If; + dispose_command (c->test); + dispose_command (c->true_case); + dispose_command (c->false_case); + free (c); + break; + } + + case cm_simple: + { + register SIMPLE_COM *c = command->value.Simple; + dispose_words (c->words); + dispose_redirects (c->redirects); + free (c); + break; + } + + case cm_connection: + { + register CONNECTION *c = command->value.Connection; + dispose_command (c->first); + dispose_command (c->second); + free (c); + break; + } + + case cm_function_def: + { + register FUNCTION_DEF *c = command->value.Function_def; + dispose_word (c->name); + dispose_command (c->command); + free (c); + break; + } + + default: + report_error ("Attempt to free unknown command type `%d'.\n", command->type); + break; + } + free (command); +} + +/* How to free a WORD_DESC. */ +void +dispose_word (word) + WORD_DESC *word; +{ + if (word->word) + free (word->word); + free (word); +} + +/* How to get rid of a linked list of words. A WORD_LIST. */ +void +dispose_words (list) + WORD_LIST *list; +{ + WORD_LIST *t; + while (list) + { + t = list; + list = list->next; + dispose_word (t->word); + free (t); + } +} + +/* How to dispose of an array of pointers to char. */ +void +dispose_word_array (array) + char **array; +{ + register int count; + + for (count = 0; array[count]; count++) + free (array[count]); + + free (array); +} + +/* How to dispose of an list of redirections. A REDIRECT. */ +void +dispose_redirects (list) + REDIRECT *list; +{ + register REDIRECT *t; + + while (list) + { + t = list; + list = list->next; + switch (t->instruction) + { + case r_reading_until: + case r_deblank_reading_until: + free (t->here_doc_eof); + /* ... */ + case r_output_direction: + case r_input_direction: + case r_inputa_direction: + case r_appending_to: + case r_err_and_out: + case r_input_output: + case r_output_force: + case r_duplicating_input_word: + case r_duplicating_output_word: + dispose_word (t->redirectee.filename); + break; + } + free (t); + } +} |