diff options
author | Luke Shumaker <LukeShu@sbcglobal.net> | 2009-09-03 19:38:20 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2015-06-26 00:30:14 -0600 |
commit | 67d3b5846d84d4a2e5a31d4e268bc9d51495d7e0 (patch) | |
tree | 92db2e7852b7ee09e55a68276101566c562a4283 /c/plugin.c | |
parent | 1eacc442394d1f70bbe05dea699c80ca41f26d4c (diff) |
the C implementation properly loads the plugins, then creates a dependancy tree
Diffstat (limited to 'c/plugin.c')
-rw-r--r-- | c/plugin.c | 149 |
1 files changed, 44 insertions, 105 deletions
@@ -7,7 +7,7 @@ the Free Software Foundation; either version 2, or (at your option) any later version. - rvs is distributed in the hope 1. A user enters a username and passwthat it will be useful, but + 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. @@ -32,137 +32,72 @@ #include "rvs.h" #include "plugin.h" -void _parse_comment (FILE *file) +/* finds a plugin with `name'. Start looking at `plugin' (linked list) */ +struct plugin * +_plugin_find_plugin(struct plugin *plugin, char *name) { - char c; - while ( (c=getc(file)) != EOF ) { - if ( c == '\n' ) { - ungetc (c, file); - break; - } - } -} - -char _parse_escape(FILE *file) -{ - char c=getc(file); - switch (c) { - case 'n': - c = '\n'; - case '\\': - case '#': - case ':': - break; - default: - error(EXIT_FAILURE,0,"syntax error"); - break; - } - return c; -} - -char *_parse_depend (FILE *file) -{ - size_t nbytes = 10; - char *string = (char *)xmalloc(nbytes); - - char c[2] = " \0"; - char *cs = (char *)&c; - while ( (c[0]=getc(file)) != EOF ) { - if (c[0] == '\n') { - ungetc (c[0], file); - break; + if (strcmp(plugin->name,name) == 0) { + return plugin; + } else { + if (plugin->next==NULL) { + error(EXIT_FAILURE,0,"cannot find plugin `%s'",name); + return NULL; } else { - switch (c[0]) { - case '\\': - c[0]=_parse_escape(file); - stradds(&nbytes,&string,cs); - break; - case '#': - _parse_comment(file); - break; - default: - stradds(&nbytes,&string,cs); - break; - } + return _plugin_find_plugin(plugin->next,name); } } - return string; } -struct plugin_command *_parse_plugin (struct plugin *plugin, FILE *file) +/* finds a command with `name'. Start looking at `command' (linked list) */ +struct plugin_command * +_plugin_find_command(struct plugin_command *command, char *name) { - struct plugin_command *command; - command=(struct plugin_command *)xmalloc(sizeof(*command)); - command->p_next=NULL; - command->depends=NULL; - - size_t nbytes = 10; - char *string = (char *)xmalloc(nbytes); - strcpy(string,""); - - char c[2] = " \0"; - char *cs = (char *)&c; - if ( (c[0]=getc(file)) == EOF ) { - return NULL; + if (strcmp(command->name,name) == 0) { + return command; } else { - ungetc (c[0], file); - } - while ( (c[0]=getc(file)) != EOF ) { - if (c[0] == '\n') { - if (strcmp(string,"")==0) { - free(command); - free(string); - return _parse_plugin(plugin, file); - } else { - command->name=string; - command->p_next=_parse_plugin(plugin, file); - break; - } + if (command->p_next==NULL) { + error(EXIT_FAILURE,0, + "plugin `%s' does not contain command `%s'", + command->plugin->name,name); + return NULL; } else { - switch (c[0]) { - case '\\': - c[0]=_parse_escape(file); - stradds(&nbytes,&string,cs); - break; - case '#': - _parse_comment(file); - break; - case ':': - command->depends=_parse_depend(file); - break; - default: - stradds(&nbytes,&string,cs); - break; - } + return _plugin_find_command(command->p_next,name); } } - return command; } -struct plugin *load_plugin (char *plug_name, char *plugin_conf) +#include "plugin-parse.c" +#include "plugin-depend.c" + +struct plugin * +_plugin_load (char *plug_name, char *plugin_conf) { - printf("loading plugin `%s'\n",plug_name); struct plugin *plugin=(struct plugin *)xmalloc(sizeof(*plugin)); - plugin->name=plug_name; + char *plug_name2 = (char *)xmalloc(strlen(plug_name)+1); + strcpy(plug_name2,plug_name); + plugin->name=plug_name2; plugin->next=NULL; - chdir(plug_name); + xchdir(plug_name); FILE *file = xfopen(plugin_conf,"r"); - plugin->child=_parse_plugin(plugin, file); + plugin->child=_plugin_parse(plugin, file); fclose( file ); - chdir(".."); + xchdir(".."); return plugin; } -struct plugin_tree *load_plugins (char *libexecdir, char *plugin_conf) +struct plugin_tree * +load_plugins (char *libexecdir, char *plugin_conf) { struct plugin_tree *tree=(struct plugin_tree *)xmalloc(sizeof(*tree)); struct plugin **last=&tree->plugins; + *last=NULL; struct plugin *plugin; - chdir(libexecdir); + xchdir(libexecdir); + DIR *cwd; struct dirent *dirent; int serr; @@ -173,13 +108,17 @@ struct plugin_tree *load_plugins (char *libexecdir, char *plugin_conf) (strcmp(dirent->d_name,"..")!=0)) { serr = stat(dirent->d_name, &sbuf); if (!serr && S_ISDIR(sbuf.st_mode)) { - plugin=load_plugin(dirent->d_name,plugin_conf); - *last=plugin; + plugin=_plugin_load(dirent->d_name,plugin_conf); + *last=plugin;/* this sets the last's `next' */ last=&plugin->next; } } } closedir (cwd); + + _plugin_depend(tree); + + xchdir(".."); return tree; } |