From 67d3b5846d84d4a2e5a31d4e268bc9d51495d7e0 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 3 Sep 2009 19:38:20 -0400 Subject: the C implementation properly loads the plugins, then creates a dependancy tree --- c/plugin-depend.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 c/plugin-depend.c (limited to 'c/plugin-depend.c') diff --git a/c/plugin-depend.c b/c/plugin-depend.c new file mode 100644 index 0000000..4101fe1 --- /dev/null +++ b/c/plugin-depend.c @@ -0,0 +1,102 @@ +/* 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. +*/ + +/* 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); +} + -- cgit v1.2.3-54-g00ecf