From 67d3b5846d84d4a2e5a31d4e268bc9d51495d7e0 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 3 Sep 2009 19:38:20 -0400 Subject: the C implementation properly loads the plugins, then creates a dependancy tree --- c/plugin-parse.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 c/plugin-parse.c (limited to 'c/plugin-parse.c') diff --git a/c/plugin-parse.c b/c/plugin-parse.c new file mode 100644 index 0000000..c333193 --- /dev/null +++ b/c/plugin-parse.c @@ -0,0 +1,135 @@ +/* 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. +*/ + + +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; +} + +char *_plugin_parse_depend (FILE *file) +{ + size_t nbytes = 10; + char *string = (char *)xmalloc(nbytes); + string[0]='\0'; + + char c[2] = " \0"; + char *cs = (char *)&c; + while ( (c[0]=getc(file)) != EOF ) { + if (c[0] == '\n') { + ungetc (c[0], file); + break; + } else { + switch (c[0]) { + case '\\': + c[0]=_plugin_parse_escape(file); + stradds(&nbytes,&string,cs); + break; + case '#': + _plugin_parse_comment(file); + break; + default: + stradds(&nbytes,&string,cs); + break; + } + } + } + return string; +} + +struct plugin_command *_plugin_parse (struct plugin *plugin, FILE *file) +{ + struct plugin_command *command; + command=(struct plugin_command *)xmalloc(sizeof(*command)); + + command->plugin=plugin; + command->p_next=NULL; + + command->depend=NULL; + command->depends=NULL; + command->child=NULL; + command->d_next=NULL; + + size_t nbytes = 10; + char *string = (char *)xmalloc(nbytes); + string[0]='\0'; + + char c[2] = " \0"; + char *cs = (char *)&c; + if ( (c[0]=getc(file)) == EOF ) { + return NULL; + } else { + ungetc (c[0], file); + } + while ( (c[0]=getc(file)) != EOF ) { + if (c[0] == '\n') { + if (strcmp(string,"")==0) { + xfree(command); + xfree(string); + command=_plugin_parse(plugin, file); + } else { + command->name=string; + command->p_next=_plugin_parse(plugin, file); + } + break; + } else { + switch (c[0]) { + case '\\': + c[0]=_plugin_parse_escape(file); + stradds(&nbytes,&string,cs); + break; + case '#': + _plugin_parse_comment(file); + break; + case ':': + command->depends=_plugin_parse_depend(file); + break; + default: + stradds(&nbytes,&string,cs); + break; + } + } + } + return command; +} + -- cgit v1.2.3-2-g168b