/* Copyright (C) 2009 Luke Shumaker This file is part of rvs. rvs 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 2, or (at your option) any later version. rvs 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 rvs; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef FILE_plugin-depend.c_SEEN #define FILE_plugin-depend.c_SEEN /* translates a string in syntax `plugin/command' into a pointer to the commnad DON'T plan on using the string again, it will be mutilated! (so we go ahead and free() it) */ struct plugin_command * _plugin_depend_parse(struct plugin *root, char *string) { char *c=strchr(string,'/'); c[0]='\0'; return _plugin_find_command( _plugin_find_plugin(root,string)->child, &c[1]); xfree(string); } /* used by _plugin_depend_add */ void _plugin_depend_add2(struct plugin_command *prev, struct plugin_command *next) { if (prev->d_next==NULL) { prev->d_next=next; } else { _plugin_depend_add2(prev->d_next,next); } } /* _plugin_depend_add(depend,depender) */ void _plugin_depend_add(struct plugin_command *depend, struct plugin_command *depender) { if (depend->child==NULL) { depend->child=depender; } else { _plugin_depend_add2(depend->child,depender); } } /* take care of depends for `command', and those after it (linked list) */ void _plugin_depend_command(struct plugin_command *command, struct plugin_tree *tree) { if (command->depends == NULL) { command->depend=tree->depends; } else { command->depend=_plugin_depend_parse(tree->plugins,command->depends); command->depends=NULL; } _plugin_depend_add(command->depend,command); if (command->p_next != NULL) _plugin_depend_command(command->p_next,tree); } /* take care of commands for a `plugin', and those after it (linked list) */ void _plugin_depend_plugin(struct plugin *plugin, struct plugin_tree *tree) { _plugin_depend_command(plugin->child,tree); if (plugin->next != NULL) { _plugin_depend_plugin(plugin->next,tree); } } /* take care of all depends */ void _plugin_depend(struct plugin_tree *tree) { /* add a blank `root' command for those that don't have depends */ struct plugin_command *command; command=(struct plugin_command *)xmalloc(sizeof(*command)); command->name=NULL; command->plugin=NULL; command->p_next=NULL; command->depend=NULL; command->depends=NULL; command->child=NULL;/*<--only variable of any value */ command->d_next=NULL; tree->depends=command; /* parse all commands */ _plugin_depend_plugin(tree->plugins,tree); } #endif