From bddd6fb07906e660260ef0fced05440ecac8d9e9 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <luke@HP-dv6426us-u904>
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: <string.h> <error.h>
+   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 <string.h>
+#include <error.h>
+
+#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: <string.h> <error.h>
+/* wrapper/plugin-parse.h -- parse rvs plugin config files
+   system depends: <stdio.h> <string.h> <error.h>
+   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 <string.h>
-#include <error.h>
-
-#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: <string.h>
+   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 <string.h> /* 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: <stdio.h>, GNU <string.h>
+   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 <stdio.h>
+#include <string.h>
+
+#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: <stdio.h> <string.h>
+   system depens: <stdio.h>, GNU <string.h>
    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: <stdio.h> <string.h> <error.h>
+   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 <stdio.h>
+#include <string.h>
+#include <error.h> /* 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: <stdio.h> <stdlib.h>
+   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 <stdio.h>
+#include <stdlib.h>
+
+#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: <stdio.h> <stdlib.h>
+   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 <stdio.h>
+#include <stdlib.h>
+
+#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<argc; i++) {
+			stradds(&nbytes, &args, "\"" );
+			stradds(&nbytes, &args, argv[i]);
+			stradds(&nbytes, &args, "\" ");
+		}
+		
+		plugin_run(root,args);
 		
 		/*free*/
 		plugin_free_list(list);
diff --git a/wrapper/rvs.c b/wrapper/rvs.c
new file mode 100644
index 0000000..a2a8a37
--- /dev/null
+++ b/wrapper/rvs.c
@@ -0,0 +1,117 @@
+/* wrapper/rvs.c -- general and machine specific functions for rvs.
+   system depends:<stdio.h> <stdlib.h> <string.h> <unistd.h> <errno.h> <error.h>
+   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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <error.h>
+
+#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:<stdio.h> <stdlib.h> <string.h> <unistd.h> <errno.h> <error.h>
    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-54-g00ecf