diff options
Diffstat (limited to 'zinclib.d/gen.pl')
-rw-r--r-- | zinclib.d/gen.pl | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/zinclib.d/gen.pl b/zinclib.d/gen.pl new file mode 100644 index 0000000..ac703d8 --- /dev/null +++ b/zinclib.d/gen.pl @@ -0,0 +1,275 @@ +#!/usr/bin/perl + +# This software is the property of IntuiLab SA, France. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +$a=""; + +$res = ""; +$undone = ""; +$enum = ""; +$enum2 = ""; +open CODE,">code.cpp"; +open HPP,">code.hpp"; +while (<>) +{ + if( /{ ZN_CONFIG_(\w+), "-(\w+)"/ ) + { + if(defined $opt{$2}) + { + next if($opt{$2} == $1); + die("ERROR different TYPE\n"); + } + $opt{$2} = $1; + if( $1 eq "BOOL" ) + { $e = 0; $t = "bool"; $T = "BOO"; } + elsif( $1 eq "FLAG" ) + { $e = 0; $t = "int"; $T= "INT"; } + elsif( $1 eq "GRADIENT" ) + { $e = 0; $t = "String"; $T= "STR"; } + elsif( $1 eq "UINT" ) + { $e = 0; $t = "unsigned int"; $T= "INT"; } + elsif( $1 eq "INT" ) + { $e = 0; $t = "int"; $T= "INT"; } + elsif( $1 eq "LINE_STYLE" ) + { $e = 1; $t = "ineStyle"; $T="lineStyles"; } + elsif( $1 eq "DIM" ) + { $e = 0; $t = "double"; $T= "DBL"; } + elsif( $1 eq "ANGLE" ) + { $e = 0; $t = "unsigned int"; $T= "INT"; } + elsif( $1 eq "PRI" ) + { $e = 0; $t = "unsigned int"; $T= "INT"; } + elsif( $1 eq "RELIEF" ) + { $e = 1; $t = "relief"; $T="reliefs"; } + elsif( $1 eq "ALPHA" ) + { $e = 0; $t = "unsigned int"; $T= "INT"; } + elsif( $1 eq "TEXT" ) + { $e = 0; $t = "String"; $T= "STR"; } + elsif( $1 eq "ALIGNMENT" ) + { $e = 1; $t = "alignment"; $T="alignments"; } + elsif( $1 eq "USHORT" ) + { $e = 0; $t = "unsigned short"; $T= "INT"; } + elsif( $1 eq "SHORT" ) + { $e = 0; $t = "short"; $T= "INT"; } + elsif( $1 eq "STRING" ) + { $e = 0; $t = "String"; $T= "STR"; } + elsif( $1 eq "FONT" ) + { $e = 0; $t = "ZincFont *"; $T= "PSTR"; } + elsif( $1 eq "ITEM" ) + { $e = 0; $t = "ZincItem *"; $T= "PTR"; } + elsif( $1 eq "BITMAP" ) + { $e = 0; $t = "ZincBitmap *"; $T= "PTR"; } + elsif( $1 eq "IMAGE" ) + { $e = 0; $t = "ZincImage *"; $T= "PTR"; } + elsif( $1 eq "ANCHOR" ) + { $e = 1; $t = "anchor"; $T="anchors"; } + elsif( $1 eq "LINE_SHAPE" ) + { $e = 1; $t = "lineShape"; $T="lineShapes"; } + elsif( $1 eq "CAP_STYLE" ) + { $e = 1; $t = "capStyle"; $T="capStyles"; } + elsif( $1 eq "JOIN_STYLE" ) + { $e = 1; $t = "joinStyle"; $T="joinStyles"; } + elsif( $1 eq "FILL_RULE" ) + { $e = 1; $t = "fillRule"; $T="fillRules"; } + elsif( $1 eq "EDGE_LIST" ) + { $e = 1; $t = "edgeList"; $T="edgeLists"; } + else + { + $undone .= "$2: $1\n"; + next; + } + + $t2 = $2; + substr($t2,0,1) =~ tr/[a-z]/[A-Z]/; + if($e==1) + { + if($en{$1}!=1) + { + $enum .= "$t { t_$T };\n"; + $enum2.= "const char* $T"."Strings [1] = { \"t$T\" };\n"; + $enum2.= "Tcl_Obj* $T [1] = { Tcl_NewStringObj (\"t$T\", -1) };\n"; + $en{$1}=1; + } + } + print HPP " /**\n"; + print HPP " * Call zinc->itemconfigure ( -$2 )\n"; + print HPP " * \@param item the item to configure\n"; + print HPP " * \@param value the $2 to set\n"; + print HPP " */\n"; + print HPP " void itemSet$t2 (ZincItem * item, $t value);\n\n"; + print HPP " /**\n"; + print HPP " * Call zinc->itemcget ( -$2 )\n"; + print HPP " * \@param item the item to get $2 from\n"; + print HPP " * \@return $2 value\n"; + print HPP " */\n"; + if ($t eq "String") + { + print HPP " String itemGet$t2 (ZincItem * item);\n\n"; + } + else + { + print HPP " $t itemGet$t2 (ZincItem * item);\n\n"; + } + $res .= "Z_DEFINE_ZOPT ($2); //the \"-$2\" option\n"; + + print CODE "/**\n"; + print CODE " * Call zinc->itemconfigure ( -$2 )\n"; + print CODE " *\n"; + print CODE " * \@param item the item to configure\n"; + print CODE " * \@param value the $2 to set\n"; + print CODE " */\n"; + print CODE "void Zinc::itemSet$t2 (ZincItem * item, $t value)\n"; + print CODE "{\n"; + print CODE " //prepare arguments : .zinc itemconfigure item attribute value\n"; + print CODE " p1[0] = id;\n"; + print CODE " p1[1] = ZFCT_itemconfigure;\n"; + print CODE " p1[2] = item->object;\n"; + print CODE " p1[3] = ZOPT_$2;\n"; + if( $e==1 ) + { + print CODE " p1[4] = ".$T."[value];\n"; + } + elsif ($T eq "PTR") + { + print CODE " p1[4] = value->object;\n"; + } + elsif ($T eq "PSTR") + { + print CODE " p1[4] = Z_STR_POOL (0, value->name.c_str(), value->name.length());\n"; + } + elsif ($T eq "STR") + { + print CODE " p1[4] = Z_".$T."_POOL (1, value.c_str (), value.length ());\n"; + } + else + { + print CODE " p1[4] = Z_".$T."_POOL (1, value);\n"; + } + print CODE " //call the zinc function with 5 arguments in internal form\n"; + print CODE " z_command (5, \"itemSet$t2 Failed : \");\n"; + print CODE "}\n\n"; + + print CODE "/**\n"; + print CODE " * Call zinc->itemcget ( -$2 )\n"; + print CODE " *\n"; + print CODE " * \@param item the item to get $2 from\n"; + print CODE " * \@return $2 value\n"; + print CODE " */\n"; + if ($t eq "String") + { + print CODE "String Zinc::itemGet$t2 (ZincItem * item)\n"; + } + else + { + print CODE "$t Zinc::itemGet$t2 (ZincItem * item)\n"; + } + print CODE "{\n"; + print CODE " Tcl_Obj* tmp;\n"; + print CODE " //discard all old results\n"; + print CODE " Tcl_ResetResult (interp);\n"; + print CODE " //prepare arguments : .zinc itemcget item \n"; + print CODE " p1[0] = id;\n"; + print CODE " p1[1] = ZFCT_itemcget;\n"; + print CODE " p1[2] = item->object;\n"; + print CODE " p1[3] = ZOPT_$2;\n"; + print CODE " //call the zinc function with 4 arguments in internal form\n"; + print CODE " z_command (4, \"itemGet$t2 Failed : \");\n\n"; + print CODE " //retreive the result trough the tcl interpreter and convert it\n"; + print CODE " tmp = Tcl_GetObjResult (interp);\n"; + if($e == 1) + { + print CODE " int value;\n"; + print CODE " z_tcl_call (Tcl_GetIndexFromObj (interp, tmp,\n"; + print CODE " $T"."Strings, \n"; + print CODE " \"$T\",\n"; + print CODE " 0, &value),\n"; + print CODE " \"itemGet$t2 Failed : \")\n"; + print CODE " return $t (value);\n"; + } + elsif ( $T eq "STR") + { + print CODE " return String (Tcl_GetStringFromObj (tmp, NULL));\n"; + } + elsif ( $T eq "PSTR") + { + print CODE " return new ZincFont (String (Tcl_GetStringResult (interp)));\n"; + } + elsif ( $T eq "PTR" ) + { + if( $t =~ /ZincItem/ ) + { + print CODE " return new ZincItem(tmp);\n"; + } + else if ( $t =~ /ZincImage/ ) + { + print CODE " return new ZincImage(tmp);\n"; + } + else + { + print CODE " return new ZincBitmap(tmp);\n"; + } + } + elsif ( $T eq "INT" ) + { + print CODE " int value;\n"; + print CODE " z_tcl_call (Tcl_GetIntFromObj (interp, tmp, &value),\n"; + print CODE " \"itemGet$t2 Failed : \");\n"; + print CODE " return ($t)value;\n"; + } + elsif ( $T eq "DBL" ) + { + print CODE " double value;\n"; + print CODE " z_tcl_call (Tcl_GetDoubleFromObj (interp, tmp, &value),\n"; + print CODE " \"itemGet$t2 Failed : \");\n"; + print CODE " return ($t)value;\n"; + } + elsif ( $T eq "BOO" ) + { + print CODE " int value;\n"; + print CODE " z_tcl_call (Tcl_GetBooleanFromObj (interp, tmp, &value),\n"; + print CODE " \"itemGet$t2 Failed : \");\n"; + print CODE " return ($t)value;\n"; + } + else + { + die("generationg error\n"); + } + print CODE "}\n\n"; + + $done .= "$2: $1\n"; + } +} + +print "--- CONSTANTES\n"; +print $res; +print "--- ENUMS.h\n"; +print $enum; +print "--- ENUMS.c\n"; +print $enum2; +print "--- FAIT\n"; +print $done; +print "--- PAS FAIT\n"; +print $undone; |