diff --git a/src/perl/make_parameter_source.pl b/src/perl/make_parameter_source.pl new file mode 100644 --- /dev/null +++ b/src/perl/make_parameter_source.pl @@ -0,0 +1,435 @@ +#!/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. +# + +# input: parameter file + types +# format: par_name = default_value/type + +# output: C++ source code of class Parameter +# and sample parameter file + +%funname = ( + "double" => fgetpar, + "float" => fgetpar, + "int" => igetpar, + "bool" => bgetpar, + "char *" => sgetpar, + "string" => sgetpar, + "double *" => dgetparlist, + ); + +%typetrans = ( + "double" => "double", + "float" => "double", + "int" => "int", + "bool" => "bool", + "char *" => "char *", + "string" => "char *", + "directory" => "char *", + "doublelist" => "double *", + "label" => "label", + "title" => "title", +); + +open parfile,"<$ARGV[0]"; +open cppfile,">parameter.cpp"; +$i=0; +while () { +#ignore comments + if (/^#/) { + next; + } + @line=split(/=/); +#ignore empty lines + if ($#line<1) { + next; + } + $param[$i]=$line[0]; + $value_type=$line[1]; + + @typel=split(/ \/ /,$value_type); + $value[$i] = $typel[0]; + $type[$i] = $typel[1]; + +#get rid of spaces + $param[$i] =~ s/ //g; + $value[$i] =~ s/ //g; + $type[$i] =~ s/ //g; + $type[$i] =~s/\n//g; + $convtype[$i]=$typetrans{$type[$i]}; + + if ($convtype[$i] eq "char *") { + $value[$i] = "\"$value[$i]\""; + } + #print cppfile "param = $param, value = $value, type = $type\n"; + + $i++; +} + +$lines=$i; + +print cppfile < +#include +#include +#include +#include +#include +#include "output.h" +#include "parse.h" +#include "xmlwrite.h" + +using namespace std; + + +Parameter::Parameter() { +END_HEADER + +for ($i=0;$i<$lines;$i++) { + if ($convtype[$i] ne "label" && $convtype[$i] ne "title") { + if ($convtype[$i] eq "char *") { + print cppfile " $param[$i] = strdup($value[$i]);\n"; + } else { + if ($convtype[$i] eq "double *") { + #comma separated list expected + @paramlist = split(/,/, $value[$i]); + $length = $#paramlist+1; + print cppfile " $param[$i] = new double\[$length\];\n"; + for ($j=0;$j<=$#paramlist;$j++) { + print cppfile " $param[$i]\[$j\] = $paramlist[$j];\n"; + } + } else { + print cppfile " $param[$i] = $value[$i];\n"; + } + } + } +} + + +print cppfile < valarray) {\n"; +print cppfile; + +for ($i=0;$i<$lines;$i++) { + + if ($convtype[$i] eq "double *") { + @paramlist = split(/,/,$value[$i]); + print cppfile "if (!strcmp(namec, \"$param[$i]\")) {\n"; + print cppfile " int i=0;\n"; + print cppfile " vector::const_iterator v=valarray.begin();\n"; + print cppfile " while (v!=valarray.end() && i <= $#paramlist ) {\n"; + print cppfile " $param[$i]\[i++\]=*(v++);\n"; + print cppfile " }\n"; + print cppfile "}\n"; + } +} +print cppfile "}\n"; + + +print cppfile <xmlChildrenNode; + while (cur!=NULL) { + if ((!xmlStrcmp(cur->name, (const xmlChar *)"parameter"))){ + xmlNode *par_node = cur->xmlChildrenNode; + while (par_node!=NULL) { + { + if (!xmlStrcmp(par_node->name, (const xmlChar *)"par")) { + xmlChar *namec = xmlGetProp(par_node, BAD_CAST "name"); + xmlChar *valc = xmlGetProp(par_node, BAD_CAST "val"); + if (valc) { + AssignValToPar((const char*)namec,(const char*)valc); + } else { + // Probably a valarray + xmlNode *sub_par_node = par_node->xmlChildrenNode; + vector valarray; + while (sub_par_node != NULL) { + if (!xmlStrcmp(sub_par_node->name, (const xmlChar *)"valarray")) { + valarray = XMLIO::XMLReadValArray(sub_par_node); + } + sub_par_node = sub_par_node->next; + } + AssignValArrayToPar((const char*)namec, valarray); + } + } + } + par_node = par_node->next; + } + + } + cur=cur->next; + } + +}*/ + +ostream &operator<<(ostream &os, Parameter &p) { + p.Write(os); + return os; +} + +END_TRAILER + + + +# parameter.h + +open hfile, ">parameter.h"; +print hfile < + +#include +#include + +class Parameter { + + public: + Parameter(); + ~Parameter(); + void CleanUp(void); + void Read(const char *filename); + void Write(ostream &os) const; + void XMLAdd(xmlNode *root) const; + void XMLRead(xmlNode *root); + void AssignValToPar(const char *namec, const char *valc); + void AssignValArrayToPar(const char *namec, vector valarray); +END_HEADER2 + + for ($i=0;$i<$lines;$i++) { + if ($convtype[$i] ne "label" && $convtype[$i] ne "title") { + print hfile " $convtype[$i] $param[$i];\n"; + } + } + +print hfile <default.par"; + +for ($i=0;$i<$lines;$i++) { + if ($type[$i] ne "title" && $type[$i] ne "label") { + $value[$i] =~ s/\"//g; + print parfile " $param[$i] = $value[$i]\n"; + } +}