/* 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_h_SEEN #define FILE_plugin_h_SEEN #include "rvs.h" /* a plugin */ /* a generic binary tree emulating a n-ary tree via linked list */ struct plugin { char *name; struct plugin_command *commands;/* left leaf */ struct plugin *next; /* right leaf */ }; /* a single plugin command */ struct plugin_command { /* node */ char *name; struct plugin *plugin; /* which plugin does it belong to? */ struct plugin_command *depend; /* what does this depend on? */ char *depends;/* what does this depend on? (string) */ /* linked list */ struct plugin_command *next; }; /* create a blank plugin_command */ struct plugin_command * mkcommand() { struct plugin_command *command; command=(struct plugin_command *)xmalloc(sizeof(*command)); /* node */ command->name=NULL; command->plugin=NULL; command->depend=NULL; command->depends=NULL; /* linked list */ command->next=NULL; return command; } struct plugin * plugin_find_plugin(struct plugin *node, char *name) { if (node==NULL) return node; else { if (strcmp(node->name,name) == 0) return node; else return plugin_find_plugin(node->next,name); } } struct plugin_command * plugin_find_plugin_command(struct plugin_command *node, char *name) { if (node==NULL) return node; else { if (strcmp(node->name,name) == 0) return node; else return plugin_find_plugin_command(node->next,name); } } /* returns the first command with `name' it finds Perhaps it should return a linked list of all commands with `name'? This would require a dedicated struct for the function. That makes me kind of want to move it to another file. */ struct plugin_command * plugin_find_command(struct plugin *plugin, char *name) { struct plugin_command *ret; ret=plugin_find_plugin_command(plugin->commands,name); if (ret == NULL) ret=plugin_find_command(plugin->next,name); return ret; } void plugin_free_command(struct plugin_command *command) { if (command!=NULL) { #ifdef DEBUG printf(" + %s\n",command->name); #endif xfree(command->name); xfree(command->depends); xfree(command); plugin_free_command(command->next); } } void plugin_free_plugin(struct plugin *plugin) { if (plugin!=NULL) { #ifdef DEBUG printf(" - %s\n",plugin->name); #endif xfree(plugin->name); plugin_free_command(plugin->commands); plugin_free_plugin(plugin->next); } } #endif