From bddd6fb07906e660260ef0fced05440ecac8d9e9 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 24 Oct 2009 02:23:22 -0400 Subject: switching to git --- wrapper/Makefile.in | 18 +++++- wrapper/plugin-depend.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++ wrapper/plugin-depend.h | 113 +++++++++---------------------------- wrapper/plugin-find.c | 103 ++++++++++++++++++++++++++++++++++ wrapper/plugin-find.h | 70 ++++------------------- wrapper/plugin-load.c | 78 ++++++++++++++++++++++++++ wrapper/plugin-load.h | 43 ++------------ wrapper/plugin-parse.c | 132 +++++++++++++++++++++++++++++++++++++++++++ wrapper/plugin-parse.h | 100 +++------------------------------ wrapper/plugin-run.c | 89 +++++++++++++++++++++++++++++ wrapper/plugin-run.h | 47 ++++++++++++++++ wrapper/plugins.c | 71 +++++++++++++++++++++++ wrapper/plugins.h | 46 +++------------ wrapper/runcom.c | 26 ++++++--- wrapper/rvs.c | 117 ++++++++++++++++++++++++++++++++++++++ wrapper/rvs.h | 87 ++++++----------------------- wrapper/rvs.sh | 7 ++- wrapper/structures.h | 60 -------------------- 18 files changed, 895 insertions(+), 458 deletions(-) create mode 100644 wrapper/plugin-depend.c create mode 100644 wrapper/plugin-find.c create mode 100644 wrapper/plugin-load.c create mode 100644 wrapper/plugin-parse.c create mode 100644 wrapper/plugin-run.c create mode 100644 wrapper/plugin-run.h create mode 100644 wrapper/plugins.c create mode 100644 wrapper/rvs.c delete mode 100644 wrapper/structures.h (limited to 'wrapper') diff --git a/wrapper/Makefile.in b/wrapper/Makefile.in index 6bdd8d5..9584a2a 100644 --- a/wrapper/Makefile.in +++ b/wrapper/Makefile.in @@ -1,6 +1,6 @@ #!/usr/bin/make -f name = @name@ -ver = 0.8r57 +ver = 0.8r60 # Copyright (C) 2009 Luke Shumaker # # This file is part of rvs. @@ -44,7 +44,11 @@ INSTALL_DATA ?= $(INSTALL) -m 644 TOUCH ?= touch # This file doesn't use touch #export RVS SHELL RM CP SED INSTALL MKDIR INSTALL_PROGRAM INSTALL_DATA TOUCH -CFLAGS = -DLIBEXECDIR=\"$(libexecdir)/$(rvs)\" -DPLUGIN_CONF=\"plugin.conf\" +CFLAGS = -g \ + -DNAME=\"$(name)\" \ + -DVER=\"$(ver)\" \ + -Dlibexecdir=\"$(libexecdir)/$(rvs)\" \ + -Dplugin_conf=\"plugin.conf\" # phony targets #################################################### all : rvs runcom @@ -58,6 +62,16 @@ install : $(RVS) $(RUNCOM) $(RVS) : rvs $(dir $(RVS)) $(INSTALL_PROGRAM) $< $@ +OBJ = runcom.o rvs.o plugins.o \ + plugin-depend.o \ + plugin-find.o \ + plugin-load.o \ + plugin-parse.o \ + plugin-run.o \ + +runcom: $(OBJ) + gcc -o $@ $^ + $(RUNCOM): runcom $(dir $(RUNCOM)) $(INSTALL_PROGRAM) $< $@ diff --git a/wrapper/plugin-depend.c b/wrapper/plugin-depend.c new file mode 100644 index 0000000..de21a93 --- /dev/null +++ b/wrapper/plugin-depend.c @@ -0,0 +1,146 @@ +/* wrapper/plugin-depend.c -- load a command dependancy tree + system depends: + 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. +*/ + +#include +#include + +#include "rvs.h" +#include "plugin-find.h" + +#include "plugin-depend.h" + +/* translates a string in format `plugin/command' into a pointer to the command + DON'T plan on using the string again, it will be mutilated! + (so we go ahead and free() it and set the pointer to NULL) */ +struct plugin_command * +plugin_depend_parse (char **string, + struct plugin *plugins, + struct plugin_command *root) +{ + struct plugin_command *command=NULL; + + if (*string==NULL) + command=root; + else { + /* *string is in the format `plugin/command' */ + /* char *del=delimeter */ + char *del=strchr(*string,'/'); + del[0]='\0'; + /* *string = PLUGIN_NAME */ + /* &del[1] = COMMAND_NAME */ + struct plugin *plugin; + plugin =plugin_find_plugin(plugins, *string ); + if (plugin==NULL) + error(EXIT_FAILURE,0,"cannot find plugin `%s'",*string); + command=plugin_find_plugin_command(plugin->commands, &del[1] ); + if (command==NULL) + error(EXIT_FAILURE,0, + "plugin `%s' does not contain command `%s'", + *string,&del[1]); + xfree(*string); + *string=NULL; + } + return command; +} + +/* used by plugin_depend_add */ +void +_plugin_depend_add (struct plugin_command *prev, + struct plugin_command *next) +{ + if (prev->d_next==NULL) { + prev->d_next=next; + } else { + _plugin_depend_add(prev->d_next,next); + } +} + +/* plugin_depend_add(depend,depender) */ +void +plugin_depend_add (struct plugin_command *depend, + struct plugin_command *depender) +{ + if (depend->d_child==NULL) { + depend->d_child=depender; + } else { + _plugin_depend_add(depend->d_child,depender); + } +} + +/* take care of depends for `command' */ +void +plugin_depend_command (struct plugin_command *command, + struct plugin *plugins, + struct plugin_command *root, int ind) +{ + if (command!=NULL) { + if (command->depend == NULL) { + /* the depend still needs to be parsed */ + command->depend=plugin_depend_parse( + &(command->depends),plugins,root); + } + plugin_depend_add(command->depend,command); + } +} + +/* take care of commands for a `plugin', and those after it (linked list) */ +void +plugin_depend_plugin_all (struct plugin *plugin, + struct plugin *plugins, + struct plugin_command *root) +{ + plugin_depend_command(plugin->commands,plugins,root,0); + if (plugin->next != NULL) { + plugin_depend_plugin_all(plugin->next,plugins,root); + } +} + +/* take care of all depends */ +struct plugin_command * +plugin_depend_all (struct plugin *plugins) +{ + struct plugin_command *root=plugin_mk_command(); + + plugin_depend_plugin_all(plugins,plugins,root); + return root; +} + +void +_plugin_depend_list (struct plugin_command_list *commands, + struct plugin *plugins, + struct plugin_command *root,int ind) +{ + if (commands!=NULL) { + plugin_depend_command(commands->command,plugins,root,ind++); + _plugin_depend_list(commands->next,plugins,root,ind++); + } +} + +struct plugin_command * +plugin_depend_list (struct plugin_command_list *commands, + struct plugin *plugins) +{ + struct plugin_command *root=plugin_mk_command(); + _plugin_depend_list(commands,plugins,root,0); + return root; +} + diff --git a/wrapper/plugin-depend.h b/wrapper/plugin-depend.h index 6b18bde..580c03f 100644 --- a/wrapper/plugin-depend.h +++ b/wrapper/plugin-depend.h @@ -1,5 +1,7 @@ -/* Copyright (C) 2009 Luke Shumaker - system depends: +/* wrapper/plugin-parse.h -- parse rvs plugin config files + system depends: + Copyright (C) 2009 Luke Shumaker + This file is part of rvs. rvs is free software; you can redistribute it and/or modify it @@ -20,127 +22,62 @@ #ifndef FILE_plugin_depend_h_SEEN #define FILE_plugin_depend_h_SEEN -#include -#include - -#include "rvs.h" +#include "plugins.h" #include "plugin-find.h" /* translates a string in format `plugin/command' into a pointer to the command DON'T plan on using the string again, it will be mutilated! (so we go ahead and free() it and set the pointer to NULL) */ +extern struct plugin_command * plugin_depend_parse (char **string, struct plugin *plugins, - struct plugin_command *root) -{ - struct plugin_command *command=NULL; - - if (*string==NULL) - command=root; - else { - /* *string is in the format `plugin/command' */ - /* char *del=delimeter */ - char *del=strchr(*string,'/'); - del[0]='\0'; - /* *string = PLUGIN_NAME */ - /* &del[1] = COMMAND_NAME */ - struct plugin *plugin; - plugin =plugin_find_plugin(plugins, *string ); - if (plugin==NULL) - error(EXIT_FAILURE,0,"cannot find plugin `%s'",*string); - command=plugin_find_plugin_command(plugin->commands, &del[1] ); - if (command==NULL) - error(EXIT_FAILURE,0, - "plugin `%s' does not contain command `%s'", - *string,&del[1]); - xfree(*string); - *string=NULL; - } - return command; -} + struct plugin_command *root); /* used by plugin_depend_add */ +extern void _plugin_depend_add (struct plugin_command *prev, - struct plugin_command *next) -{ - if (prev->d_next==NULL) { - prev->d_next=next; - } else { - _plugin_depend_add(prev->d_next,next); - } -} + struct plugin_command *next); /* plugin_depend_add(depend,depender) */ +extern void plugin_depend_add (struct plugin_command *depend, - struct plugin_command *depender) -{ - if (depend->d_child==NULL) { - depend->d_child=depender; - } else { - _plugin_depend_add(depend->d_child,depender); - } -} + struct plugin_command *depender); /* take care of depends for `command' */ +extern void plugin_depend_command (struct plugin_command *command, struct plugin *plugins, - struct plugin_command *root, int ind) -{ - if (command!=NULL) { - if (command->depend == NULL) { - /* the depend still needs to be parsed */ - command->depend=plugin_depend_parse( - &(command->depends),plugins,root); - } - plugin_depend_add(command->depend,command); - } -} + struct plugin_command *root, int ind); /* take care of commands for a `plugin', and those after it (linked list) */ +extern void plugin_depend_plugin_all (struct plugin *plugin, struct plugin *plugins, - struct plugin_command *root) -{ - plugin_depend_command(plugin->commands,plugins,root,0); - if (plugin->next != NULL) { - plugin_depend_plugin_all(plugin->next,plugins,root); - } -} - + struct plugin_command *root); + /* take care of all depends */ +extern struct plugin_command * -plugin_depend_all (struct plugin *plugins) -{ - struct plugin_command *root=plugin_mk_command(); - - plugin_depend_plugin_all(plugins,plugins,root); - return root; -} +plugin_depend_all (struct plugin *plugins); +extern void _plugin_depend_list (struct plugin_command_list *commands, struct plugin *plugins, - struct plugin_command *root,int ind) -{ - if (commands!=NULL) { - plugin_depend_command(commands->command,plugins,root,ind++); - _plugin_depend_list(commands->next,plugins,root,ind++); - } -} + struct plugin_command *root,int ind); +extern struct plugin_command * plugin_depend_list (struct plugin_command_list *commands, - struct plugin *plugins) -{ - struct plugin_command *root=plugin_mk_command(); - _plugin_depend_list(commands,plugins,root,0); - return root; -} + struct plugin *plugins); + + + #endif diff --git a/wrapper/plugin-find.c b/wrapper/plugin-find.c new file mode 100644 index 0000000..98e16af --- /dev/null +++ b/wrapper/plugin-find.c @@ -0,0 +1,103 @@ +/* wrapper/plugin-find.h -- search functions for rvs plugins + system depends: + 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. +*/ + +#include /* only uses `strcmp' */ + +#include "rvs.h" +#include "plugins.h" + +#include "plugin-find.h" + +/* returns first plugin with `name' (duplicates are... unwise) */ +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); + } +} + +/* returns plugin `name within plugin `node' */ +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 */ +struct plugin_command * +plugin_find_command(struct plugin *plugin, char *name) +{ + if (plugin==NULL) + return NULL; + else { + struct plugin_command *ret; + ret=plugin_find_plugin_command(plugin->commands,name); + if (ret == NULL) + ret=plugin_find_command(plugin->next,name); + return ret; + } +} + +/* returns a linked list of all commands with `name' it finds */ +struct plugin_command_list * +plugin_find_commands(struct plugin *plugin, char *name) +{ + if (plugin==NULL) + return NULL; + else { + struct plugin_command *command; + command=plugin_find_command(plugin,name); + struct plugin_command_list *node; + if (command==NULL) + node=plugin_find_commands(plugin->next,name); + else { + node=xmalloc( sizeof *node ); + node->command=command; + node->next=plugin_find_commands(plugin->next,name); + } + return node; + } +} + +void +plugin_free_list(struct plugin_command_list *node) +{ + if (node!=NULL) { + plugin_free_list(node->next); + xfree(node); + } +} + diff --git a/wrapper/plugin-find.h b/wrapper/plugin-find.h index 1a5096b..0185117 100644 --- a/wrapper/plugin-find.h +++ b/wrapper/plugin-find.h @@ -37,78 +37,28 @@ struct plugin_command_list /*-----------------------------function-----------------------------*/ /* returns first plugin with `name' (duplicates are... unwise) */ +extern 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); - } -} +plugin_find_plugin(struct plugin *node, char *name); /* returns plugin `name within plugin `node' */ +extern 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); - } -} +plugin_find_plugin_command(struct plugin_command *node, char *name); /* returns the first command with `name' it finds */ +extern struct plugin_command * -plugin_find_command(struct plugin *plugin, char *name) -{ - if (plugin==NULL) - return NULL; - else { - struct plugin_command *ret; - ret=plugin_find_plugin_command(plugin->commands,name); - if (ret == NULL) - ret=plugin_find_command(plugin->next,name); - return ret; - } -} +plugin_find_command(struct plugin *plugin, char *name); /* returns a linked list of all commands with `name' it finds */ +extern struct plugin_command_list * -plugin_find_commands(struct plugin *plugin, char *name) -{ - if (plugin==NULL) - return NULL; - else { - struct plugin_command *command; - command=plugin_find_command(plugin,name); - struct plugin_command_list *node; - if (command==NULL) - node=plugin_find_commands(plugin->next,name); - else { - node=xmalloc( sizeof *node ); - node->command=command; - node->next=plugin_find_commands(plugin->next,name); - } - return node; - } -} +plugin_find_commands(struct plugin *plugin, char *name); +extern void -plugin_free_list(struct plugin_command_list *node) -{ - if (node!=NULL) { - plugin_free_list(node->next); - xfree(node); - } -} +plugin_free_list(struct plugin_command_list *node); #endif diff --git a/wrapper/plugin-load.c b/wrapper/plugin-load.c new file mode 100644 index 0000000..142fcd5 --- /dev/null +++ b/wrapper/plugin-load.c @@ -0,0 +1,78 @@ +/* wrapper/plugin-load.h -- load rvs plugins into mem + system depens: , GNU + 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. +*/ + +#include +#include + +#include "rvs.h" +#include "plugins.h" +#include "plugin-parse.h" + +#include "plugin-load.h" + +/*- plugin_load ----------------------------------------------------*\ + now, load plugin plug_name, +\* whose configuration file is plugin_conf */ +struct plugin * +plugin_load (const char *plug_name) +{ + struct plugin *plugin=xmalloc( sizeof(*plugin) ); + plugin->name=stralloc(plug_name); + plugin->next=NULL; + + xchdir(plug_name); + FILE *file = xfopen(plugin_conf,"r"); + plugin->commands=plugin_parse(plugin, file); + fclose( file ); + xchdir(".."); + + return plugin; +} + +/*- load_plugins ---------------------------------------------------*\ + Load all the plugins + assume we're in rvs's libexecdir, where plugins are +\* Use `plugin_conf' as the name of the config file for each plugin */ + +struct plugin * +load_plugins (FILE *list) +{ + struct plugin *first=NULL; /* we return this */ + struct plugin **prev=&first; /* this is the previous plugin->next */ + struct plugin *plugin; /* this is the current plugin */ + + size_t nbytes = 10; + char *plug_name=(char *)xmalloc(nbytes); + while ( getline(&plug_name, &nbytes, list) > 0 ) { + char *del=strchr(plug_name,'\n'); + del[0]='\0'; + /*if (strlen(plug_name)!=0) {*/ + if (plug_name[0]!='\0') {; + plugin=plugin_load(plug_name); + *prev=plugin;/* this sets the last's `next' */ + prev=&plugin->next; + } + } + + return first; +} + diff --git a/wrapper/plugin-load.h b/wrapper/plugin-load.h index e3677a6..f214151 100644 --- a/wrapper/plugin-load.h +++ b/wrapper/plugin-load.h @@ -1,5 +1,5 @@ /* wrapper/plugin-load.h -- load rvs plugins into mem - system depens: + system depens: , GNU Copyright (C) 2009 Luke Shumaker This file is part of rvs. @@ -32,49 +32,16 @@ /*- plugin_load ----------------------------------------------------*\ now, load plugin plug_name, \* whose configuration file is plugin_conf */ +extern struct plugin * -plugin_load (const char *plug_name, const char *plugin_conf) -{ - struct plugin *plugin=xmalloc( sizeof(*plugin) ); - plugin->name=stralloc(plug_name); - plugin->next=NULL; - - xchdir(plug_name); - FILE *file = xfopen(plugin_conf,"r"); - plugin->commands=plugin_parse(file); - fclose( file ); - xchdir(".."); - - return plugin; -} +plugin_load (const char *plug_name); /*- load_plugins ---------------------------------------------------*\ Load all the plugins assume we're in rvs's libexecdir, where plugins are \* Use `plugin_conf' as the name of the config file for each plugin */ - +extern struct plugin * -load_plugins (FILE *list, const char *plugin_conf) -{ - struct plugin *first=NULL; /* we return this */ - struct plugin **prev=&first; /* this is the previous plugin->next */ - struct plugin *plugin; /* this is the current plugin */ - - size_t nbytes = 10; - char *plug_name=(char *)xmalloc(nbytes); - while ( getline(&plug_name, &nbytes, list) > 0 ) { - char *del=strchr(plug_name,'\n'); - del[0]='\0'; - /*if (strlen(plug_name)!=0) {*/ - if (plug_name[0]!='\0') {; - plugin=plugin_load(plug_name,plugin_conf); - *prev=plugin;/* this sets the last's `next' */ - prev=&plugin->next; - } - } - - return first; -} - +load_plugins (FILE *list); #endif diff --git a/wrapper/plugin-parse.c b/wrapper/plugin-parse.c new file mode 100644 index 0000000..4a35586 --- /dev/null +++ b/wrapper/plugin-parse.c @@ -0,0 +1,132 @@ +/* wrapper/plugin-parse.c -- parse rvs plugin config files + system depends: + 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. +*/ + +#include +#include +#include /* only used in `plugin_parse_escape' for `error' */ + +#include "rvs.h" +#include "plugins.h" + +#include "plugin-parse.h" + +void +plugin_parse_comment (FILE *file) +{ + char c; + while ( (c=getc(file)) != EOF ) { + if ( c == '\n' ) { + ungetc (c, file); + break; + } + } +} + +char +plugin_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; +} + +#define _parse_share(string) \ + case '#':\ + plugin_parse_comment(file);\ + break;\ + case '\\':\ + c[0]=plugin_parse_escape(file);\ + default:\ + stradds(&nbytes,string,(char *)&c);\ + break; + +char * +plugin_parse_depend (FILE *file) +{ + size_t nbytes = 10; + char *string = (char *)xmalloc(nbytes); + string[0]='\0'; + + char c[2] = " \0"; + while ( (c[0]=getc(file)) != EOF ) { + switch (c[0]) { + case '\n': + ungetc (c[0], file); + return string; + break; + _parse_share(&string) + } + } + return string; +} + +struct plugin_command * +plugin_parse (struct plugin *plugin, FILE *file) +{ + struct plugin_command *command; + + char c[2] = " \0"; + c[0]=getc(file); + + if (c[0]==EOF) + command=NULL; + else { + ungetc (c[0], file); + command=plugin_mk_command(); + command->plugin=plugin; + + size_t nbytes = 10; + command->name = (char *)xmalloc(nbytes); + command->name[0]='\0'; + + while ( (c[0]=getc(file)) != EOF ) { + switch (c[0]) { + case '\n': + /*if (strlen(command->name)==0) {*/ + if (command->name[0]=='\0') { + plugin_free_command(command); + return plugin_parse(plugin,file); + } else + command->next=plugin_parse( + plugin,file); + break; + case ':': + command->depends=plugin_parse_depend( + file); + break; + _parse_share(&(command->name)) + } + } + } + return command; +} + diff --git a/wrapper/plugin-parse.h b/wrapper/plugin-parse.h index 8a565db..67ee06f 100644 --- a/wrapper/plugin-parse.h +++ b/wrapper/plugin-parse.h @@ -29,105 +29,21 @@ #include "rvs.h" #include "plugins.h" +extern void -plugin_parse_comment (FILE *file) -{ - char c; - while ( (c=getc(file)) != EOF ) { - if ( c == '\n' ) { - ungetc (c, file); - break; - } - } -} +plugin_parse_comment (FILE *file); +extern char -plugin_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; -} - -#define _parse_share(string) \ - case '#':\ - plugin_parse_comment(file);\ - break;\ - case '\\':\ - c[0]=plugin_parse_escape(file);\ - default:\ - stradds(&nbytes,string,(char *)&c);\ - break; +plugin_parse_escape(FILE *file); +extern char * -plugin_parse_depend (FILE *file) -{ - size_t nbytes = 10; - char *string = (char *)xmalloc(nbytes); - string[0]='\0'; - - char c[2] = " \0"; - while ( (c[0]=getc(file)) != EOF ) { - switch (c[0]) { - case '\n': - ungetc (c[0], file); - return string; - break; - _parse_share(&string) - } - } - return string; -} +plugin_parse_depend (FILE *file); +extern struct plugin_command * -plugin_parse (FILE *file) -{ - struct plugin_command *command; - - char c[2] = " \0"; - c[0]=getc(file); - - if (c[0]==EOF) - command=NULL; - else { - ungetc (c[0], file); - command=plugin_mk_command(); - - size_t nbytes = 10; - command->name = (char *)xmalloc(nbytes); - command->name[0]='\0'; - - while ( (c[0]=getc(file)) != EOF ) { - switch (c[0]) { - case '\n': - /*if (strlen(command->name)==0) {*/ - if (command->name[0]=='\0') { - plugin_free_command(command); - return plugin_parse(file); - } else - command->next=plugin_parse( - file); - break; - case ':': - command->depends=plugin_parse_depend( - file); - break; - _parse_share(&(command->name)) - } - } - } - return command; -} +plugin_parse (struct plugin *plugin, FILE *file); #endif diff --git a/wrapper/plugin-run.c b/wrapper/plugin-run.c new file mode 100644 index 0000000..26d4480 --- /dev/null +++ b/wrapper/plugin-run.c @@ -0,0 +1,89 @@ +/* wrapper/plugin-run.c -- run a heiarchy of commands + system depens: + 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. +*/ + +#include +#include + +#include "rvs.h" +#include "plugins.h" +#include "plugin-find.h" + +#include "plugin-run.h" + +/* this function is an ugly hack */ +char * +_plugin_sh_mktemp() +{ + size_t nbytes = 10; + char *string = (char *)malloc(nbytes); + string[0]='\0'; + + FILE *out=popen("mktemp -t rvs-XXXXXXXXXX","r"); + char c[2]=" \0"; + while ( (c[0]=getc(out)) != '\n' ) { + stradds(&nbytes,&string,(char *)&c); + } + pclose(out); + return string; +} + +void +plugin_run_command(struct plugin_command *command, char *args, char *depfile) +{ + if (command!=NULL) { + char *outfile=_plugin_sh_mktemp(); + /* make command string: + `libexecdir/plugin_name/command < depfile > outfile' + */ + int nbytes=20; + char *coms=(char *)xmalloc(nbytes); + coms[0]='\0'; + stradds(&nbytes,&coms,libexecdir); + stradds(&nbytes,&coms,"/"); + stradds(&nbytes,&coms,command->plugin->name); + stradds(&nbytes,&coms,"/"); + stradds(&nbytes,&coms,command->name); + stradds(&nbytes,&coms," "); + stradds(&nbytes,&coms,args); + stradds(&nbytes,&coms," < "); + stradds(&nbytes,&coms,depfile); + stradds(&nbytes,&coms," > "); + stradds(&nbytes,&coms,outfile); + + xsystem(coms); + xfree(coms); + plugin_run_command(command->d_child,args,outfile); + xfree(outfile); + plugin_run_command(command->d_next ,args,depfile); + } +} + +/* needs to take the root command */ +void +plugin_run(struct plugin_command *command,char *args) +{ + /*plugin_run_command(command->d_child,"/dev/null");*/ + char *outfile=_plugin_sh_mktemp(); + plugin_run_command(command->d_child,args,outfile); + xfree(outfile); +} + diff --git a/wrapper/plugin-run.h b/wrapper/plugin-run.h new file mode 100644 index 0000000..99beff4 --- /dev/null +++ b/wrapper/plugin-run.h @@ -0,0 +1,47 @@ +/* wrapper/plugin-run.h -- run a heiarchy of commands + system depens: + 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_run_h_SEEN +#define FILE_plugin_run_h_SEEN + +#include +#include + +#include "rvs.h" +#include "plugins.h" +#include "plugin-find.h" + +/* this function is an ugly hack */ +extern +char * +_plugin_sh_mktemp(); + +extern +void +plugin_run_command(struct plugin_command *command, char *args, char *depfile); + +/* needs to take the root command */ +extern +void +plugin_run(struct plugin_command *command, char *args); + +#endif + diff --git a/wrapper/plugins.c b/wrapper/plugins.c new file mode 100644 index 0000000..70ce3e1 --- /dev/null +++ b/wrapper/plugins.c @@ -0,0 +1,71 @@ +/* wrapper/plugins.c -- struct definitions and basic functions for rvs plugins + system depends: this file is truly system-independant + 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. +*/ + +#include "rvs.h" + +#include "plugins.h" + +/* create a blank plugin_command */ +struct plugin_command * +plugin_mk_command() +{ + 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; + + /* depends */ + command->d_child=NULL; + command->d_next=NULL; + + return command; +} + +void +plugin_free_command(struct plugin_command *command) +{ + if (command!=NULL) { + plugin_free_command(command->next); + xfree(command->name); + xfree(command->depends); + xfree(command); + } +} + +void +plugin_free_plugin(struct plugin *plugin) +{ + if (plugin!=NULL) { + xfree(plugin->name); + plugin_free_command(plugin->commands); + plugin_free_plugin(plugin->next); + xfree(plugin); + } +} + diff --git a/wrapper/plugins.h b/wrapper/plugins.h index c5fb53d..2b5a96e 100644 --- a/wrapper/plugins.h +++ b/wrapper/plugins.h @@ -1,7 +1,7 @@ /* wrapper/plugins.h -- struct definitions and basic functions for rvs plugins system depends: this file is truly system-independant Copyright (C) 2009 Luke Shumaker - system depends: this file is completely system-independant + This file is part of rvs. rvs is free software; you can redistribute it and/or modify it @@ -53,49 +53,17 @@ struct plugin_command }; /* create a blank plugin_command */ +extern struct plugin_command * -plugin_mk_command() -{ - 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; - - /* depends */ - command->d_child=NULL; - command->d_next=NULL; - - return command; -} +plugin_mk_command(); +extern void -plugin_free_command(struct plugin_command *command) -{ - if (command!=NULL) { - plugin_free_command(command->next); - xfree(command->name); - xfree(command->depends); - xfree(command); - } -} +plugin_free_command(struct plugin_command *command); +extern void -plugin_free_plugin(struct plugin *plugin) -{ - if (plugin!=NULL) { - xfree(plugin->name); - plugin_free_command(plugin->commands); - plugin_free_plugin(plugin->next); - xfree(plugin); - } -} +plugin_free_plugin(struct plugin *plugin); #endif diff --git a/wrapper/runcom.c b/wrapper/runcom.c index d1b1cf4..10e9919 100644 --- a/wrapper/runcom.c +++ b/wrapper/runcom.c @@ -1,6 +1,6 @@ -const char *name="rvs"; -const char *ver="0.8c"; -/* Copyright (C) 2009 Luke Shumaker +/* wrapper/runcom.c -- main program loop + system depends: this file is truly system-independant + Copyright (C) 2009 Luke Shumaker This file is part of rvs. @@ -20,8 +20,8 @@ const char *ver="0.8c"; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -extern const char *libexecdir=LIBEXECDIR; -const char *plugin_conf=PLUGIN_CONF; +const char *name=NAME; +const char *ver=VER; #include "rvs.h" #include "plugins.h" @@ -35,9 +35,10 @@ main ( int argc, char *argv[] ) { if (argc > 1) { /*load*/ + char *cwd=getcwd(NULL,0); xchdir(libexecdir); struct plugin *plugins; - plugins=load_plugins(stdin, plugin_conf); + plugins=load_plugins(stdin); struct plugin_command_list *list; list=plugin_find_commands(plugins,argv[1]); if (list==NULL) @@ -47,7 +48,18 @@ main ( int argc, char *argv[] ) root=plugin_depend_list(list,plugins); /*do*/ - plugin_run(root); + xchdir(cwd); + int nbytes=10; + char *args=xmalloc(nbytes); + args[0]='\0'; + int i; + for (i=2; i + 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. +*/ + +#include +#include +#include +#include +#include +#include + +#include "rvs.h" + +void * +xmalloc (size_t size) +{ + void *value = malloc (size); + if (value == NULL) { + perror(program_invocation_name); + exit(EXIT_FAILURE); + } + return value; +} + +void * +xrealloc (void *ptr, size_t size) +{ + void *value = realloc (ptr, size); + if (value == NULL) { + perror(program_invocation_name); + exit(EXIT_FAILURE); + } + return value; +} + +void +xfree (void *ptr) +{ + if (ptr!=NULL) + free (ptr); +} + +void +xsystem (const char *command) +{ + int stat=system(command); + if (stat!=0) { + if (stat==-1) { + fprintf(stderr, + "%s: unable to launch run command", + program_invocation_name); + exit(EXIT_FAILURE); + } else + exit(EXIT_FAILURE); + } +} + +/* unistd.h */ +int +xchdir (const char *filename) +{ + int ret=chdir(filename); + if (ret != 0) + error(EXIT_FAILURE,errno,"%s/",filename); + return ret; +} + +/* stdio.h */ +FILE * +xfopen (const char *filename, const char *opentype) +{ + FILE *file = fopen(filename,opentype); + /* fopen gives NULL on failure */ + if ( file == NULL ) + error(EXIT_FAILURE,errno,"%s",filename); + return file; +} + +/* string funtions */ +void +stradds(size_t *size, char **dest, char *str) +{ + if (*size > ( strlen(*dest) + strlen(str) )) + strcat(*dest, str); + else { + *size = strlen(*dest) + strlen(str) + 1; + *dest = (char *) xrealloc (*dest, *size); + strcat(*dest, str); + } +} + +char * +stralloc (const char *string) +{ + char *copy = (char *)xmalloc(strlen(string)+1); + strcpy(copy,string); + return copy; +} + diff --git a/wrapper/rvs.h b/wrapper/rvs.h index 57358f2..bdd5c68 100644 --- a/wrapper/rvs.h +++ b/wrapper/rvs.h @@ -1,5 +1,5 @@ -/* wrapper/rvs.h -- rvs program header, contains most system-dependand code, - and general-purose functions. +/* wrapper/rvs.h -- general and machine specific functions for rvs. + system depends: Copyright (C) 2009 Luke Shumaker This file is part of rvs. @@ -37,91 +37,40 @@ extern char *program_invocation_short_name; /*extern int EXIT_SUCCESS;*/ /*extern int EXIT_FAILURE;*/ +extern void * -xmalloc (size_t size) -{ - void *value = malloc (size); - if (value == NULL) { - perror(program_invocation_name); - exit(EXIT_FAILURE); - } - return value; -} +xmalloc (size_t size); +extern void * -xrealloc (void *ptr, size_t size) -{ - void *value = realloc (ptr, size); - if (value == NULL) { - perror(program_invocation_name); - exit(EXIT_FAILURE); - } - return value; -} +xrealloc (void *ptr, size_t size); +extern void -xfree (void *ptr) -{ - if (ptr!=NULL) - free (ptr); -} +xfree (void *ptr); +extern void -xsystem (const char *command) -{ - int stat=system(command); - if (stat!=0) { - if (stat==-1) { - fprintf(stderr, - "%s: unable to launch run command", - program_invocation_name); - exit(EXIT_FAILURE); - } else - exit(EXIT_FAILURE); - } -} +xsystem (const char *command); /* unistd.h */ +extern int -xchdir (const char *filename) -{ - int ret=chdir(filename); - if (ret != 0) - error(EXIT_FAILURE,errno,"%s/",filename); - return ret; -} +xchdir (const char *filename); /* stdio.h */ +extern FILE * -xfopen (const char *filename, const char *opentype) -{ - FILE *file = fopen(filename,opentype); - /* fopen gives NULL on failure */ - if ( file == NULL ) - error(EXIT_FAILURE,errno,"%s",filename); - return file; -} +xfopen (const char *filename, const char *opentype); /* string funtions */ +extern void -stradds(size_t *size, char **dest, char *str) -{ - if (*size > ( strlen(*dest) + strlen(str) )) - strcat(*dest, str); - else { - *size = strlen(*dest) + strlen(str) + 1; - *dest = (char *) xrealloc (*dest, *size); - strcat(*dest, str); - } -} +stradds(size_t *size, char **dest, char *str); +extern char * -stralloc (const char *string) -{ - char *copy = (char *)xmalloc(strlen(string)+1); - strcpy(copy,string); - return copy; -} +stralloc (const char *string); #endif diff --git a/wrapper/rvs.sh b/wrapper/rvs.sh index 6f4dbbb..a515f2d 100644 --- a/wrapper/rvs.sh +++ b/wrapper/rvs.sh @@ -1,6 +1,6 @@ #!@SHELL@ name='@name@' -ver='0.8c' +ver='0.8r61' # Copyright (C) 2009 Luke Shumaker # # This file is part of rvs. @@ -94,9 +94,10 @@ case "$com" in 'init') _init; exit $?;; 'install') shift; _install $@; exit $?;; 'uninstall') shift; _uninstall $@; exit $?;; - *) repo=`_repo` + *) REPO=`_repo` if [ "$?" = '0' ]; then - "$libexecdir/runcom" $@ < $repo/plugins + export RVS libexecdir REPO + "$libexecdir/runcom" $@ < $REPO/plugins exit $? else _error "cannot find an existing repository" diff --git a/wrapper/structures.h b/wrapper/structures.h deleted file mode 100644 index fd53d09..0000000 --- a/wrapper/structures.h +++ /dev/null @@ -1,60 +0,0 @@ -/* 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_structures_h_SEEN -#define FILE_structures_h_SEEN - -#include "string.h" - -/*----------------------------structures----------------------------*/ - -/* a generic binary tree emulating a n-ary tree via linked list */ -struct tree_list -{ - void *node; - struct tree_list *child;/* left leaf */ - struct tree_list *next; /* right leaf */ -}; - -/* a generic binary tree */ -struct tree_node -{ - void *node; - struct tree_node *left; - struct tree_node *right; -}; - -/*----------------------------functions-----------------------------*/ - -/* find a node with `name'. in the current layer of tree_list */ -struct tree_list * -ds_tree_list_find (struct tree_list *node, char *name) -{ - if (strcmp(node->node,name) == 0) - return node; - else { - if (node->next==NULL) - return NULL; - else - return ds_tree_list_find(node->next,name); - } -} - -#endif - -- cgit v1.2.3-2-g168b