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