diff --git a/src/perl/make_xmlwritecode.pl b/src/perl/make_xmlwritecode.pl new file mode 100644 --- /dev/null +++ b/src/perl/make_xmlwritecode.pl @@ -0,0 +1,223 @@ +#!/usr/bin/perl + +# +# $Id$ +# +# This file is part of the Virtual Leaf. +# +# The Virtual Leaf 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 3 of the License, or +# (at your option) any later version. +# +# The Virtual Leaf 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 the Virtual Leaf. If not, see . +# +# Copyright 2010 Roeland Merks. + +# Store essential model source code in XML files, so the exact model +# used for the geometry can be retrieved later on The crucial model +# description is in the files "reactions.h" (or similar) and leaf.cpp +# (or similar). + +# First we should retrieve the name of the main code (i.e. leaf.cpp or +# so), and the version of reactions.h that we include there. + +# We can get this from the project file (possibly called "LeafGrowth.pro") + +# If more than one project file found, issue an error + +open prlist, "ls *.pro |"; + +@projectfiles = (); +while () { + chomp; + push @projectfiles, $_; +} + +if ($#projectfiles > 0) { + print stderr "Oops, I found several project files: "; + for $p (@projectfiles) { + print stderr "$p "; + } + print stderr "\n"; + print stderr "Please make sure you have only one, and try again\n"; + exit(1); +} + +if ($#projectfiles < 0) { + print stderr "No project files found. Please add a project file.\n"; + exit(1); +} + +$project = $projectfiles[0]; + +print stderr "Using project file \"$project\"\n"; + +# extract TARGET and REACTIONS from project file + +open pfile,"<$project"; +my @targets = (); +while () { + if (/^[ \t]*TARGET/) { + my @line = split(/=/); + my $target = $line[1]; + chomp $target; + $target =~ s/[ \t]//g; + push @targets, $target; + } + if (/^[ \t]*REACTIONS/) { + my @line = split(/=/); + my $reaction = $line[1]; + chomp $reaction; + $reaction =~ s/[ \t]//g; + push @reactions, $reaction; + } +} + + +if ($#targets > 0) { + print stderr "Too many targets found: "; + for $t (@targets) { + print stderr "$t "; + } + print stderr "\n"; + exit(1); +} + +if ($#targets < 0) { + print stderr "No targets found in project $project\n"; + exit(1); +} + +$target = $targets[0]; + +print "Target is $target\n"; + +if ($#reactions > 0) { + print stderr "Too many reactions found: "; + for $t (@reactions) { + print stderr "$t "; + } + print stderr "\n"; + exit(1); +} + +if ($#reactions < 0) { + print stderr "No reactions found in project $project\n"; + exit(1); +} + +$reaction = $reactions[0]; + +print "Reactions header is $reaction\n"; + +$mainsource = $target.".cpp"; + +# extract "reactions" source from mainsource +# assuming that the header file name starts with "reactions_" + +#open sfile, "<$mainsource"; +# +#while () { +# if (/^[ \t]*\#include/) { +# chomp; +# my @line = split(/\#include/); +# my $header = $line[1]; +# $header =~ s/[\t ]//g; +# if ($header =~ /reactions/) { +# $header =~ s/[\"\<\>]//g; +# push @headers, $header; +# } +# } +#} +# +#if ($#headers > 0) { +# print stderr "Oops, more than one reactions header found: "; +# for $h (@headers) { +# print stderr "$h "; +# } +# print stderr "\n"; +# print stderr "Don't know what to do now... Please rename a header in $mainsource, so only one will start with \"reactions\"\n"; +# exit(1); +#} +# +#if ($#headers < 0) { +# print stderr "Oops, no reactions header found in $mainsource.\n"; +# print stderr "Please make sure the name of your reactions header starts with \"reactions\"\n"; +# exit(1); +#} +# +#$reactions = $headers[0]; + + + +# now generating xmlcode to write the contents of these files (hard coded in the executables) + +open xmlsrc, ">xmlwritecode.cpp"; + +print xmlsrc < +#include +#include +#include +#include "xmlwrite.h" + + +void XMLIO::XMLWriteLeafSourceCode(xmlNode *parent) { + + // Embed the code in our xml file, so we can reconstruct the model we used + // to produce it... + +END_MARKER + +sub construct_string_constant_from_file { + + my $fname = shift; + my $str = ""; + + open srcfile, "<$fname"; + while () { + chomp; + s/\\/\\\\/g; + s/\"/\\\"/g; + s/\&/\&/g; + $str.=$_."\\n"; + } + $str .= "\";\n"; + return $str; +} + +print xmlsrc "xmlChar *sourcecode = (xmlChar *)\"".construct_string_constant_from_file( "$mainsource" ); + print xmlsrc <