⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 copy_cmd.c

📁 android-w.song.android.widget
💻 C
字号:
/* copy_command.c -- copy a COMMAND structure.  This is needed   primarily for making function definitions, but I'm not sure   that anyone else will need it.  *//* 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 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.   You should have received a copy of the GNU General Public License   along with Bash.  If not, see <http://www.gnu.org/licenses/>.*/#include "config.h"#include "bashtypes.h"#if defined (HAVE_UNISTD_H)#  include <unistd.h>#endif#include <stdio.h>#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 *));#endifstatic 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 *));#endifstatic SIMPLE_COM *copy_simple_command __P((SIMPLE_COM *));WORD_DESC *copy_word (w)     WORD_DESC *w;{  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   the new chain. */WORD_LIST *copy_word_list (list)     WORD_LIST *list;{  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);  return (REVERSE_LIST (new_list, WORD_LIST *));}static PATTERN_LIST *copy_case_clause (clause)     PATTERN_LIST *clause;{  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);}static PATTERN_LIST *copy_case_clauses (clauses)     PATTERN_LIST *clauses;{  PATTERN_LIST *new_list, *new_clause;  for (new_list = (PATTERN_LIST *)NULL; clauses; clauses = clauses->next)    {      new_clause = copy_case_clause (clauses);      new_clause->next = new_list;      new_list = new_clause;    }  return (REVERSE_LIST (new_list, PATTERN_LIST *));}/* Copy a single redirect. */REDIRECT *copy_redirect (redirect)     REDIRECT *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);      /*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:    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, *temp;  for (new_list = (REDIRECT *)NULL; list; list = list->next)    {      temp = copy_redirect (list);      temp->next = new_list;      new_list = temp;    }  return (REVERSE_LIST (new_list, REDIRECT *));}static FOR_COM *copy_for_command (com)     FOR_COM *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 (ARITH_FOR_COMMAND)static ARITH_FOR_COM *copy_arith_for_command (com)     ARITH_FOR_COM *com;{  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 /* ARITH_FOR_COMMAND */static GROUP_COM *copy_group_command (com)     GROUP_COM *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;  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);}static WHILE_COM *copy_while_command (com)     WHILE_COM *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);  return (new_while);}static IF_COM *copy_if_command (com)     IF_COM *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 = 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);}#endifstatic SIMPLE_COM *copy_simple_command (com)     SIMPLE_COM *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 = com->redirects ? copy_redirects (com->redirects) : (REDIRECT *)NULL;  new_simple->line = com->line;  return (new_simple);}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;  new_def = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));  new_def = copy_function_def_contents (com, new_def);  return (new_def);}/* Copy the command structure in COMMAND.  Return a pointer to the   copy.  Don't you forget to dispose_command () on this pointer   later! */COMMAND *copy_command (command)     COMMAND *command;{  COMMAND *new_command;  if (command == NULL)    return (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->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 =	  (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_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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -