#!/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 <