summaryrefslogtreecommitdiff
path: root/c/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/plugin.c')
-rw-r--r--c/plugin.c149
1 files changed, 44 insertions, 105 deletions
diff --git a/c/plugin.c b/c/plugin.c
index 7b0146b..7182626 100644
--- a/c/plugin.c
+++ b/c/plugin.c
@@ -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;
}