diff options
author | Timothy Pearson <[email protected]> | 2011-12-18 03:08:08 -0600 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2011-12-18 03:08:08 -0600 |
commit | bcc95cd92ca12c1783464b8ada6816d430dc0e98 (patch) | |
tree | 4701c447365db5392df0174b4bb00b5b5c369da4 /kalyptus | |
download | libtqt-perl-bcc95cd92ca12c1783464b8ada6816d430dc0e98.tar.gz libtqt-perl-bcc95cd92ca12c1783464b8ada6816d430dc0e98.zip |
Initial import of libqt-perl (not yet TQt compatible)
Diffstat (limited to 'kalyptus')
-rw-r--r-- | kalyptus/Ast.pm | 91 | ||||
-rw-r--r-- | kalyptus/ChangeLog | 82 | ||||
-rw-r--r-- | kalyptus/Iter.pm | 532 | ||||
-rw-r--r-- | kalyptus/README | 92 | ||||
-rw-r--r-- | kalyptus/TODO | 7 | ||||
-rw-r--r-- | kalyptus/Version | 1 | ||||
-rw-r--r-- | kalyptus/kalyptus | 1645 | ||||
-rw-r--r-- | kalyptus/kalyptusCxxToSmoke.pm | 2221 | ||||
-rw-r--r-- | kalyptus/kalyptusDataDict.pm | 3042 | ||||
-rw-r--r-- | kalyptus/kdocAstUtil.pm | 762 | ||||
-rw-r--r-- | kalyptus/kdocLib.pm | 245 | ||||
-rw-r--r-- | kalyptus/kdocParseDoc.pm | 419 | ||||
-rw-r--r-- | kalyptus/kdocUtil.pm | 189 |
13 files changed, 9328 insertions, 0 deletions
diff --git a/kalyptus/Ast.pm b/kalyptus/Ast.pm new file mode 100644 index 0000000..0fb4bd0 --- /dev/null +++ b/kalyptus/Ast.pm @@ -0,0 +1,91 @@ +package Ast; +use strict; + +use vars qw/ $this $pack @endCodes /; + +#----------------------------------------------------------------------------- +# This package is used to create a simple Abstract Syntax tree. Each node +# in the AST is an associative array and supports two kinds of properties - +# scalars and lists of scalars. +# See SchemParser.pm for an example of usage. +# ... Sriram +#----------------------------------------------------------------------------- + +# Constructor +# e.g AST::New ("personnel") +# Stores the argument in a property called astNodeName whose sole purpose +# is to support Print() + +sub New { + my ($this) = {"astNodeName" => $_[0]}; + bless ($this); + return $this; +} + +# Add a property to this object +# $astNode->AddProp("className", "Employee"); + +sub AddProp { + my ($this) = $_[0]; + $this->{$_[1]} = $_[2]; +} + +# Equivalent to AddProp, except the property name is associated +# with a list of values +# $classAstNode->AddProp("attrList", $attrAstNode); + +sub AddPropList { + my ($this) = $_[0]; + if (! exists $this->{$_[1]}) { + $this->{$_[1]} = []; + } + push (@{$this->{$_[1]}}, $_[2]); +} + +# Returns a list of all the property names of this object +sub GetProps { + my ($this) = $_[0]; + return keys %{$this}; +} + +sub Visit { + # Converts each of this AstNode's properties into global variables. + # The global variables are introduced into package "main" + # At the same time, a piece of code is formed to undo this work above - + # $endCode essentially contains the values of these global variables + # before they are mangled. endCode gets pushed into a stack (endCodes), + # which is unwound by UnVisit(). + + local ($this, $pack) = @_; + + + my $code = ""; + my $endCode = ""; + + + foreach my $k (keys %{$this}) { + + my $glob = $pack."::".$k; + + if ( defined $$glob ) { + + if ( ${$glob} ne "" ) { + $$glob =~ s/\'/\\\'/g; + } + + $endCode .= '$'.$pack.'::'.$k. " = '".$$glob."';"; + } else { + $endCode .= '$'.$pack . "::". $k . ' = "";'; + } + $code .= '$'.$pack . "::" . $k . "= \$this->{\"$k\"};"; + } + push (@endCodes, $endCode); + eval($code) if $code; +} + +sub UnVisit { + my $code = pop(@endCodes); + eval($code) if ($code); +} + +1; diff --git a/kalyptus/ChangeLog b/kalyptus/ChangeLog new file mode 100644 index 0000000..9f67a8c --- /dev/null +++ b/kalyptus/ChangeLog @@ -0,0 +1,82 @@ +2003-08-30 Richard Dale <[email protected]> + + * Applied Germain Garand's patch to no longer rename operator methods + in the QGlobalSpace pseudo class + +2003-08-21 Alexander Kellett <[email protected]> + + * Added .kidl generation option (dcopidl replacement) + * Handled of several new constructs in the parsing: + * k_dcop: / k_dcop_signals: / K_DCOP: + * Use STDERR not STDOUT thus removing need for temporary file + +2003-08-21 Richard Dale <[email protected]> + + * Added missing getClassLoader() call to Proxy constructor + +2003-08-21 Richard Dale <[email protected]> + + * Rewritten java code generation for a Dynamic Proxy based SMOKE adaptor version of QtJava. + * Based on David Faure's SMOKE generation code in the '-fsmoke' option. + +2003-08-11 Richard Dale <[email protected]> + + * Removed old SWIG style ruby generation option + +2003-08-09 Alexander Kellett <[email protected]> + + * Parse static friend operator methods and place into a pseudo class (for smoke) + +2002-06-03 David Faure <[email protected]> + + * The Smoke generation is in good shape. Removed old PerlPig and PerlQK + modules. + +2002-04-23 Richard Dale <[email protected]> + + * Added patch from David Faure to correctly handle nested struct + or class names in perl .pig generation + +2002-03-15 Richard Dale <[email protected]> + * Added C# P/Invoke bindings generation option from Adam Treat +2002-02-10 Richard Dale <[email protected]> + * Improved C destructor code generation + * QCanvasItemList mapped onto java.util.ArrayList + * 'bool *' type converted to java 'boolean[]' type. +2002-02-03 Richard Dale <[email protected]> + + * More fixes to .pig generation from Germain. Perl porting now + motoring 24*7... +2002-02-02 Richard Dale <[email protected]> + * Various improvements to Perl .pig generation from Germain Garand +2002-01-31 Richard Dale <[email protected]> + * Fixed bug in code generation for NULL default arguments + * Added some new KDE 3 types +2002-01-26 Richard Dale <[email protected]> + * Perl .pig generation improved +2002-01-25 Richard Dale <[email protected]> + * Added '-fperl' option to autogenerate .pig (Perl Interface + Generator) files, suitable for generating Ashley Winters' PerlQt/KDEQt + bindings +2002-01-23 Richard Dale <[email protected]> + * Made dispose() public, added isDisposed() after SWT. +2002-01-23 Richard Dale <[email protected]> + * Added generation of dispose() methods, to allow large resources, + such as pixmaps, to be freed before finalize() is called. +2002-01-20 Richard Dale <[email protected]> + * Ruby bindings generation - initial checkin. +2002-01-04 Richard Dale <[email protected]> + * Fixed bug in parsing decimal point in default argument values +2001-12-29 Richard Dale <[email protected] + * JNI event handling methods are now generated. + * Some additions for KDevelop types. + * Removed assumption that a class ending in '..Interface' should always + be a java interface. +2001-12-17 Richard Dale <[email protected] + * Improved code generation for String f'ns with default arguments. + * An implementation is no longer generated for classes which are + just interfaces. +2001-12-03 Richard Dale <[email protected] + * Added new KDE 3 data types + * Improved code generation for classes defined within namespaces + diff --git a/kalyptus/Iter.pm b/kalyptus/Iter.pm new file mode 100644 index 0000000..7279a6f --- /dev/null +++ b/kalyptus/Iter.pm @@ -0,0 +1,532 @@ +package Iter; + +=head1 Iterator Module + +A set of iterator functions for traversing the various trees and indexes. +Each iterator expects closures that operate on the elements in the iterated +data structure. + + +=head2 Generic + + Params: $node, &$loopsub, &$skipsub, &$applysub, &$recursesub + +Iterate over $node\'s children. For each iteration: + +If loopsub( $node, $kid ) returns false, the loop is terminated. +If skipsub( $node, $kid ) returns true, the element is skipped. + +Applysub( $node, $kid ) is called +If recursesub( $node, $kid ) returns true, the function recurses into +the current node. + +=cut + +sub Generic +{ + my ( $root, $loopcond, $skipcond, $applysub, $recursecond ) = @_; + + return sub { + foreach my $node ( @{$root->{Kids}} ) { + + if ( defined $loopcond ) { + return 0 unless $loopcond->( $root, $node ); + } + + if ( defined $skipcond ) { + next if $skipcond->( $root, $node ); + } + + my $ret = $applysub->( $root, $node ); + return $ret if defined $ret && $ret; + + if ( defined $recursecond + && $recursecond->( $root, $node ) ) { + $ret = Generic( $node, $loopcond, $skipcond, + $applysub, $recursecond)->(); + if ( $ret ) { + return $ret; + } + } + } + + return 0; + }; +} + +sub Class +{ + my ( $root, $applysub, $recurse ) = @_; + + return Generic( $root, undef, + sub { + return !( $node->{NodeType} eq "class" + || $node->{NodeType} eq "struct" ); + }, + $applysub, $recurse ); +} + +=head2 Tree + + Params: $root, $recurse?, $commonsub, $compoundsub, $membersub, + $skipsub + +Traverse the ast tree starting at $root, skipping if skipsub returns true. + +Applying $commonsub( $node, $kid), +then $compoundsub( $node, $kid ) or $membersub( $node, $kid ) depending on +the Compound flag of the node. + +=cut + +sub Tree +{ + my ( $rootnode, $recurse, $commonsub, $compoundsub, $membersub, + $skipsub ) = @_; + + my $recsub = $recurse ? sub { return 1 if $_[1]->{Compound}; } + : undef; + + Generic( $rootnode, undef, $skipsub, + sub { # apply + my ( $root, $node ) = @_; + my $ret; + + if ( defined $commonsub ) { + $ret = $commonsub->( $root, $node ); + return $ret if defined $ret; + } + + if ( $node->{Compound} && defined $compoundsub ) { + $ret = $compoundsub->( $root, $node ); + return $ret if defined $ret; + } + + if( !$node->{Compound} && defined $membersub ) { + $ret = $membersub->( $root, $node ); + return $ret if defined $ret; + } + return; + }, + $recsub # skip + )->(); +} + +=head2 LocalCompounds + +Apply $compoundsub( $node ) to all locally defined compound nodes +(ie nodes that are not external to the library being processed). + +=cut + +sub LocalCompounds +{ + my ( $rootnode, $compoundsub ) = @_; + + return unless defined $rootnode && defined $rootnode->{Kids}; + + foreach my $kid ( sort { $a->{astNodeName} cmp $b->{astNodeName} } + @{$rootnode->{Kids}} ) { + next if !defined $kid->{Compound}; + + $compoundsub->( $kid ) unless defined $kid->{ExtSource}; + LocalCompounds( $kid, $compoundsub ); + } +} + +=head2 Hierarchy + + Params: $node, $levelDownSub, $printSub, $levelUpSub + +This allows easy hierarchy traversal and printing. + +Traverses the inheritance hierarchy starting at $node, calling printsub +for each node. When recursing downward into the tree, $levelDownSub($node) is +called, the recursion takes place, and $levelUpSub is called when the +recursion call is completed. + +=cut + +sub Hierarchy +{ + my ( $node, $ldownsub, $printsub, $lupsub, $nokidssub ) = @_; + + return if defined $node->{ExtSource} + && (!defined $node->{InBy} + || !kdocAstUtil::hasLocalInheritor( $node )); + + $printsub->( $node ); + + if ( defined $node->{InBy} ) { + $ldownsub->( $node ); + + foreach my $kid ( + sort {$a->{astNodeName} cmp $b->{astNodeName}} + @{ $node->{InBy} } ) { + Hierarchy( $kid, $ldownsub, $printsub, $lupsub ); + } + + $lupsub->( $node ); + } + elsif ( defined $nokidssub ) { + $nokidssub->( $node ); + } + + return; +} + +=head2 + + Call $printsub for each *direct* ancestor of $node. + Only multiple inheritance can lead to $printsub being called more than once. + +=cut +sub Ancestors +{ + my ( $node, $rootnode, $noancessub, $startsub, $printsub, + $endsub ) = @_; + my @anlist = (); + + return if $node eq $rootnode; + + if ( !exists $node->{InList} ) { + $noancessub->( $node ) unless !defined $noancessub; + return; + } + + foreach my $innode ( @{ $node->{InList} } ) { + my $nref = $innode->{Node}; # real ancestor + next if defined $nref && $nref == $rootnode; + + push @anlist, $innode; + } + + if ( $#anlist < 0 ) { + $noancessub->( $node ) unless !defined $noancessub; + return; + } + + $startsub->( $node ) unless !defined $startsub; + + foreach my $innode ( sort { $a->{astNodeName} cmp $b->{astNodeName} } + @anlist ) { + + # print + $printsub->( $innode->{Node}, $innode->{astNodeName}, + $innode->{Type}, $innode->{TmplType} ) + unless !defined $printsub; + } + + $endsub->( $node ) unless !defined $endsub; + + return; + +} + +sub Descendants +{ + my ( $node, $nodescsub, $startsub, $printsub, $endsub ) = @_; + + if ( !exists $node->{InBy} ) { + $nodescsub->( $node ) unless !defined $nodescsub; + return; + } + + + my @desclist = (); + DescendantList( \@desclist, $node ); + + if ( $#desclist < 0 ) { + $nodescsub->( $node ) unless !defined $nodescsub; + return; + } + + $startsub->( $node ) unless !defined $startsub; + + foreach my $innode ( sort { $a->{astNodeName} cmp $b->{astNodeName} } + @desclist ) { + + $printsub->( $innode) + unless !defined $printsub; + } + + $endsub->( $node ) unless !defined $endsub; + + return; + +} + +sub DescendantList +{ + my ( $list, $node ) = @_; + + return unless exists $node->{InBy}; + + foreach my $kid ( @{ $node->{InBy} } ) { + push @$list, $kid; + DescendantList( $list, $kid ); + } +} + +=head2 DocTree + +=cut + +sub DocTree +{ + my ( $rootnode, $allowforward, $recurse, + $commonsub, $compoundsub, $membersub ) = @_; + + Generic( $rootnode, undef, + sub { # skip + my( $node, $kid ) = @_; + + unless (!(defined $kid->{ExtSource}) + && ($allowforward || $kid->{NodeType} ne "Forward") + && ($main::doPrivate || !($kid->{Access} =~ /private/)) + && exists $kid->{DocNode} ) { + + return 1; + } + + return; + }, + sub { # apply + my ( $root, $node ) = @_; + + my $ret; + + if ( defined $commonsub ) { + $ret = $commonsub->( $root, $node ); + return $ret if defined $ret; + } + + if ( $node->{Compound} && defined $compoundsub ) { + $ret = $compoundsub->( $root, $node ); + return $ret if defined $ret; + } + elsif( defined $membersub ) { + $ret = $membersub->( $root, $node ); + return $ret if defined $ret; + } + + return; + }, + sub { return 1 if $recurse; return; } # recurse + )->(); + +} + +sub MembersByType +{ + my ( $node, $startgrpsub, $methodsub, $endgrpsub, $nokidssub ) = @_; + +# public + # types + # data + # methods + # signals + # slots + # static +# protected +# private (if enabled) + + if ( !defined $node->{Kids} ) { + $nokidssub->( $node ) if defined $nokidssub; + return; + } + + foreach my $acc ( qw/public protected private/ ) { + next if $acc eq "private" && !$main::doPrivate; + $access = $acc; + + my @types = (); + my @data = (); + my @signals = (); + my @k_dcops = (); + my @k_dcop_signals = (); + my @k_dcop_hiddens = (); + my @slots =(); + my @methods = (); + my @static = (); + my @modules = (); + my @interfaces = (); + + # Build lists + foreach my $kid ( @{$node->{Kids}} ) { + next unless ( $kid->{Access} =~ /$access/ + && !$kid->{ExtSource}) + || ( $access eq "public" + && ( $kid->{Access} eq "signals" + || $kid->{Access} =~ "k_dcop" # note the =~ + || $kid->{Access} eq "K_DCOP")); + + my $type = $kid->{NodeType}; + + if ( $type eq "method" ) { + if ( $kid->{Flags} =~ "s" ) { + push @static, $kid; + } + elsif ( $kid->{Flags} =~ "l" ) { + push @slots, $kid; + } + elsif ( $kid->{Flags} =~ "n" ) { + push @signals, $kid; + } + elsif ( $kid->{Flags} =~ "d" ) { + push @k_dcops, $kid; + } + elsif ( $kid->{Flags} =~ "z" ) { + push @k_dcop_signals, $kid; + } + elsif ( $kid->{Flags} =~ "y" ) { + push @k_dcop_hiddens, $kid; + } + else { + push @methods, $kid; } + } + elsif ( $kid->{Compound} ) { + if ( $type eq "module" ) { + push @modules, $kid; + } + elsif ( $type eq "interface" ) { + push @interfaces, $kid; + } + else { + push @types, $kid; + } + } + elsif ( $type eq "typedef" || $type eq "enum" ) { + push @types, $kid; + } + else { + push @data, $kid; + } + } + + # apply + $uc_access = ucfirst( $access ); + + doGroup( "$uc_access Types", $node, \@types, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "Modules", $node, \@modules, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "Interfaces", $node, \@interfaces, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "$uc_access Methods", $node, \@methods, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "$uc_access Slots", $node, \@slots, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "Signals", $node, \@signals, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "k_dcop", $node, \@k_dcops, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "k_dcop_signals", $node, \@k_dcop_signals, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "k_dcop_hiddens", $node, \@k_dcop_hiddens, $startgrpsub, + $methodsub, $endgrpsub); + doGroup( "$uc_access Static Methods", $node, \@static, + $startgrpsub, $methodsub, $endgrpsub); + doGroup( "$uc_access Members", $node, \@data, $startgrpsub, + $methodsub, $endgrpsub); + } +} + +sub doGroup +{ + my ( $name, $node, $list, $startgrpsub, $methodsub, $endgrpsub ) = @_; + + my ( $hasMembers ) = 0; + foreach my $kid ( @$list ) { + if ( !exists $kid->{DocNode}->{Reimplemented} ) { + $hasMembers = 1; + break; + } + } + return if !$hasMembers; + + if ( defined $methodsub ) { + foreach my $kid ( @$list ) { + if ( !exists $kid->{DocNode}->{Reimplemented} ) { + $methodsub->( $node, $kid ); + } + } + } + + $endgrpsub->( $name ) if defined $endgrpsub; +} + +sub ByGroupLogical +{ + my ( $root, $startgrpsub, $itemsub, $endgrpsub ) = @_; + + return 0 unless defined $root->{Groups}; + + foreach my $groupname ( sort keys %{$root->{Groups}} ) { + next if $groupname eq "astNodeName"||$groupname eq "NodeType"; + + my $group = $root->{Groups}->{ $group }; + next unless $group->{Kids}; + + $startgrpsub->( $group->{astNodeName}, $group->{Desc} ); + + foreach my $kid (sort {$a->{astNodeName} cmp $b->{astNodeName}} + @group->{Kids} ) { + $itemsub->( $root, $kid ); + } + $endgrpsub->( $group->{Desc} ); + } + + return 1; +} + +sub SeeAlso +{ + my ( $node, $nonesub, $startsub, $printsub, $endsub ) = @_; + + if( !defined $node ) { + $nonesub->(); + return; + } + + my $doc = $node; + + if ( $node->{NodeType} ne "DocNode" ) { + $doc = $node->{DocNode}; + if ( !defined $doc ) { + $nonesub->() if defined $nonesub; + return; + } + } + + if ( !defined $doc->{See} ) { + $nonesub->() if defined $nonesub; + return; + } + + my $see = $doc->{See}; + my $ref = $doc->{SeeRef}; + + if ( $#$see < 1 ) { + $nonesub->() if defined $nonesub; + return; + } + + $startsub->( $node ) if defined $startsub; + + for my $i ( 0..$#$see ) { + my $seelabel = $see->[ $i ]; + my $seenode = undef; + if ( defined $ref ) { + $seenode = $ref->[ $i ]; + } + + $printsub->( $seelabel, $seenode ) if defined $printsub; + } + + $endsub->( $node ) if defined $endsub; + + return; +} + +1; diff --git a/kalyptus/README b/kalyptus/README new file mode 100644 index 0000000..373e400 --- /dev/null +++ b/kalyptus/README @@ -0,0 +1,92 @@ + +KALYPTUS -- C, Objective-C and Java bindings generator + +Version 0.9 + +KALYPTUS creates language bindings for Qt and KDE C++ libraries +directly from the headers. Documentation embedded in special doc +comments in the source is translated to an appropriate format for +the target language. + +REQUIREMENTS + +You need perl 5.005 or greater to run kalyptus. + +HOWTO + +If you are running this straight from CVS, you will need to run + + make -f Makefile.cvs + +before building. + +This should install kalyptus: + +./configure; make; make install + +CREDITS +------- + +Richard Dale - kdoc adaption, C/Objective-C/Java code generation. + +Sirtaj Singh Kang for writing the original kdoc utility (kalyptus was +derived from kdoc). + +Copyright(C) 2001, Lost Highway Ltd + +------ + +Copyright(C) 1999, Sirtaj Singh Kang <[email protected]> +Distributed under the GPL. + +NOTES ON USING THE CONVERTER +---------------------------- + +JAVA +---- + +Here are some of the shell commands that were used in the conversion process: + +Remove any Q_OVERRIDE macros from the Qt headers, and remove EXPORT_DOCKCLASS from the +KDE headers + +# Generate Java and C++ sources. Copy all the target headers to directory 'test/tmp' +kalyptus -fjava test/tmp/*.h test/tmp/dom/*.h test/tmp/kio/*.h test/tmp/kdeprint/*.h \ + test/tmp/kjs/*.h test/tmp/kparts/*.h test/tmp/kdesu/*.h test/ktextedit/*.h test/tmp/libkmid/*.h + +# Shorten generated filenames +mv DOM__Node.cpp DOMNode.cpp +mv DOM__Node.java DOMNode.java +mv DOM__Document.cpp DOMDocument.cpp +mv DOM__Document.java DOMDocument.java +for FILE in *__* ; do + NAME=`echo $FILE | sed -e 's/^.*__//'`; + echo $NAME; + mv $FILE $NAME; +done +mv SlaveInterface.cpp Slave.cpp +mv SlaveInterface.java Slave.java + +# Edit and Compile the generated java +cd kdejava/koala/org/kde/koala +make + +# Build C++ JNI .h header files +cd qtjava/javalib/org/kde/qt +for FILE in *.class ; do NAME=`echo $FILE | sed 's/.class//'`; echo $NAME; javah -classpath '../../..' org.kde.qt.$NAME ; done +for FILE in org_kde* ; do NAME=`echo $FILE | sed -e 's/org_kde_qt_//'`; echo $NAME; mv $FILE $NAME; done + +cd kdejava/koala/org/kde/koala +for FILE in *.class ; do NAME=`echo $FILE | sed 's/.class//'`; echo $NAME; javah -classpath '../../..:../../../../../qtjava/javalib/qtjava.jar' org.kde.koala.$NAME ; done +for FILE in org_kde* ; do NAME=`echo $FILE | sed -e 's/org_kde_koala_//'`; echo $NAME; mv $FILE $NAME; done +# Copy headers to kdejava/koala/kdejava + +# Check that the JNI .h function names match the .cpp ones +cd kdejava/koala/org/kde/koala +grep ^Java_ *.cpp | sed -e 's/^[^:]*:\([^(]*\).*/\1/' | grep -v '[/]' | sort | uniq > cpp.fns +grep Java_ *.h | awk '{ print $4 }' | grep -v '[/]' | sort | uniq > h.fns +kompare h.fns cpp.fns +# Reconcile and fix any differences + +# Edit and compile the generated .cpp and .h files with KDevelop + diff --git a/kalyptus/TODO b/kalyptus/TODO new file mode 100644 index 0000000..2f90a44 --- /dev/null +++ b/kalyptus/TODO @@ -0,0 +1,7 @@ +Add more target languages, such as PHP and Pascal + +Use a perl parser generator to define the grammar for + C++ method arguments. + +Write documentation for a how to on bindings generation. + diff --git a/kalyptus/Version b/kalyptus/Version new file mode 100644 index 0000000..0ac647c --- /dev/null +++ b/kalyptus/Version @@ -0,0 +1 @@ +0.91 diff --git a/kalyptus/kalyptus b/kalyptus/kalyptus new file mode 100644 index 0000000..1a7df3d --- /dev/null +++ b/kalyptus/kalyptus @@ -0,0 +1,1645 @@ +#!/usr/bin/perl -I/Users/duke/src/kde/kdebindings/kalyptus + +# KDOC -- C++ and CORBA IDL interface documentation tool. +# Sirtaj Singh Kang <[email protected]>, Jan 1999. +# $Id: kalyptus,v 1.9 2003/08/31 15:35:11 germaingarand Exp $ + +# All files in this project are distributed under the GNU General +# Public License. This is Free Software. + +require 5.000; + +use Carp; +use Getopt::Long; +use File::Basename; +use strict; + +use Ast; + +use kdocUtil; +use kdocAstUtil; +use kdocParseDoc; + +use vars qw/ %rootNodes $declNodeType @includes_list %options @formats_wanted $allow_k_dcop_accessors + @includeclasses $includeclasses $skipInternal %defines $defines $match_qt_defines + $libdir $libname $outputdir @libs $parse_global_space $striphpath $doPrivate $readstdin + $Version $quiet $debug $debuggen $parseonly $currentfile $cSourceNode $exe + %formats %flagnames @allowed_k_dcop_accesors $allowed_k_dcop_accesors_re $rootNode + @classStack $cNode $globalSpaceClassName + $lastLine $docNode @includes $cpp $defcppcmd $cppcmd $docincluded + $inExtern %stats %definitions @inputqueue @codeqobject /; + +## globals + +%rootNodes = (); # root nodes for each file type +$declNodeType = undef; # last declaration type + +@includes_list = (); # list of files included from the parsed .h + +# All options + +%options = (); # hash of options (set getopt below) +@formats_wanted = (); +$libdir = $ENV{KDOCLIBS}; +$libname = ""; +$outputdir = "."; +@libs = (); # list of includes +$striphpath = 0; + +@includeclasses = (); # names of classes to include +$includeclasses = ""; + +$doPrivate = 0; +$Version = "0.9"; + +$quiet = 0; +$debug = 0; +$debuggen = 0; +$parseonly = 0; +$globalSpaceClassName = "QGlobalSpace"; + +$currentfile = ""; + +$cpp = 0; +$defcppcmd = "g++ -Wp,-C -E"; +$cppcmd = ""; + +$exe = basename $0; + +@inputqueue = (); +@codeqobject = split "\n", <<CODE; +public: + virtual QMetaObject *metaObject() const; + virtual const char *className() const; + virtual void* qt_cast( const char* ); + virtual bool qt_invoke( int, QUObject* ); + virtual bool qt_emit( int, QUObject* ); + virtual bool qt_property( int, int, QVariant* ); + static QMetaObject* staticMetaObject(); + QObject* qObject(); + static QString tr( const char *, const char * = 0 ); + static QString trUtf8( const char *, const char * = 0 ); +private: +CODE + +# Supported formats +%formats = ( "java" => "kalyptusCxxToJava", "c" => "kalyptusCxxToC", + "objc" => "kalyptusCxxToObjc", "dcopidl" => "kalyptusCxxToDcopIDL", + "smoke" => "kalyptusCxxToSmoke", "csharp" => "kalyptusCxxToCSharp", + "ECMA" => "kalyptusCxxToECMA", "swig" => "kalyptusCxxToSwig" ); + +# these are for expansion of method flags +%flagnames = ( v => 'virtual', 's' => 'static', p => 'pure', + c => 'const', l => 'slot', i => 'inline', n => 'signal', + d => 'k_dcop', z => 'k_dcop_signals', y => 'k_dcop_hidden' ); + +@allowed_k_dcop_accesors = qw(k_dcop k_dcop_hidden k_dcop_signals); +$allowed_k_dcop_accesors_re = join("|", @allowed_k_dcop_accesors); + +%definitions = { + _STYLE_CDE => '', + _STYLE_MOTIF => '', + _STYLE_MOTIF_PLUS => '', + PLUS => '', + _STYLE_PLATINUM => '', + _STYLE_SGI => '', + _STYLE_WINDOWS => '', + QT_STATIC_CONST => 'static const', + Q_EXPORT => '', + Q_REFCOUNT => '', + QM_EXPORT_CANVAS => '', + QM_EXPORT_DNS => '', + QM_EXPORT_ICONVIEW => '', + QM_EXPORT_NETWORK => '', + QM_EXPORT_SQL => '', + QM_EXPORT_WORKSPACE => '', + QT_NO_REMOTE => 'QT_NO_REMOTE', + QT_ACCESSIBILITY_SUPPORT => 'QT_ACCESSIBILITY_SUPPORT', + Q_WS_X11 => 'Q_WS_X11', + Q_DISABLE_COPY => 'Q_DISABLE_COPY', + Q_WS_QWS => 'undef', + Q_WS_MAC => 'undef', + Q_OBJECT => <<'CODE', +public: + virtual QMetaObject *metaObject() const; + virtual const char *className() const; + virtual bool qt_invoke( int, QUObject* ); + virtual bool qt_emit( int, QUObject* ); + static QString tr( const char *, const char * = 0 ); + static QString trUtf8( const char *, const char * = 0 ); +private: +CODE +}; + +=head1 KDOC -- Source documentation tool + + Sirtaj Singh Kang <[email protected]>, Dec 1998. + +=cut + +# read options + +Getopt::Long::config qw( no_ignore_case permute bundling auto_abbrev ); + +GetOptions( \%options, + "format|f=s", \@formats_wanted, + "url|u=s", + "skip-internal", \$skipInternal, + "skip-deprecated|e", + "document-all|a", + "compress|z", + "no-cache", # do not create $HOME/.kalyptus cache + # HTML options + "html-cols=i", + "html-logo=s", + + "strip-h-path", \$striphpath, + "outputdir|d=s", \$outputdir, + "stdin|i", \$readstdin, + "name|n=s", \$libname, + "help|h", \&show_usage, + "version|v|V", \&show_version, + "private|p", \$doPrivate, + "libdir|L=s", \$libdir, + "xref|l=s", \@libs, + "classes|c=s", \@includeclasses, + "globspace", \$parse_global_space, + "allow_k_dcop_accessors", \$allow_k_dcop_accessors, + + "cpp|P", \$cpp, + "docincluded", \$docincluded, + "cppcmd|C=s", \$cppcmd, + "includedir|I=s", \@includes, + "define=s", \%defines, # define a single preprocessing symbol + "defines=s", \$defines, # file containing preprocessing symbols, one per line + + "quiet|q", \$quiet, + "debug|D", \$debug, # debug the parsing + "debuggen", \$debuggen, # debug the file generation + "parse-only", \$parseonly ) + || exit 1; + +$| = 1 if $debug or $debuggen; + +# preprocessor settings + +if ( $cppcmd eq "" ) { + $cppcmd = $defcppcmd; +} +else { + $cpp = 1; +} + +if ($#includeclasses>=0) +{ + $includeclasses = join (" ", @includeclasses); + print "Using Classes: $includeclasses\n" unless $quiet; +} + +if ( $#includes >= 0 && !$cpp ) { + die "$exe: --includedir requires --cpp\n"; +} + +# Check output formats. HTML is the default +if( $#formats_wanted < 0 ) { + push @formats_wanted, "java"; +} + +foreach my $format ( @formats_wanted ) { + die "$exe: unsupported format '$format'.\n" + if !defined $formats{$format}; +} + +if( $defines ) +{ + open( DEFS, $defines ) or die "Couldn't open $defines: $!\n"; + my @defs = <DEFS>; + chomp @defs; + close DEFS; + foreach (@defs) + { + $defines{ $_ } = 1 unless exists $defines{ $_ }; + } +} + +# Check the %defines hash for QT_* symbols and compile the corresponding RE +# Otherwise, compile the default ones. Used for filtering in readCxxLine. +if ( my @qt_defines = map { ($_=~m/^QT_(.*)/)[0] } keys %defines) +{ + my $regexp = "m/^#\\s*ifn?def\\s+QT_(?:" . join('|', map { "\$qt_defines[$_]" } 0..$#qt_defines).")/o"; + $match_qt_defines = eval "sub { my \$s=shift; + \$s=~/^#\\s*if(n)?def/ || return 0; + if(!\$1) { return \$s=~$regexp ? 0:1 } + else { return \$s=~$regexp ? 1:0 } + }"; + die if $@; +} +else +{ + $match_qt_defines = eval q� + sub + { + my $s = shift; + $s =~ m/^\#\s*ifndef\s+QT_NO_(?:REMOTE| # not in the default compile options + NIS| # ... + XINERAMA| + IMAGEIO_(?:MNG|JPEG)| + STYLE_(?:MAC|INTERLACE|COMPACT) + )/x; + } + �; + die if $@; +} +# Check if there any files to process. +# We do it here to prevent the libraries being loaded up first. + +checkFileArgs(); + +# work out libdir. This is created by kdocLib:writeDoc when +# required. +$libdir = $ENV{HOME}."/.kalyptus" unless $libdir ne ""; + + +###### +###### main program +###### + readLibraries(); + parseFiles(); + + if ( $parseonly ) { + print "\n\tParse Tree\n\t------------\n\n"; + kdocAstUtil::dumpAst( $rootNode ); + } + else { + writeDocumentation(); + writeLibrary() unless $libname eq ""; + } + + kdocAstUtil::printDebugStats() if $debug; + + exit 0; +###### + +sub checkFileArgs +{ + return unless $#ARGV < 0; + + die "$exe: no input files.\n" unless $readstdin; + + # read filenames from standard input + while (<STDIN>) { + chop; + $_ =~ s,\\,/,g; # back to fwd slash (for Windows) + foreach my $file ( split( /\s+/, $_ ) ) { + push @ARGV, $file; + } + } +} + +sub readLibraries +{ + return if $#libs < 0; + + require kdocLib; + foreach my $lib ( @libs ) { + print "$exe: reading lib: $lib\n" unless $quiet; + + my $relpath = exists $options{url} ? + $options{url} : $outputdir; + kdocLib::readLibrary( \&getRoot, $lib, $libdir, $relpath ); + } +} + +sub parseFiles +{ + foreach $currentfile ( @ARGV ) { + my $lang = "CXX"; + + if ( $currentfile =~ /\.idl\s*$/ ) { + # IDL file + $lang = "IDL"; + } + + # assume cxx file + if( $cpp ) { + # pass through preprocessor + my $cmd = $cppcmd; + foreach my $dir ( @includes ) { + $cmd .= " -I $dir "; + } + + $cmd .= " -DQOBJECTDEFS_H $currentfile"; + + open( INPUT, "$cmd |" ) + || croak "Can't preprocess $currentfile"; + } + else { + open( INPUT, "$currentfile" ) + || croak "Can't read from $currentfile"; + } + + print STDERR "$exe: processing $currentfile\n" unless $quiet; + + # reset vars + $rootNode = getRoot( $lang ); + + + # add to file lookup table + my $showname = $striphpath ? basename( $currentfile ) + : $currentfile; + $cSourceNode = Ast::New( $showname ); + $cSourceNode->AddProp( "NodeType", "source" ); + $cSourceNode->AddProp( "Path", $currentfile ); + $rootNode->AddPropList( "Sources", $cSourceNode ); + + # reset state + @classStack = (); + $cNode = $rootNode; + $inExtern = 0; + + # parse + my $k = undef; + while ( defined ($k = readDecl()) ) { + print "\nDecl: <$k>[$declNodeType]\n" if $debug; + if( identifyDecl( $k ) && $k =~ /{/ ) { + readCxxCodeBlock(); + } + } + close INPUT; + } +} + + +sub writeDocumentation +{ + foreach my $node ( values %rootNodes ) { + # postprocess + kdocAstUtil::linkNamespaces( $node ); + kdocAstUtil::makeInherit( $node, $node ); + kdocAstUtil::linkReferences( $node, $node ); + kdocAstUtil::calcStats( \%stats, $node, $node ); + + # write + no strict "refs"; + foreach my $format ( @formats_wanted ) { + my $pack = $formats{ $format }; + require $pack.".pm"; + + print STDERR "Generating bindings for $format ", + "language...\n" unless $quiet; + + my $f = "$pack\::writeDoc"; + &$f( $libname, $node, $outputdir, \%options ); + } + } +} + +sub writeLibrary +{ + if( $libname ne "" and !exists $options{'no-cache'} ) { + require kdocLib; + foreach my $lang ( keys %rootNodes ) { + my $node = $rootNodes{ $lang }; + kdocLib::writeDoc( $libname, $node, $lang, $libdir, + $outputdir, $options{url}, + exists $options{compress} ? 1 : 0 ); + } + } +} + +###### Parser routines + +=head2 readSourceLine + + Returns a raw line read from the current input file. + This is used by routines outside main, since I don t know + how to share fds. + +=cut + +sub readSourceLine +{ + return <INPUT>; +} + +=head2 readCxxLine + + Reads a C++ source line, skipping comments, blank lines, + preprocessor tokens and the Q_OBJECT macro + +=cut + +sub readCxxLine +{ + my( $p ); + my( $l ); + + while( 1 ) { + $p = shift @inputqueue || <INPUT>; + return undef if !defined ($p); + + $p =~ s#//.*$##g; # C++ comment + $p =~ s#/\*(?!\*).*?\*/##g; # C comment + + # join all multiline comments + if( $p =~ m#/\*(?!\*)#s ) { + # unterminated comment +LOOP: + while( defined ($l = <INPUT>) ) { + $l =~ s#//.*$##g; # C++ comment + $p .= $l; + $p =~ s#/\*(?!\*).*?\*/##sg; # C comment + last LOOP unless $p =~ m#(/\*(?!\*))|(\*/)#sg; + } + } + + if ( $p =~ /^\s*Q_OBJECT/ ) { + push @inputqueue, @codeqobject; + next; + } + # Hack, waiting for real handling of preprocessor defines + $p =~ s/QT_STATIC_CONST/static const/; + $p =~ s/KSVG_GET/KJS::Value get();/; + $p =~ s/KSVG_BASECLASS_GET/KJS::Value get();/; + $p =~ s/KSVG_BRIDGE/KJS::ObjectImp *bridge();/; + $p =~ s/KSVG_FORWARDGET/KJS::Value getforward();/; + $p =~ s/KSVG_PUT/bool put();/; + $p =~ s/KSVG_FORWARDPUT/bool putforward();/; + $p =~ s/KSVG_BASECLASS/virtual KJS::Value cache();/; + if ( $p =~ m/KSVG_DEFINE_PROTOTYPE\((\w+)\)/ ) { + push @inputqueue, split('\n',"namespace KSVG {\nclass $1 {\n};\n};"); + } + + next if ( $p =~ /^\s*$/s ); # blank lines +# || $p =~ /^\s*Q_OBJECT/ # QObject macro +# ); +# + + next if ( $p =~ /^\s*Q_ENUMS/ # ignore Q_ENUMS + || $p =~ /^\s*Q_PROPERTY/ # and Q_PROPERTY + || $p =~ /^\s*Q_OVERRIDE/ # and Q_OVERRIDE + || $p =~ /^\s*Q_SETS/ + || $p =~ /^\s*Q_DUMMY_COMPARISON_OPERATOR/ + || $p =~ /^\s*K_SYCOCATYPE/ # and K_SYCOCA stuff + || $p =~ /^\s*K_SYCOCAFACTORY/ # + || $p =~ /^\s*KSVG_/ # and KSVG stuff ;) + ); + + push @includes_list, $1 if $p =~ /^#include\s+<?(.*?)>?\s*$/; + + # remove all preprocessor macros + if( $p =~ /^\s*#\s*(\w+)/ ) { + # Handling of preprocessed sources: skip anything included from + # other files, unless --docincluded was passed. + if (!$docincluded && $p =~ /^\s*#\s*[0-9]+\s*\".*$/ + && not($p =~ /\"$currentfile\"/)) { + # include file markers + while( <INPUT> ) { + last if(/\"$currentfile\"/); + print "Overread $_" if $debug; + }; + print "Cont: $_" if $debug; + } + else { + # Skip platform-specific stuff, or #if 0 stuff + # or #else of something we parsed (e.g. for QKeySequence) + if ( $p =~ m/^#\s*ifdef\s*Q_WS_/ or + $p =~ m/^#\s*if\s+defined\(Q_WS_/ or + $p =~ m/^#\s*if\s+defined\(Q_OS_/ or + $p =~ m/^#\s*if\s+defined\(Q_CC_/ or + $p =~ m/^#\s*if\s+defined\(QT_THREAD_SUPPORT/ or + $p =~ m/^#\s*else/ or + $p =~ m/^#\s*if\s+defined\(Q_FULL_TEMPLATE_INSTANTIATION/ or + $p =~ m/^#\s*ifdef\s+CONTAINER_CUSTOM_WIDGETS/ or + &$match_qt_defines( $p ) or + $p =~ m/^#\s*if\s+0\s+/ ) { + my $if_depth = 1; + while ( defined $p && $if_depth > 0 ) { + $p = <INPUT>; + last if !defined $p; + $if_depth++ if $p =~ m/^#\s*if/; + $if_depth-- if $p =~ m/^#\s*endif/; + # Exit at #else in the #ifdef QT_NO_ACCEL/#else/#endif case + last if $if_depth == 1 && $p =~ m/^#\s*else\s/; + #ignore elif for now + print "Skipping ifdef'ed line: $p" if $debug; + } + } + + # multiline macros + while ( defined $p && $p =~ m#\\\s*$# ) { + $p = <INPUT>; + } + } + next; + } + + $lastLine = $p; + return $p; + } +} + +=head2 readCxxCodeBlock + + Reads a C++ code block (recursive curlies), returning the last line + or undef on error. + + Parameters: none + +=cut + +sub readCxxCodeBlock +{ +# Code: begins in a {, ends in }\s*;? +# In between: cxx source, including {} + my ( $count ) = 0; + my $l = undef; + + if ( defined $lastLine ) { + print "lastLine: '$lastLine'" if $debug; + + my $open = kdocUtil::countReg( $lastLine, "{" ); + my $close = kdocUtil::countReg( $lastLine, "}" ); + $count = $open - $close; + + return $lastLine if ( $open || $close) && $count == 0; + } + + # find opening brace + if ( $count == 0 ) { + while( $count == 0 ) { + $l = readCxxLine(); + return undef if !defined $l; + $l =~ s/\\.//g; + $l =~ s/'.?'//g; + $l =~ s/".*?"//g; + + $count += kdocUtil::countReg( $l, "{" ); + print "c ", $count, " at '$l'" if $debug; + } + $count -= kdocUtil::countReg( $l, "}" ); + } + + # find associated closing brace + while ( $count > 0 ) { + $l = readCxxLine(); + croak "Confused by unmatched braces" if !defined $l; + $l =~ s/\\.//g; + $l =~ s/'.?'//g; + $l =~ s/".*?"//g; + + my $add = kdocUtil::countReg( $l, "{" ); + my $sub = kdocUtil::countReg( $l, "}" ); + $count += $add - $sub; + + print "o ", $add, " c ", $sub, " at '$l'" if $debug; + } + + undef $lastLine; + return $l; +} + +=head2 readDecl + + Returns a declaration and sets the $declNodeType variable. + + A decl starts with a type or keyword and ends with [{};] + The entire decl is returned in a single line, sans newlines. + + declNodeType values: undef for error, "a" for access specifier, + "c" for doc comment, "d" for other decls. + + readCxxLine is used to read the declaration. + +=cut + +sub readDecl +{ + undef $declNodeType; + my $l = readCxxLine(); + my ( $decl ) = ""; + + my $allowed_accesors = "private|public|protected|signals"; + $allowed_accesors .= "|$allowed_k_dcop_accesors_re" if $allow_k_dcop_accessors; + + if( !defined $l ) { + return undef; + } + elsif ( $l =~ /^\s*($allowed_accesors) + (\s+\w+)?\s*:/x) { # access specifier + $declNodeType = "a"; + return $l; + } + elsif ( $l =~ /K_DCOP/ ) { + $declNodeType = "k"; + return $l; + } + elsif ( $l =~ m#^\s*/\*\*# ) { # doc comment + $declNodeType = "c"; + return $l; + } + + do { + $decl .= $l; + + if ( $l =~ /[{};]/ ) { + $decl =~ s/\n/ /gs; + $declNodeType = "d"; + return $decl; + } + return undef if !defined ($l = readCxxLine()); + + } while ( 1 ); +} + +#### AST Generator Routines + +=head2 getRoot + + Return a root node for the given type of input file. + +=cut + +sub getRoot +{ + my $type = shift; + carp "getRoot called without type" unless defined $type; + + if ( !exists $rootNodes{ $type } ) { + my $node = Ast::New( "Global" ); # parent of all nodes + $node->AddProp( "NodeType", "root" ); + $node->AddProp( "RootType", $type ); + $node->AddProp( "Compound", 1 ); + $node->AddProp( "KidAccess", "public" ); + + $rootNodes{ $type } = $node; + } + print "getRoot: call for $type\n" if $debug; + + return $rootNodes{ $type }; +} + +=head2 identifyDecl + + Parameters: decl + + Identifies a declaration returned by readDecl. If a code block + needs to be skipped, this subroutine returns a 1, or 0 otherwise. + +=cut + +sub identifyDecl +{ + my( $decl ) = @_; + + my $newNode = undef; + my $skipBlock = 0; + + # Doc comment + if ( $declNodeType eq "c" ) { + $docNode = kdocParseDoc::newDocComment( $decl ); + + # if it's the main doc, it is attached to the root node + if ( defined $docNode->{LibDoc} ) { + kdocParseDoc::attachDoc( $rootNode, $docNode, + $rootNode ); + undef $docNode; + } + + } + elsif ( $declNodeType eq "a" ) { + newAccess( $decl ); + } + elsif ( $declNodeType eq "k" ) { + $cNode->AddProp( "DcopExported", 1 ); + } + + # Typedef struct/class + elsif ( $decl =~ /^\s*typedef + \s+(struct|union|class|enum) + \s*([_\w\:]*) + \s*([;{]) + /xs ) { + my ($type, $name, $endtag, $rest ) = ($1, $2, $3, $' ); + $name = "--" if $name eq ""; + + warn "typedef '$type' n:'$name'\n" if $debug; + + if ( $rest =~ /}\s*([\w_]+(?:::[\w_])*)\s*;/ ) { + # TODO: Doesn't parse members yet! + $endtag = ";"; + $name = $1; + } + + $newNode = newTypedefComp( $type, $name, $endtag ); + } + + # Typedef + elsif ( $decl =~ /^\s*typedef\s+ + (?:typename\s+)? # `typename' keyword + (.*?\s*[\*&]?) # type + \s+([-\w_\:]+) # name + \s*((?:\[[-\w_\:<>\s]*\])*) # array + \s*[{;]\s*$/xs ) { + + print "Typedef: <$1 $3> <$2>\n" if $debug; + $newNode = newTypedef( $1." ".$3, $2 ); + } + + # Enum + elsif ( $decl =~ /^\s*enum\s+([-\w_:]*)?\s*\{(.*)/s ) { + + print "Enum: <$1>\n" if $debug; + my $enumname = defined $2 ? $1 : ""; + + $newNode = newEnum( $enumname ); + } + + # Class/Struct + elsif ( $decl =~ /^\s*((?:template\s*<.*>)?) # 1 template + \s*(class|struct|union|namespace) # 2 struct type + (?:\s*Q[A-Z_]*EXPORT[A-Z_]*)? + (?:\s*Q_PACKED)? + (?:\s*Q_REFCOUNT)? + \s+([\w_]+ # 3 name + (?:<[\w_ :,]+?>)? # maybe explicit template + # (eat chars between <> non-hungry) + (?:::[\w_]+)* # maybe nested + ) + (.*?) # 4 inheritance + ([;{])/xs ) { # 5 rest + + print "Class: [$1]\n\t[$2]\n\t[$3]\n\t[$4]\n\t[$5]\n" if $debug; + my ( $tmpl, $ntype, $name, $rest, $endtag ) = + ( $1, $2, $3, $4, $5 ); + + if ($includeclasses) + { + if (! ($includeclasses =~ /$name/) ) + { + return 1; + + } + } + + my @inherits = (); + + $tmpl =~ s/<(.*)>/$1/ if $tmpl ne ""; + + if( $rest =~ /^\s*:\s*/ ) { + # inheritance + $rest = $'; + @inherits = parseInheritance( $rest ); + } + + $newNode = newClass( $tmpl, $ntype, + $name, $endtag, @inherits ); + } + # IDL compound node + elsif( $decl =~ /^\s*(module|interface|exception) # struct type + \s+([-\w_]+) # name + (.*?) # inheritance? + ([;{])/xs ) { + + my ( $type, $name, $rest, $fwd, $complete ) + = ( $1, $2, $3, $4 eq ";" ? 1 : 0, + 0 ); + my @in = (); + print "IDL: [$type] [$name] [$rest] [$fwd]\n" if $debug; + + if( $rest =~ /^\s*:\s*/ ) { + $rest = $'; + $rest =~ s/\s+//g; + @in = split ",", $rest; + } + if( $decl =~ /}\s*;/ ) { + $complete = 1; + } + + $newNode = newIDLstruct( $type, $name, $fwd, $complete, @in ); + } + # Method + elsif ( $decl =~ /^\s*([^=]+?(?:operator\s*(?:\(\)|.?=)\s*)?) # ret+nm + \( (.*?) \) # parameters + \s*((?:const)?)\s* + \s*((?:=\s*0(?:L?))?)\s* # Pureness. is "0L" allowed? + \s*[;{]+/xs ) { # rest + + my $tpn = $1; # type + name + my $params = $2; + # Remove constructor initializer, that's not in the params + if ( $params =~ /\s*\)\s*:\s*/ ) { + # Hack: first .* made non-greedy for QSizePolicy using a?(b):c in ctor init + $params =~ s/(.*?)\s*\)\s*:\s*.*$/$1/; + } + + my $const = $3 eq "" ? 0 : 1; + my $pure = $4 eq "" ? 0 : 1; + $tpn =~ s/\s+/ /g; + $params =~ s/\s+/ /g; + + print "Method: R+N:[$tpn]\n\tP:[$params]\n\t[$const]\n" if $debug; + + if ( $tpn =~ /((?:\w+\s*::\s*)?operator.*?)\s*$/ # operator + || $tpn =~ /((?:\w*\s*::\s*~?)?[-\w:]+)\s*$/ ) { # normal + my $name = $1; + $tpn = $`; + $newNode = newMethod( $tpn, $name, + $params, $const, $pure ); + } + + $skipBlock = 1; # FIXME check end token before doing this! + } + # Using: import namespace + elsif ( $decl =~ /^\s*using\s+namespace\s+(\w+)/ ) { + newNamespace( $1 ); + + } + + # extern block + elsif ( $decl =~ /^\s*extern\s*"(.*)"\s*{/ ) { + $inExtern = 1 unless $decl =~ /}/; + } + + # Single variable + elsif ( $decl =~ /^ + \s*( (?:[\w_:]+(?:\s+[\w_:]+)*? )# type + \s*(?:<.+>)? # template + \s*(?:[\&\*])? # ptr or ref + (?:\s*(?:const|volatile))* ) + \s*([\w_:]+) # name + \s*( (?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? ) # array + \s*((?:=.*)?) # value + \s*([;{])\s*$/xs ) { + my $type = $1; + my $name = $2; + my $arr = $3; + my $val = $4; + my $end = $5; + + if ( $type !~ /^friend\s+class\s*/ ) { + print "Var: [$name] type: [$type$arr] val: [$val]\n" + if $debug; + + $newNode = newVar( $type.$arr, $name, $val ); + } + + $skipBlock = 1 if $end eq '{'; + } + + # Multi variables + elsif ( $decl =~ m/^ + \s*( (?:[\w_:]+(?:\s+[\w_:]+)*? ) # type + \s*(?:<.+>)?) # template + + \s*( (?:\s*(?: [\&\*][\&\*\s]*)? # ptr or ref + [\w_:]+) # name + \s*(?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? # array + \s*(?:, # extra vars + \s*(?: [\&\*][\&\*\s]*)? # ptr or ref + \s*(?:[\w_:]+) # name + \s*(?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? # array + )* + \s*(?:=.*)?) # value + \s*[;]/xs ) { + + my $type = $1; + my $names = $2; + my $end = $3; + my $doc = $docNode; + + print "Multivar: type: [$type] names: [$names] \n" if $debug; + + foreach my $vardecl ( split( /\s*,\s*/, $names ) ) { + next unless $vardecl =~ m/ + \s*((?: [\&\*][\&\*\s]*)?) # ptr or ref + \s*([\w_:]+) # name + \s*( (?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? ) # array + \s*((?:=.*)?) # value + /xs; + my ($ptr, $name, $arr, $val) = ($1, $2, $3, $4); + + print "Split: type: [$type$ptr$arr] ", + " name: [$name] val: [$val] \n" if $debug; + + my $node = newVar( $type.$ptr.$arr, $name, $val ); + + $docNode = $doc; # reuse docNode for each + postInitNode( $node ) unless !defined $node; + } + + $skipBlock = 1 if $end eq '{'; + } + # end of an "extern" block + elsif ( $decl =~ /^\s*}\s*$/ ) { + $inExtern = 0; + } + # end of an in-block declaration + elsif ( $decl =~ /^\s*}\s*(.*?)\s*;\s*$/ ) { + + if ( $cNode->{astNodeName} eq "--" ) { + # structure typedefs should have no name preassigned. + # If they do, then the name in + # "typedef struct <name> { ..." is kept instead. + # TODO: Buglet. You should fix YOUR code dammit. ;) + + + $cNode->{astNodeName} = $1; + my $siblings = $cNode->{Parent}->{KidHash}; + undef $siblings->{"--"}; + $siblings->{ $1 } = $cNode; + } + + if ( $#classStack < 0 ) { + confess "close decl found, but no class in stack!" ; + $cNode = $rootNode; + } + else { + $cNode = pop @classStack; + print "end decl: popped $cNode->{astNodeName}\n" + if $debug; + } + } + # unidentified block start + elsif ( $decl =~ /{/ ) { + print "Unidentified block start: $decl\n" if $debug; + $skipBlock = 1; + } + # explicit template instantiation, or friend template + elsif ( $decl =~ /(template|friend)\s+class\s+(?:Q[A-Z_]*EXPORT[A-Z_]*\s*)?\w+\s*<.*>\s*;/x ) { + # Nothing to be done with those. + } + else { + + ## decl is unidentified. + warn "Unidentified decl: $decl\n"; + } + + # once we get here, the last doc node is already used. + # postInitNode should NOT be called for forward decls + postInitNode( $newNode ) unless !defined $newNode; + + return $skipBlock; +} + +sub postInitNode +{ + my $newNode = shift; + + carp "Cannot postinit undef node." if !defined $newNode; + + # The reasoning here: + # Forward decls never get a source node. + # Once a source node is defined, don't assign another one. + + if ( $newNode->{NodeType} ne "Forward" && !defined $newNode->{Source}) { + $newNode->AddProp( "Source", $cSourceNode ); + } elsif ( $newNode->{NodeType} eq "Forward" ) { + if ($debug) { + print "postInit: skipping fwd: $newNode->{astNodeName}\n"; + } + undef $docNode; + return; + } + + if( defined $docNode ) { + kdocParseDoc::attachDoc( $newNode, $docNode, $rootNode ); + undef $docNode; + } +} + + +##### Node generators + +=head2 newEnum + + Reads the parameters of an enumeration. + + Returns the parameters, or undef on error. + +=cut + +sub newEnum +{ + my ( $enum ) = @_; + my $k = undef; + my $params = ""; + + $k = $lastLine if defined $lastLine; + + if( defined $lastLine && $lastLine =~ /{/ ) { + $params = $'; + if ( $lastLine =~ /}(.*?);/ ) { + return initEnum( $enum, $1, $params ); + } + } + + while ( defined ( $k = readCxxLine() ) ) { + $params .= $k; + + if ( $k =~ /}(.*?);/ ) { + return initEnum( $enum, $1, $params ); + } + } + + return undef; +} + +=head2 initEnum + + Parameters: name, (ref) params + + Returns an initialized enum node. + +=cut + +sub initEnum +{ + my( $name, $end, $params ) = @_; + + ($name = $end) if $name eq "" && $end ne ""; + + $params =~ s#\s+# #sg; # no newlines + $params = $1 if $params =~ /^\s*{?(.*)}/; + print "$name params: [$params]\n" if $debug; + + + my ( $node ) = Ast::New( $name ); + $node->AddProp( "NodeType", "enum" ); + $node->AddProp( "Params", $params ); + makeParamList( $node, $params, 1 ); # Adds the ParamList property containing the list of param nodes + kdocAstUtil::attachChild( $cNode, $node ); + + return $node; +} + +=head2 newIDLstruct + + Parameters: type, name, forward, complete, inherits... + + Handles an IDL structure definition (ie module, interface, + exception). + +=cut + +sub newIDLstruct +{ + my ( $type, $name, $fwd, $complete ) = @_; + + my $node = exists $cNode->{KidHash} ? + $cNode->{KidHash}->{ $name } : undef; + + if( !defined $node ) { + $node = Ast::New( $name ); + $node->AddProp( "NodeType", $fwd ? "Forward" : $type ); + $node->AddProp( "KidAccess", "public" ); + $node->AddProp( "Compound", 1 ) unless $fwd; + kdocAstUtil::attachChild( $cNode, $node ); + } + elsif ( $fwd ) { + # If we have a node already, we ignore forwards. + return undef; + } + elsif ( $node->{NodeType} eq "Forward" ) { + # we are defining a previously forward node. + $node->AddProp( "NodeType", $type ); + $node->AddProp( "Compound", 1 ); + $node->AddProp( "Source", $cSourceNode ); + } + + # register ancestors. + foreach my $ances ( splice ( @_, 4 ) ) { + my $n = kdocAstUtil::newInherit( $node, $ances ); + } + + if( !( $fwd || $complete) ) { + print "newIDL: pushing $cNode->{astNodeName},", + " new is $node->{astNodeName}\n" + if $debug; + push @classStack, $cNode; + $cNode = $node; + } + + return $node; +} + +=head2 newClass + + Parameters: tmplArgs, cNodeType, name, endTag, @inheritlist + + Handles a class declaration (also fwd decls). + +=cut + +sub newClass +{ + my( $tmplArgs, $cNodeType, $name, $endTag ) = @_; + + my $access = "private"; + $access = "public" if $cNodeType ne "class"; + + # try to find an exisiting node, or create a new one + my $oldnode = kdocAstUtil::findRef( $cNode, $name ); + my $node = defined $oldnode ? $oldnode : Ast::New( $name ); + + if ( $endTag ne "{" ) { + # forward + if ( !defined $oldnode ) { + # new forward node + $node->AddProp( "NodeType", "Forward" ); + $node->AddProp( "KidAccess", $access ); + kdocAstUtil::attachChild( $cNode, $node ); + } + return $node; + } + + # this is a class declaration + + print "ClassName: $name\n" if $debug; + + $node->AddProp( "NodeType", $cNodeType ); + $node->AddProp( "Compound", 1 ); + $node->AddProp( "Source", $cSourceNode ); + + $node->AddProp( "KidAccess", $access ); + $node->AddProp( "Tmpl", $tmplArgs ) unless $tmplArgs eq ""; + + if ( !defined $oldnode ) { + kdocAstUtil::attachChild( $cNode, $node ); + } + + # inheritance + + foreach my $ances ( splice (@_, 4) ) { + my $type = ""; + my $name = $ances; + my $intmpl = undef; + +WORD: + foreach my $word ( split ( /([\w:]+(:?\s*<.*>)?)/, $ances ) ) { + next WORD unless $word =~ /^[\w:]/; + if ( $word =~ /(private|public|protected|virtual)/ ) { + $type .= "$1 "; + } + else { + + if ( $word =~ /<(.*)>/ ) { + # FIXME: Handle multiple tmpl args + $name = $`; + $intmpl = $1; + } + else { + $name = $word; + } + + last WORD; + } + } + + # set inheritance access specifier if none specified + if ( $type eq "" ) { + $type = $cNodeType eq "class" ? "private ":"public "; + } + chop $type; + + # attach inheritance information + my $n = kdocAstUtil::newInherit( $node, $name ); + $n->AddProp( "Type", $type ); + + $n->AddProp( "TmplType", $intmpl ) if defined $intmpl; + + print "In: $name type: $type, tmpl: $intmpl\n" if $debug; + } + + # new current node + print "newClass: Pushing $cNode->{astNodeName}\n" if $debug; + push ( @classStack, $cNode ); + $cNode = $node; + + return $node; +} + + +=head3 parseInheritance + + Param: inheritance decl string + Returns: list of superclasses (template decls included) + + This will fail if < and > appear in strings in the decl. + +=cut + +sub parseInheritance +{ + my $instring = shift; + my @inherits = (); + + my $accum = ""; + foreach $instring ( split (/\s*,\s*/, $instring) ) { + $accum .= $instring.", "; + next unless (kdocUtil::countReg( $accum, "<" ) + - kdocUtil::countReg( $accum, ">" ) ) == 0; + + # matching no. of < and >, so assume the parent is + # complete + $accum =~ s/,\s*$//; + print "Inherits: '$accum'\n" if $debug; + push @inherits, $accum; + $accum = ""; + } + + return @inherits; +} + + +=head2 newNamespace + + Param: namespace name. + Returns nothing. + + Imports a namespace into the current node, for ref searches etc. + Triggered by "using namespace ..." + +=cut + +sub newNamespace +{ + $cNode->AddPropList( "ImpNames", shift ); +} + + + +=head2 newTypedef + + Parameters: realtype, name + + Handles a type definition. + +=cut + +sub newTypedef +{ + my ( $realtype, $name ) = @_; + + my ( $node ) = Ast::New( $name ); + + $node->AddProp( "NodeType", "typedef" ); + $node->AddProp( "Type", $realtype ); + + kdocAstUtil::attachChild( $cNode, $node ); + + return $node; +} + +=head2 newTypedefComp + + Params: realtype, name endtoken + + Creates a new compound type definition. + +=cut + +sub newTypedefComp +{ + my ( $realtype, $name, $endtag ) = @_; + + my ( $node ) = Ast::New( $name ); + + $node->AddProp( "NodeType", "typedef" ); + $node->AddProp( "Type", $realtype ); + + kdocAstUtil::attachChild( $cNode, $node ); + + if ( $endtag eq '{' ) { + print "newTypedefComp: Pushing $cNode->{astNodeName}\n" + if $debug; + push ( @classStack, $cNode ); + $cNode = $node; + } + + return $node; +} + + +=head2 newMethod + + Parameters: retType, name, params, const, pure? + + Handles a new method declaration or definition. + +=cut +BEGIN { + +my $theSourceNode = $cSourceNode; + +sub newMethod +{ + my ( $retType, $name, $params, $const, $pure ) = @_; + my $parent = $cNode; + my $class; + + print "Cracked: [$retType] [$name]\n\t[$params]\n\t[$const]\n" + if $debug; + + if ( $retType =~ /([\w\s_<>,]+)\s*::\s*$/ ) { + # check if stuff before :: got into rettype by mistake. + $retType = $`; + ($name = $1."::".$name); + $name =~ s/\s+/ /g; + print "New name = \"$name\" and type = '$retType'\n" if $debug; + } + + # A 'friend method' declaration isn't a real method declaration + return undef if ( $retType =~ /^friend\s+/ || $retType =~ /^friend\s+class\s+/ ); + + my $isGlobalSpace = 0; + + if( $name =~ /^\s*(.*?)\s*::\s*(.*?)\s*$/ ) { + # Fully qualified method name. + $name = $2; + $class = $1; + + if( $class =~ /^\s*$/ ) { + $parent = $rootNode; + } + elsif ( $class eq $cNode->{astNodeName} ) { + $parent = $cNode; + } + else { + # ALWAYS IGNORE... + return undef; + + my $node = kdocAstUtil::findRef( $cNode, $class ); + + if ( !defined $node ) { + # if we couldn't find the name, try again with + # all template parameters stripped off: + my $strippedClass = $class; + $strippedClass =~ s/<[^<>]*>//g; + + $node = kdocAstUtil::findRef( $cNode, $strippedClass ); + + # if still not found: give up + if ( !defined $node ) { + warn "$exe: Unidentified class: $class ". + "in $currentfile\:$.\n"; + return undef; + } + } + + $parent = $node; + } + } + # TODO fix for $retType =~ /template<.*?>/ + elsif( $parse_global_space && $parent->{NodeType} eq "root" && $name !~ /\s*qt_/ && $retType !~ /template\s*<.*?>/ ) { + $class = $globalSpaceClassName; # FIXME - sanitize the naming system? + $isGlobalSpace = 1; + + my $opsNode = kdocAstUtil::findRef( $cNode, $class ); + if (!$opsNode) { + # manually create a "GlobalSpace" class + $opsNode = Ast::New( $class ); + $opsNode->AddProp( "NodeType", "class" ); + $opsNode->AddProp( "Compound", 1 ); + $opsNode->AddProp( "Source", $cSourceNode ); # dummy + $opsNode->AddProp( "KidAccess", "public" ); + kdocAstUtil::attachChild( $cNode, $opsNode ); + } + unless( $theSourceNode == $cSourceNode ) { + $theSourceNode = $cSourceNode; + $opsNode->AddPropList( "Sources", $theSourceNode ); # sources are scattered across Qt + } + $parent = $opsNode; + } + + # flags + + my $flags = ""; + + if( $retType =~ /static/ || $isGlobalSpace ) { + $flags .= "s"; + $retType =~ s/static//g; + } + + if( $const && !$isGlobalSpace ) { + $flags .= "c"; + } + + if( $pure ) { + $flags .= "p"; + } + + if( $retType =~ /virtual/ ) { + $flags .= "v"; + $retType =~ s/virtual//g; + } + + print "\n" if $flags ne "" && $debug; + + if ( !defined $parent->{KidAccess} ) { + warn "'", $parent->{astNodeName}, "' has no KidAccess ", + exists $parent->{Forward} ? "(forward)\n" :"\n"; + } + + # NB, these are =~, so make sure they are listed in correct order + if ( $parent->{KidAccess} =~ /slot/ ) { + $flags .= "l"; + } + elsif ( $parent->{KidAccess} =~ /k_dcop_signals/ ) { + $flags .= "z"; + } + elsif ( $parent->{KidAccess} =~ /k_dcop_hidden/ ) { + $flags .= "y"; + } + elsif ( $parent->{KidAccess} =~ /k_dcop/ ) { + $flags .= "d"; + } + elsif ( $parent->{KidAccess} =~ /signal/ ) { + $flags .= "n"; + } + + $retType =~ s/QM?_EXPORT[_A-Z]*\s*//; + $retType =~ s/inline\s+//; + $retType =~ s/extern\s+//; + $retType =~ s/^\s*//g; + $retType =~ s/\s*$//g; + + # node + + my $node = Ast::New( $name ); + $node->AddProp( "NodeType", "method" ); + $node->AddProp( "Flags", $flags ); + $node->AddProp( "ReturnType", $retType ); + $node->AddProp( "Params", $params ); # The raw string with the whole param list + makeParamList( $node, $params, 0 ); # Adds the ParamList property containing the list of param nodes + + $parent->AddProp( "Pure", 1 ) if $pure; + + kdocAstUtil::attachChild( $parent, $node ); + return $node; +} + +} + +=head2 makeParamList + + Parameters: + * method (or enum) node + * string containing the whole param list + * 1 for enums + + Adds a property "ParamList" to the method node. + This property contains a list of nodes, one for each parameter. + + Each parameter node has the following properties: + * ArgType the type of the argument, e.g. const QString& + * ArgName the name of the argument - optionnal + * DefaultValue the default value of the argument - optionnal + + For enum values, ArgType is unset, ArgName is the name, DefaultValue its value. + + Author: David Faure <[email protected]> +=cut + +sub makeParamList($$$) +{ + my ( $methodNode, $params, $isEnum ) = @_; + $params =~ s/\s+/ /g; # normalize multiple spaces/tabs into a single one + $params =~ s/\s*([,\*\&])\s*/$1 /g; # normalize spaces before and after *, & and ',' + $params =~ s/^\s*void\s*$//; # foo(void) ==> foo() + $params =~ s/^\s*$//; + # Make sure the property always exists, makes iteration over it easier + $methodNode->AddProp( "ParamList", [] ); + + my @args = kdocUtil::splitUnnested( ',', $params); + + my $argId = 0; + foreach my $arg ( @args ) { + my $argType; + my $argName; + my $defaultparam; + $arg =~ s/\s*([^\s].*[^\s])\s*/$1/; # stripWhiteSpace + $arg =~ s/(\w+)\[\]/\* $1/; # Turn [] array into * + + # The RE below reads as: = ( string constant or char + # or some word/number, with optional bitwise shifts, OR'ed or +'ed flags, and/or function call ). + if ( $arg =~ s/\s*=\s*(("[^\"]*")|(\'.\')|(([-\w:~]*)\s*([<>\|\+-]*\s*\w*\s*)*(\([^(]*\))?))// ) { + $defaultparam = $1; + } + + # Separate arg type from arg name, if the latter is specified + if ( $arg =~ /(.*)\s+([\w_]+)\s*$/ || $arg =~ /(.*)\(\s*\*\s([\w_]+)\)\s*\((.*)\)\s*$/ ) { + if ( defined $3 ) { # function pointer + $argType = $1."(*)($3)"; + $argName = $2; + } else { + $argType = $1; + $argName = $2; + } + } else { # unnamed arg - or enum value + $argType = $arg if (!$isEnum); + $argName = $arg if ($isEnum); + } + $argId++; + + my $node = Ast::New( $argId ); # let's make the arg index the node "name" + $node->AddProp( "NodeType", "param" ); + $node->AddProp( "ArgType", $argType ); + $node->AddProp( "ArgName", $argName ) if (defined $argName); + $node->AddProp( "DefaultValue", $defaultparam ) if (defined $defaultparam); + $methodNode->AddPropList( "ParamList", $node ); + print STDERR "ArgType: $argType ArgName: $argName\n" if ($debug); + } +} + +=head2 newAccess + + Parameters: access + + Sets the default "Access" specifier for the current class node. If + the access is a "slot" type, "_slots" is appended to the access + string. + +=cut + +sub newAccess +{ + my ( $access ) = @_; + + return undef unless ($access =~ /^\s*(\w+)\s*(slots|$allowed_k_dcop_accesors_re)?/); + + print "Access: [$1] [$2]\n" if $debug; + + $access = $1; + + if ( defined $2 && $2 ne "" ) { + $access .= "_" . $2; + } + + $cNode->AddProp( "KidAccess", $access ); + + return $cNode; +} + + +=head2 newVar + + Parameters: type, name, value + + New variable. Value is ignored if undef + +=cut + +sub newVar +{ + my ( $type, $name, $val ) = @_; + + my $node = Ast::New( $name ); + $node->AddProp( "NodeType", "var" ); + + my $static = 0; + if ( $type =~ /static/ ) { + # $type =~ s/static//; + $static = 1; + } + + $node->AddProp( "Type", $type ); + $node->AddProp( "Flags", 's' ) if $static; + $node->AddProp( "Value", $val ) if defined $val; + kdocAstUtil::attachChild( $cNode, $node ); + + return $node; +} + + + +=head2 show_usage + + Display usage information and quit. + +=cut + +sub show_usage +{ +print<<EOF; +usage: + $exe [options] [-f format] [-d outdir] [-n name] files... [-llib..] + +See the man page kdoc[1] for more info. +EOF + exit 1; +} + + +=head2 show_version + + Display short version information and quit. + +=cut + +sub show_version +{ + die "$exe: $Version (c) Sirtaj S. Kang <taj\@kde.org>\n"; +} + + diff --git a/kalyptus/kalyptusCxxToSmoke.pm b/kalyptus/kalyptusCxxToSmoke.pm new file mode 100644 index 0000000..8549d39 --- /dev/null +++ b/kalyptus/kalyptusCxxToSmoke.pm @@ -0,0 +1,2221 @@ +#*************************************************************************** +# kalyptusCxxToSmoke.pm - Generates x_*.cpp files for smoke +# ------------------- +# begin : Fri Jan 25 12:00:00 2000 +# copyright : (C) 2002 Lost Highway Ltd. All Rights Reserved. +# email : [email protected] +# author : David Faure. +#***************************************************************************/ + +#/*************************************************************************** +# * * +# * This program 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 2 of the License, or * +# * (at your option) any later version. * +# * * +#***************************************************************************/ + +package kalyptusCxxToSmoke; + +use File::Path; +use File::Basename; +use constant numSourceFiles => 20; # Total number of generated source files. + # All classes will be distributed across those. + +use Carp; +use Ast; +use kdocAstUtil; +use kdocUtil; +use Iter; +use kalyptusDataDict; + +use strict; +no strict "subs"; + +use vars qw/ + $libname $rootnode $outputdir $opt $debug + $methodNumber + %builtins %typeunion %allMethods %allTypes %enumValueToType %typedeflist %mungedTypeMap + %skippedClasses /; + +BEGIN +{ + +# Types supported by the StackItem union +# Key: C++ type Value: Union field of that type +%typeunion = ( + 'void*' => 's_voidp', + 'bool' => 's_bool', + 'char' => 's_char', + 'uchar' => 's_uchar', + 'short' => 's_short', + 'ushort' => 's_ushort', + 'int' => 's_int', + 'uint' => 's_uint', + 'long' => 's_long', + 'ulong' => 's_ulong', + 'float' => 's_float', + 'double' => 's_double', + 'enum' => 's_enum', + 'class' => 's_class' +); + +# Mapping for iterproto, when making up the munged method names +%mungedTypeMap = ( + 'QString' => '$', + 'QString*' => '$', + 'QString&' => '$', + 'QCString' => '$', + 'QCString*' => '$', + 'QCString&' => '$', + 'QByteArray' => '$', + 'QByteArray&' => '$', + 'QByteArray*' => '$', + 'char*' => '$', + 'QCOORD*' => '?', + 'QRgb*' => '?', +); + +# Yes some of this is in kalyptusDataDict's ctypemap +# but that one would need to be separated (builtins vs normal classes) +%typedeflist = +( + 'signed char' => 'char', + 'unsigned char' => 'uchar', + 'signed short' => 'short', + 'unsigned short' => 'ushort', + 'signed' => 'int', + 'signed int' => 'int', + 'unsigned' => 'uint', + 'unsigned int' => 'uint', + 'signed long' => 'long', + 'unsigned long' => 'ulong', + +# Anything that is not known is mapped to void*, so no need for those here anymore +# 'QWSEvent*' => 'void*', +# 'QDiskFont*' => 'void*', +# 'XEvent*' => 'void*', +# 'QStyleHintReturn*' => 'void*', +# 'FILE*' => 'void*', +# 'QUnknownInterface*' => 'void*', +# 'GDHandle' => 'void*', +# '_NPStream*' => 'void*', +# 'QTextFormat*' => 'void*', +# 'QTextDocument*' => 'void*', +# 'QTextCursor*' => 'void*', +# 'QTextParag**' => 'void*', +# 'QTextParag*' => 'void*', +# 'QRemoteInterface*' => 'void*', +# 'QSqlRecordPrivate*' => 'void*', +# 'QTSMFI' => 'void*', # QTextStream's QTSManip +# 'const GUID&' => 'void*', +# 'QWidgetMapper*' => 'void*', +# 'MSG*' => 'void*', +# 'const QSqlFieldInfoList&' => 'void*', # QSqlRecordInfo - TODO (templates) + + 'QPtrCollection::Item' => 'void*', # to avoid a warning + + 'mode_t' => 'long', + 'QProcess::PID' => 'long', + 'size_type' => 'int', # QSqlRecordInfo + 'Qt::ComparisonFlags' => 'uint', + 'Qt::ToolBarDock' => 'int', # compat thing, Qt shouldn't use it + 'QIODevice::Offset' => 'ulong', + 'WState' => 'int', + 'WId' => 'ulong', + 'QRgb' => 'uint', + 'QCOORD' => 'int', + 'QTSMFI' => 'int', + 'Qt::WState' => 'int', + 'Qt::WFlags' => 'int', + 'Qt::HANDLE' => 'uint', + 'QEventLoop::ProcessEventsFlags' => 'uint', + 'QStyle::SCFlags' => 'int', + 'QStyle::SFlags' => 'int', + 'Q_INT16' => 'short', + 'Q_INT32' => 'int', + 'Q_INT8' => 'char', + 'Q_LONG' => 'long', + 'Q_UINT16' => 'ushort', + 'Q_UINT32' => 'uint', + 'Q_UINT8' => 'uchar', + 'Q_ULONG' => 'long', +); + +} + +sub writeDoc +{ + ( $libname, $rootnode, $outputdir, $opt ) = @_; + + print STDERR "Starting writeDoc for $libname...\n"; + + $debug = $main::debuggen; + + mkpath( $outputdir ) unless -f $outputdir; + + # Define QPtrCollection::Item, for resolveType + unless ( kdocAstUtil::findRef( $rootnode, "QPtrCollection::Item" ) ) { + my $cNode = kdocAstUtil::findRef( $rootnode, "QPtrCollection" ); + warn "QPtrCollection not found" if (!$cNode); + my $node = Ast::New( 'Item' ); + $node->AddProp( "NodeType", "Forward" ); + $node->AddProp( "Source", $cNode->{Source} ) if ($cNode); + kdocAstUtil::attachChild( $cNode, $node ) if ($cNode); + $node->AddProp( "Access", "public" ); + } + + print STDERR "Preparsing...\n"; + + # Preparse everything, to prepare some additional data in the classes and methods + Iter::LocalCompounds( $rootnode, sub { preParseClass( shift ); } ); + + # Have a look at each class again, to propagate CanBeCopied + Iter::LocalCompounds( $rootnode, sub { propagateCanBeCopied( shift ); } ); + + print STDERR "Writing smokedata.cpp...\n"; + + # Write out smokedata.cpp + writeSmokeDataFile($rootnode); + + print STDERR "Writing x_*.cpp...\n"; + + # Generate x_*cpp file for each class + + my $numclasses; + Iter::LocalCompounds( $rootnode, sub { $numclasses++ } ); + my $classperfile = int($numclasses/numSourceFiles); + print STDERR "Total number of classes: ". $numclasses ."\n" if $debug; + my $nodelist = []; + my $currentfile = 1; + my $currentclass = 1; + Iter::LocalCompounds( $rootnode, sub { + push @$nodelist, shift; + if(@$nodelist == $classperfile and $currentfile != numSourceFiles) + { + print STDERR "Calling writeClassDoc for ". (scalar @$nodelist) . " classes\n" if $debug; + writeClassDoc( $nodelist ); + $currentfile++; + $nodelist = [] + } + if(@$nodelist and $currentclass == $numclasses) + { + print STDERR "Calling writeClassDoc for remaining ". (scalar @$nodelist) . " classes\n" if $debug; + writeClassDoc( $nodelist ) + } + $currentclass++ + }); + + print STDERR "Done.\n"; +} + +=head2 preParseClass + Called for each class +=cut +sub preParseClass +{ + my( $classNode ) = @_; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + + if( $#{$classNode->{Kids}} < 0 || + $classNode->{Access} eq "private" || + $classNode->{Access} eq "protected" || # e.g. QPixmap::QPixmapData + exists $classNode->{Tmpl} || + # Don't generate standard bindings for QString, this class is handled as a native type + $className eq 'QString' || + $className eq 'QConstString' || + $className eq 'QCString' || + # Don't map classes which are really arrays + $className eq 'QStringList' || + $className eq 'QCanvasItemList' || + $className eq 'QWidgetList' || + $className eq 'QObjectList' || + $className eq 'QStrList' || + # Those are template related + $className eq 'QTSManip' || # cause compiler errors with several gcc versions + $className eq 'QGDict' || + $className eq 'QGList' || + $className eq 'QGVector' || + $className eq 'QStrIList' || + $className eq 'QStrIVec' || + $className eq 'QByteArray' || + $className eq 'QBitArray' || + $classNode->{NodeType} eq 'union' # Skip unions for now, e.g. QPDevCmdParam + ) { + print STDERR "Skipping $className\n" if ($debug); + print STDERR "Skipping union $className\n" if ( $classNode->{NodeType} eq 'union'); + $skippedClasses{$className} = 1; + delete $classNode->{Compound}; # Cheat, to get it excluded from Iter::LocalCompounds + return; + } + + my $signalCount = 0; + my $eventHandlerCount = 0; + my $defaultConstructor = 'none'; # none, public, protected or private. 'none' will become 'public'. + my $constructorCount = 0; # total count of _all_ ctors + # If there are ctors, we need at least one public/protected one to instanciate the class + my $hasPublicProtectedConstructor = 0; + # We need a public dtor to destroy the object --- ### aren't protected dtors ok too ?? + my $hasPublicDestructor = 1; # by default all classes have a public dtor! + #my $hasVirtualDestructor = 0; + my $hasDestructor = 0; + my $hasPrivatePureVirtual = 0; + my $hasCopyConstructor = 0; + my $hasPrivateCopyConstructor = 0; + # Note: no need for hasPureVirtuals. $classNode{Pure} has that. + + my $doPrivate = $main::doPrivate; + $main::doPrivate = 1; + # Look at each class member (looking for methods and enums in particular) + Iter::MembersByType ( $classNode, undef, + sub { + + my( $classNode, $m ) = @_; + my $name = $m->{astNodeName}; + + if( $m->{NodeType} eq "method" ) { + if ( $m->{ReturnType} eq 'typedef' # QFile's EncoderFn/DecoderFn callback, very badly parsed + ) { + $m->{NodeType} = 'deleted'; + next; + } + + print STDERR "preParseClass: looking at $className\::$name $m->{Params}\n" if ($debug); + + if ( $name eq $classNode->{astNodeName} ) { + if ( $m->{ReturnType} =~ /~/ ) { + # A destructor + $hasPublicDestructor = 0 if $m->{Access} ne 'public'; + #$hasVirtualDestructor = 1 if ( $m->{Flags} =~ "v" && $m->{Access} ne 'private' ); + $hasDestructor = 1; + } else { + # A constructor + $constructorCount++; + $defaultConstructor = $m->{Access} if ( $m->{Params} eq '' ); + $hasPublicProtectedConstructor = 1 if ( $m->{Access} ne 'private' ); + + # Copy constructor? + if ( $#{$m->{ParamList}} == 0 ) { + my $theArgType = @{$m->{ParamList}}[0]->{ArgType}; + if ($theArgType =~ /$className\s*\&/) { + $hasCopyConstructor = 1; + $hasPrivateCopyConstructor = 1 if ( $m->{Access} eq 'private' ); + } + } + # Hack the return type for constructors, since constructors return an object pointer + $m->{ReturnType} = $className."*"; + } + } + + if ( $name =~ /~$classNode->{astNodeName}/ && $m->{Access} ne "private" ) { # not used + $hasPublicDestructor = 0 if $m->{Access} ne 'public'; + #$hasVirtualDestructor = 1 if ( $m->{Flags} =~ "v" ); + $hasDestructor = 1; + } + + if ( $m->{Flags} =~ "p" && $m->{Access} =~ /private/ ) { + $hasPrivatePureVirtual = 1; # ouch, can't inherit from that one + } + + # All we want from private methods is to check for virtuals, nothing else + next if ( $m->{Access} =~ /private/ ); + + my $argId = 0; + my $firstDefaultParam; + foreach my $arg ( @{$m->{ParamList}} ) { + # Look for first param with a default value + if ( defined $arg->{DefaultValue} && !defined $firstDefaultParam ) { + $firstDefaultParam = $argId; + } + + if ( $arg->{ArgType} eq '...' # refuse a method with variable arguments + or $arg->{ArgType} eq 'image_io_handler' # QImage's callback + or $arg->{ArgType} eq 'DecoderFn' # QFile's callback + or $arg->{ArgType} eq 'EncoderFn' # QFile's callback + or $arg->{ArgType} =~ /bool \(\*\)\(QObject/ # QMetaObject's ctor + or $arg->{ArgType} eq 'QtStaticMetaObjectFunction' # QMetaObjectCleanUp's ctor with func pointer + or $arg->{ArgType} eq 'const QTextItem&' # ref to a private class in 3.2.0b1 + or $arg->{ArgType} eq 'FILE*' # won't be able to handle that I think + ) { + $m->{NodeType} = 'deleted'; + } + else + { + # Resolve type in full, e.g. for QSessionManager::RestartHint + # (x_QSessionManager doesn't inherit QSessionManager) + $arg->{ArgType} = kalyptusDataDict::resolveType($arg->{ArgType}, $classNode, $rootnode); + registerType( $arg->{ArgType} ); + $argId++; + } + } + $m->AddProp( "FirstDefaultParam", $firstDefaultParam ); + $m->{ReturnType} = kalyptusDataDict::resolveType($m->{ReturnType}, $classNode, $rootnode) if ($m->{ReturnType}); + registerType( $m->{ReturnType} ); + } + elsif( $m->{NodeType} eq "enum" ) { + my $fullEnumName = $className."::".$m->{astNodeName}; + $classNode->{enumerations}{$m->{astNodeName}} = $fullEnumName + if $m->{astNodeName} and $m->{Access} ne 'private'; + + # Define a type for this enum + registerType( $fullEnumName ); + + # Remember that it's an enum + findTypeEntry( $fullEnumName )->{isEnum} = 1; + + #print STDERR "$fullEnumName is an enum\n"; + } + elsif( $m->{NodeType} eq 'var' ) { + my $varType = $m->{Type}; + # We are interested in public static vars, like QColor::blue + if ( $varType =~ s/static\s+// && $m->{Access} ne 'private' ) + { + $varType =~ s/const\s+(.*)\s*&/$1/; + $varType =~ s/\s*$//; + print STDERR "var: $m->{astNodeName} '$varType'\n" if ($debug); + + # Register the type + registerType( $varType ); + + } else { + # To avoid duplicating the above test, we just get rid of any other var + $m->{NodeType} = 'deleted'; + } + } + }, + undef + ); + $main::doPrivate = $doPrivate; + + print STDERR "$className: ctor count: $constructorCount, hasPublicProtectedConstructor: $hasPublicProtectedConstructor, hasCopyConstructor: $hasCopyConstructor:, defaultConstructor: $defaultConstructor, hasPublicDestructor: $hasPublicDestructor, hasPrivatePureVirtual:$hasPrivatePureVirtual\n" if ($debug); + + my $isGlobalSpace = ($className eq $main::globalSpaceClassName); + + # Note that if the class has _no_ constructor, the default ctor applies. Let's even generate it. + if ( !$constructorCount && $defaultConstructor eq 'none' && !$hasPrivatePureVirtual && !$isGlobalSpace ) { + # Create a method node for the constructor + my $methodNode = Ast::New( $classNode->{astNodeName} ); + $methodNode->AddProp( "NodeType", "method" ); + $methodNode->AddProp( "Flags", "" ); + $methodNode->AddProp( "Params", "" ); + $methodNode->AddProp( "ParamList", [] ); + kdocAstUtil::attachChild( $classNode, $methodNode ); + + # Hack the return type for constructors, since constructors return an object pointer + $methodNode->AddProp( "ReturnType", $className."*" ); + registerType( $className."*" ); + $methodNode->AddProp( "Access", "public" ); # after attachChild + $defaultConstructor = 'public'; + $hasPublicProtectedConstructor = 1; + } + + # Also, if the class has no explicit destructor, generate a default one. + if ( !$hasDestructor && !$hasPrivatePureVirtual && !$isGlobalSpace ) { + my $methodNode = Ast::New( "$classNode->{astNodeName}" ); + $methodNode->AddProp( "NodeType", "method" ); + $methodNode->AddProp( "Flags", "" ); + $methodNode->AddProp( "Params", "" ); + $methodNode->AddProp( "ParamList", [] ); + kdocAstUtil::attachChild( $classNode, $methodNode ); + + $methodNode->AddProp( "ReturnType", "~" ); + $methodNode->AddProp( "Access", "public" ); + } + + # If we have a private pure virtual, then the class can't be instanciated (e.g. QCanvasItem) + # Same if the class has only private constructors (e.g. QInputDialog) + $classNode->AddProp( "CanBeInstanciated", $hasPublicProtectedConstructor && !$hasPrivatePureVirtual ); + + # We will derive from the class only if it has public or protected constructors. + # (_Even_ if it has pure virtuals. But in that case the x_ class can't be instantiated either.) + $classNode->AddProp( "BindingDerives", $hasPublicProtectedConstructor ); + + # We need a public dtor to destroy the object --- ### aren't protected dtors ok too ?? + $classNode->AddProp( "HasPublicDestructor", $hasPublicDestructor ); + + # Hack for QAsyncIO. We don't implement the "if a class has no explicit copy ctor, + # then all of its member variables must be copiable, otherwise the class isn't copiable". + $hasPrivateCopyConstructor = 1 if ( $className eq 'QAsyncIO' ); + + # Remember if this class can't be copied - it means all its descendants can't either + $classNode->AddProp( "CanBeCopied", !$hasPrivateCopyConstructor ); + $classNode->AddProp( "HasCopyConstructor", $hasCopyConstructor ); +} + + +sub propagateCanBeCopied($) +{ + my $classNode = shift; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + my @super = superclass_list($classNode); + # A class can only be copied if none of its ancestors have a private copy ctor. + for my $s (@super) { + if (!$s->{CanBeCopied}) { + $classNode->{CanBeCopied} = 0; + print STDERR "$classNode->{astNodeName} cannot be copied\n" if ($debug); + last; + } + } + # If the class has no explicit copy constructor, and it can be copied, + # generate the copy constructor. + if ( !$classNode->{HasCopyConstructor} && $classNode->{CanBeCopied} && $classNode->{CanBeInstanciated} ) { + my $methodNode = Ast::New( "$classNode->{astNodeName}" ); + $methodNode->AddProp( "NodeType", "method" ); + $methodNode->AddProp( "Flags", "" ); + my $argType = "const ".$className."&"; + registerType( $argType ); + $methodNode->AddProp( "Params", $argType ); + # The param node + my $node = Ast::New( 1 ); # let's make the arg index the node "name" + $node->AddProp( "NodeType", "param" ); + $node->AddProp( "ArgType", $argType ); + $methodNode->AddPropList( "ParamList", $node ); + kdocAstUtil::attachChild( $classNode, $methodNode ); + + # Hack the return type for constructors, since constructors return an object pointer + $methodNode->AddProp( "ReturnType", $className."*" ); + registerType( $className."*" ); + $methodNode->AddProp( "Access", "public" ); # after attachChild + } + + # Prepare the {case} dict for the class + prepareCaseDict( $classNode ); +} + +=head2 writeClassDoc + + Called by writeDoc for each series of classes to be written out + +=cut + +BEGIN { + +my $fhn =1; # static + + sub writeClassDoc + { + my $nodelist = shift; + my $file = "$outputdir/x_${fhn}.cpp"; + open( my $fh, ">$file" ) || die "Couldn't create $file\n"; + + print $fh "//Auto-generated by $0. DO NOT EDIT.\n"; + print $fh "#include <smoke.h>\n"; + print $fh "#include <${libname}_smoke.h>\n"; + + my @code; + for my $node ( @$nodelist ) + { + push @code, [generateAllMethods( $node )] + } + my %includes; + map { for my $incl (keys %{$_->[2]}){ $includes{$incl}++ } } @code; + + foreach my $incl (keys %includes) { + die if $incl eq ''; + print $fh "#include <$incl>\n"; + } + print $fh "\n"; + for my $c( 0..$#code ) + { + my ($methodCode, $switchCode, $incl) = @{ $code[$c] }; + my $node = $$nodelist[$c]; + my $className = join( "::", kdocAstUtil::heritage($node) ); + my $legacyClassName = join( "__", kdocAstUtil::heritage($node) ); + print $fh "class x_$legacyClassName "; + print $fh ": public $className " if $node->{BindingDerives}; + print $fh "{\n"; + print $fh $methodCode; + print $fh "};\n"; + if(keys %{$node->{enumerations}}) { + print $fh "void xenum_${legacyClassName}(Smoke::EnumOperation xop, Smoke::Index xtype, void *&xdata, long &xvalue) {\n"; + print $fh " x_${legacyClassName}\::xenum_operation(xop, xtype, xdata, xvalue);\n"; + print $fh "}\n"; + } + print $fh "void xcall_${legacyClassName}(Smoke::Index xi, void *obj, Smoke::Stack args) {\n"; + print $fh $switchCode; + print $fh "}\n\n"; + } + #if ( $className =~ /^(QBrush|QColor|QCursor|QFont|QImage|QPalette|QPixmap|QPoint|QPointArray|QRect|QRegion|QSize|QWMatrix)$/ ) { + # print XCPPFILE " const char *{serial} operator << () const : pig_serialize(\$this);\n"; + # print XCPPFILE " void operator >> (const char *{serial}) : pig_deserialize(\$this, \$1);\n"; + #} + + close $fh; + $fhn++ + } + +} + +# Generate the prototypes for a method (one per arg with a default value) +# Helper for makeprotos +sub iterproto($$$$$) { + my $classidx = shift; # to check if a class exists + my $method = shift; + my $proto = shift; + my $idx = shift; + my $protolist = shift; + + my $argcnt = scalar @{ $method->{ParamList} } - 1; + if($idx > $argcnt) { + push @$protolist, $proto; + return; + } + if(defined $method->{FirstDefaultParam} and $method->{FirstDefaultParam} <= $idx) { + push @$protolist, $proto; + } + + my $arg = $method->{ParamList}[$idx]->{ArgType}; + + my $typeEntry = findTypeEntry( $arg ); + my $realType = $typeEntry->{realType}; + + # A scalar ? + $arg =~ s/\bconst\b//g; + $arg =~ s/\s+//g; + if($typeEntry->{isEnum} || $allTypes{$realType}{isEnum} || exists $typeunion{$realType} || exists $mungedTypeMap{$arg}) + { + my $id = '$'; # a 'scalar + $id = '?' if $arg =~ /[*&]{2}/; + $id = $mungedTypeMap{$arg} if exists $mungedTypeMap{$arg}; + iterproto($classidx, $method, $proto . $id, $idx + 1, $protolist); + return; + } + + # A class ? + if(exists $classidx->{$realType}) { + iterproto($classidx, $method, $proto . '#', $idx + 1, $protolist); + return; + } + + # A non-scalar (reference to array or hash, undef) + iterproto($classidx, $method, $proto . '?', $idx + 1, $protolist); + return; +} + +# Generate the prototypes for a method (one per arg with a default value) +sub makeprotos($$$) { + my $classidx = shift; + my $method = shift; + my $protolist = shift; + iterproto($classidx, $method, $method->{astNodeName}, 0, $protolist); +} + +# Return the string containing the signature for this method (without return type). +# If the 2nd arg is not the size of $m->{ParamList}, this method returns a +# partial signature (this is used to handle default values). +sub methodSignature($$) { + my $method = shift; + my $last = shift; + my $sig = $method->{astNodeName}; + my @argTypeList; + my $argId = 0; + foreach my $arg ( @{$method->{ParamList}} ) { + last if $argId > $last; + push @argTypeList, $arg->{ArgType}; + $argId++; + } + $sig .= "(". join(", ",@argTypeList) .")"; + $sig .= " const" if $method->{Flags} =~ "c"; + return $sig; +} + +sub coerce_type($$$$) { + #my $m = shift; + my $union = shift; + my $var = shift; + my $type = shift; + my $new = shift; # 1 if this is a return value, 0 for a normal param + + my $typeEntry = findTypeEntry( $type ); + my $realType = $typeEntry->{realType}; + + my $unionfield = $typeEntry->{typeId}; + die "$type" unless defined( $unionfield ); + $unionfield =~ s/t_/s_/; + + $type =~ s/\s+const$//; # for 'char* const' + $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*' + + my $code = "$union.$unionfield = "; + if($type =~ /&$/) { + $code .= "(void*)&$var;\n"; + } elsif($type =~ /\*$/) { + $code .= "(void*)$var;\n"; + } else { + if ( $unionfield eq 's_class' + or ( $unionfield eq 's_voidp' and $type ne 'void*' ) + or $type eq 'QString' ) { # hack + $type =~ s/^const\s+//; + if($new) { + $code .= "(void*)new $type($var);\n"; + } else { + $code .= "(void*)&$var;\n"; + } + } else { + $code .= "$var;\n"; + } + } + + return $code; +} + +# Generate the list of args casted to their real type, e.g. +# (QObject*)x[1].s_class,(QEvent*)x[2].s_class,x[3].s_int +sub makeCastedArgList +{ + my @castedList; + my $i = 1; # The args start at x[1]. x[0] is the return value + my $arg; + foreach $arg (@_) { + my $type = $arg; + my $cast; + + my $typeEntry = findTypeEntry( $type ); + my $unionfield = $typeEntry->{typeId}; + die "$type" unless defined( $unionfield ); + $unionfield =~ s/t_/s_/; + + $type =~ s/\s+const$//; # for 'char* const' + $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*' + + my $v .= "x[$i].$unionfield"; + if($type =~ s/&$//) { + $cast = "*($type *)"; + } elsif($type =~ /\*$/) { + $cast = "($type)"; + } elsif($type =~ /\(\*\)\s*\(/) { # function pointer ... (*)(...) + $cast = "($type)"; + } else { + if ( $unionfield eq 's_class' + or ( $unionfield eq 's_voidp' and $type ne 'void*' ) + or $type eq 'QString' ) { # hack + $cast = "*($type *)"; + } else { + $cast = "($type)"; + } + } + push @castedList, "$cast$v"; + $i++; + } + return @castedList; +} + +# Adds the header for node $1 to be included in $2 if not already there +# Prints out debug stuff if $3 +sub addIncludeForClass($$$) +{ + my ( $node, $addInclude, $debugMe ) = @_; + my $sourcename = $node->{Source}->{astNodeName}; + $sourcename =~ s!.*/(.*)!$1!m; + die "Empty source name for $node->{astNodeName}" if ( $sourcename eq '' ); + unless ( defined $addInclude->{$sourcename} ) { + print " Including $sourcename\n" if ($debugMe); + $addInclude->{$sourcename} = 1; + } + else { print " $sourcename already included.\n" if ($debugMe); } +} + +sub checkIncludesForObject($$) +{ + my $type = shift; + my $addInclude = shift; + + my $debugCI = 0; #$debug + #print "checkIncludesForObject $type\n"; + $type =~ s/const\s+//; + my $it = $type; + if (!($it and exists $typeunion{$it}) and $type !~ /\*/ + #and $type !~ /&/ # in fact we also want refs, due to the generated code + ) { + $type =~ s/&//; + print " Detecting an object by value/ref: $type\n" if ($debugCI); + my $node = kdocAstUtil::findRef( $rootnode, $type ); + if ($node) { + addIncludeForClass( $node, $addInclude, $debugCI ); + } + else { print " No header found for $type\n" if ($debugCI); } + } +} + +sub generateVirtualMethod($$$$$) +{ + # Generating methods for $class. + # $m: method node. $methodClass: the node of the class in which the method is really declared + # (can be different from $class when the method comes from a super class) + # This is important because of $allMethods, which has no entry for class::method in that case. + + my( $classNode, $signature, $m, $methodClass, $addInclude ) = @_; + my $methodCode = ''; # output + my $returnType = $m->{ReturnType}; + return ('', '') if $returnType eq '~'; # skip destructors + + my $className = $classNode->{astNodeName}; + my $flags = $m->{Flags}; + my @argList = @{$m->{ParamList}}; + + print "generateVirtualMethod $className: $signature ($m->{Access})\n" if ($debug); + + # Detect objects returned by value + checkIncludesForObject( $returnType, $addInclude ) if ($returnType ne 'void'); + + # Generate a matching virtual method in the x_ class + $methodCode .= " virtual $returnType $m->{astNodeName}("; + my $i = 0; + foreach my $arg ( @argList ) { + $methodCode .= ", " if $i++; + $methodCode .= $arg->{ArgType}; + $methodCode .= " x$i"; + + # Detect objects passed by value + checkIncludesForObject( $arg->{ArgType}, $addInclude ); + } + $methodCode .= ") "; + $methodCode .= "const " if ($flags =~ "c"); + $methodCode .= "\{\n"; + + # Now the code of the method + my $this = $classNode->{BindingDerives} > 0 ? "this" : "xthis"; + + $i++; # Now the number of args + $methodCode .= "\tSmoke::StackItem x[$i];\n"; + $i = 1; + for my $arg (@argList) { + $methodCode .= "\t"; + $methodCode .= coerce_type("x[$i]", "x$i", $arg->{ArgType}, 0); + $i++; + } + + my $sig = $methodClass->{astNodeName} . "::" . $signature; + my $idx = $allMethods{$sig}; + die "generateVirtualMethod: $className: No method found for $sig\n" if !defined $idx; + if($flags =~ "p") { # pure virtual + $methodCode .= "\t${libname}_Smoke->binding->callMethod($idx, (void*)$this, x, true /*pure virtual*/);\n"; + } else { + $methodCode .= "\tif(${libname}_Smoke->binding->callMethod($idx, (void*)$this, x)) "; + } + + $returnType = undef if ($returnType eq 'void'); + if($returnType) { + my $arg = $returnType; + my $it = $arg; + my $cast; + my $v = "x[0]"; + my $indent = ($flags =~ "p") ? "\t" : ""; + if($it and exists $typeunion{$it}) { + $v .= ".$typeunion{$it}"; + $cast = "($arg)"; + $methodCode .= "${indent}return $cast$v;\n"; + } else { + $v .= ".s_class"; + if($arg =~ s/&//) { + $cast = "*($arg *)"; + $methodCode .= "${indent}return $cast$v;\n"; + } elsif($arg !~ /\*/) { + unless($flags =~ "p") { + $indent = "\t "; + $methodCode .= "{\n"; + } + # we assume it's a new thing, and handle it + $methodCode .= "${indent}$arg *xptr = ($arg *)$v;\n"; + $methodCode .= "${indent}$arg xret(*xptr);\n"; + $methodCode .= "${indent}delete xptr;\n"; + $methodCode .= "${indent}return xret;\n"; + $methodCode .= "\t}\n" unless $flags =~ "p"; + } else { + $cast = "($arg)"; + $methodCode .= "${indent}return $cast$v;\n"; + } + } + } else { + $methodCode .= "\t" if $flags =~ "p"; + $methodCode .= "return;\n"; + } + if($flags =~ "p") { + $methodCode .= "\t// ABSTRACT\n"; + $methodCode .= " }\n"; + return ( $methodCode ); + } + $methodCode .= "\t"; + if($returnType) { + $methodCode .= "return "; + } + $methodCode .= "$this\->$methodClass->{astNodeName}\::$m->{astNodeName}("; + $i = 0; + for my $arg (@argList) { + $methodCode .= ", " if $i++; + $methodCode .= "x$i"; + } + $methodCode .= ");\n"; + $methodCode .= " }\n"; + return ( $methodCode ); +} + +sub generateMethod($$$) +{ + my( $classNode, $m, $addInclude ) = @_; # input + my $methodCode = ''; # output + my $switchCode = ''; # output + + my $name = $m->{astNodeName}; # method name + my @heritage = kdocAstUtil::heritage($classNode); + my $className = join( "::", @heritage ); + my $xClassName = "x_" . join( "__", @heritage ); + + # Check some method flags: constructor, destructor etc. + my $flags = $m->{Flags}; + + if ( !defined $flags ) { + warn "Method ".$name. " has no flags\n"; + } + + my $returnType = $m->{ReturnType}; + $returnType = undef if ($returnType eq 'void'); + + # Don't use $className here, it's never the fully qualified (A::B) name for a ctor. + my $isConstructor = ($name eq $classNode->{astNodeName} ); + my $isDestructor = ($returnType eq '~'); + + if ($debug) { + print STDERR " Method $name"; + print STDERR ", is DTOR" if $isDestructor; + print STDERR ", returns $returnType" if $returnType; + #print STDERR " ($m->{Access})"; + print STDERR "\n"; + } + + # Don't generate anything for destructors + return if $isDestructor; + + return if ( $m->{SkipFromSwitch} ); # pure virtuals, etc. + +# # Skip internal methods, which return unknown types +# # Hmm, the C# bindings have a list of those too. +# return if ( $returnType =~ m/QGfx\s*\*/ ); +# return if ( $returnType eq 'CGContextRef' ); +# return if ( $returnType eq 'QWSDisplay *' ); +# # This stuff needs callback, or ** +# return if ( $name eq 'defineIOHandler' or $name eq 'qt_init_internal' ); +# # Skip casting operators, but not == < etc. +# return if ( $name =~ /operator \w+/ ); +# # QFile's EncoderFn/DecoderFn +# return if ( $name =~ /set[ED][ne]codingFunction/ ); +# # How to implement this? (QXmlDefaultHandler/QXmlEntityResolver::resolveEntity, needs A*&) +# return if ( $name eq 'resolveEntity' and $className =~ /^QXml/ ); +# return if ( $className eq 'QBitArray' && $m->{Access} eq 'protected' ); + + #print STDERR "Tests passed, generating.\n"; + + # Detect objects returned by value + checkIncludesForObject( $returnType, $addInclude ) if ($returnType); + + my $argId = 0; + + my @argTypeList=(); + + foreach my $arg ( @{$m->{ParamList}} ) { + + print STDERR " Param ".$arg->{astNodeName}." type: ".$arg->{ArgType}." name:".$arg->{ArgName}." default: ".$arg->{DefaultValue}."\n" if ($debug); + + my $argType = $arg->{ArgType}; + push @argTypeList, $argType; + + # Detect objects passed by value + checkIncludesForObject( $argType, $addInclude ); + } + + my @castedArgList = makeCastedArgList( @argTypeList ); + + my $isStatic = $flags =~ "s"; + + my $extra = ""; + $extra .= "static " if $isStatic || $isConstructor; + + my $attr = ""; + $attr .= "const " if $flags =~ "c"; + + my $this = $classNode->{BindingDerives} > 0 ? "this" : "xthis"; + + # We iterate as many times as we have default params + my $firstDefaultParam = $m->{FirstDefaultParam}; + $firstDefaultParam = scalar(@argTypeList) unless defined $firstDefaultParam; + my $iterationCount = scalar(@argTypeList) - $firstDefaultParam; + + my $xretCode = ''; + if($returnType) { + $xretCode .= coerce_type('x[0]', 'xret', $returnType, 1); + } + + print STDERR " ". ($iterationCount+1). " iterations for $name\n" if ($debug); + + while($iterationCount >= 0) { + + local($") = ","; + # Handle case of a class with constructors, but with a private pure virtual + # so we can't create an instance of it + if($isConstructor and !$classNode->{CanBeInstanciated}) { + + # We still generate "forwarder constructors" for x_className though + $methodCode .= " $xClassName("; + my $i = 0; + for my $arg (@argTypeList) { + $methodCode .= ", " if $i++; + $methodCode .= "$arg x$i"; + } + $methodCode .= ") : $className("; + $i = 0; + for my $arg (@argTypeList) { + $methodCode .= ", " if $i++; + $methodCode .= "x$i"; + } + $methodCode .= ") {}\n"; + + } else { + + $switchCode .= "\tcase $methodNumber: "; + if ($flags =~ "s" || $isConstructor) { # static or constructor + $switchCode .= "$xClassName\::"; + } else { + $switchCode .= "xself->" + } + $switchCode .= "x_$methodNumber(args);"; + $switchCode .= "\tbreak;\n"; + + $methodCode .= " ${extra}void x_$methodNumber\(Smoke::Stack x) $attr\{\n"; + my $cplusplusparams = join( ", ", @argTypeList ); + $methodCode .= "\t// $name($cplusplusparams)\n"; + $methodCode .= "\t"; + + if ($isConstructor) { + + $methodCode .= "$xClassName* xret = new $xClassName(@castedArgList[0..$#argTypeList]);\n"; + #$m->{retnew} = 1; + $methodCode .= "\tx[0].s_class = (void*)xret;\n"; # the return value, containing the new object + $methodCode .= " }\n"; + + # Now generate the actual constructor for x_className + # (Simply a forwarder to the className constructor with the same args + $methodCode .= " $xClassName("; + my $i = 0; + for my $arg (@argTypeList) { + $methodCode .= ", " if $i++; + if ($arg =~ s/\(\*\)/(* x$i)/) { # function pointer... need to insert argname inside + $methodCode .= $arg; + } else { + $methodCode .= "$arg x$i"; + } + } + $methodCode .= ") : $className("; + $i = 0; + for my $arg (@argTypeList) { + $methodCode .= ", " if $i++; + $methodCode .= "x$i"; + } + $methodCode .= ") {\n"; + + } else { + $methodCode .= $returnType . " xret = " if $returnType; + $methodCode .= "$this\->" unless $isStatic; + if ($className ne $main::globalSpaceClassName) { + $methodCode .= "$className\::$name(@castedArgList[0..$#argTypeList]);\n"; + } elsif ($name =~ /^operator\s?\W+/) { + ( my $op = $name ) =~ s/^operator(.*)$/$1/; + if (scalar(@argTypeList) == 2) { + $methodCode .= "(@castedArgList[0] $op @castedArgList[1]);\n"; # a + b + } elsif (scalar(@argTypeList) == 1) { + $methodCode .= "($op@castedArgList[0]);\n"; # -a + } else { + die "shouldn't reach here!"; + } + } else { + $methodCode .= "$name(@castedArgList[0..$#argTypeList]);\n"; + } + $methodCode .= "\t" . $xretCode if $returnType; + # To avoid unused parameter warning, add this to void methods: + $methodCode .= "\t(void)x; // noop (for compiler warning)\n" unless $returnType; + } + $methodCode .= " }\n"; + } + + #} else { + # if ( $m->{Access} =~ /slots/ ) { + # print PIGSOURCE "$extra$returnType $name(", $cplusplusparams, ") slot;\n", + # } elsif ( $m->{Access} =~ /signals/ ) { + # print PIGSOURCE "$extra$returnType $name(", $cplusplusparams, ") signal;\n", + # } elsif ( $name =~ /operator(.*)/ ) { + # if ( $argId == 2 ) { + # print PIGSOURCE "$extra$returnType operator $1 (", $cplusplusparams, ") : operator $1 (\$0, \$1);\n", + # } else { + # print PIGSOURCE "$extra$returnType operator $1 (", $cplusplusparams, ")", ($m->{Flags} =~ "c" ? " const" : ""), ";\n", + # } + # } else { + # print PIGSOURCE "$extra$returnType $name(", $cplusplusparams, ")", ($m->{Flags} =~ "c" ? " const" : ""), ";\n", + # } + #} + + pop @argTypeList; + $methodNumber++; + $iterationCount--; + } # Iteration loop + + return ( $methodCode, $switchCode ); +} + + +sub generateEnum($$) +{ + my( $classNode, $m ) = @_; # input + my $methodCode = ''; # output + my $switchCode = ''; # output + + my @heritage = kdocAstUtil::heritage($classNode); + my $className = join( "::", @heritage ); + my $xClassName = "x_" . join( "__", @heritage ); + + foreach my $enum ( @{$m->{ParamList}} ) { + my $enumName = $enum->{ArgName}; + my $fullEnumName = "$className\::$enumName"; + + die "Invalid index for $fullEnumName: $classNode->{case}{$fullEnumName} instead of $methodNumber" if $classNode->{case}{$fullEnumName} != $methodNumber; + $methodCode .= " static void x_$methodNumber(Smoke::Stack x) {\n"; + $methodCode .= "\tx[0].s_enum = (long)$fullEnumName;\n"; + $methodCode .= " }\n"; + $switchCode .= "\tcase $methodNumber: $xClassName\::x_$methodNumber(args);\tbreak;\n"; + $methodNumber++; + } + + return ( $methodCode, $switchCode ); +} + +sub generateVar($$$) +{ + my( $classNode, $m, $addInclude ) = @_; # input + my $methodCode = ''; # output + my $switchCode = ''; # output + + my @heritage = kdocAstUtil::heritage($classNode); + my $className = join( "::", @heritage ); + my $xClassName = "x_" . join( "__", @heritage ); + + my $name = $m->{astNodeName}; + my $varType = $m->{Type}; + $varType =~ s/static\s//; + $varType =~ s/const\s+(.*)\s*&/$1/; + $varType =~ s/\s*$//; + my $fullName = "$className\::$name"; + + checkIncludesForObject( $varType, $addInclude ); + + die "Invalid index for $fullName: $classNode->{case}{$fullName} instead of $methodNumber" if $classNode->{case}{$fullName} != $methodNumber; + $methodCode .= " static void x_$methodNumber(Smoke::Stack x) {\n"; + $methodCode .= "\tx[0].s_class = (void*)new $varType($fullName);\n"; + $methodCode .= " }\n"; + $switchCode .= "\tcase $methodNumber: $xClassName\::x_$methodNumber(args);\tbreak;\n"; + $methodNumber++; + + return ( $methodCode, $switchCode ); +} + +sub generateEnumCast($) +{ + my( $classNode ) = @_; + my $methodCode = ''; + return unless keys %{$classNode->{enumerations}}; + $methodCode .= " static void xenum_operation(Smoke::EnumOperation xop, Smoke::Index xtype, void *&xdata, long &xvalue) {\n"; + $methodCode .= "\tswitch(xtype) {\n"; + for my $enum (values %{$classNode->{enumerations}}) { + my $type = findTypeEntry($enum); + $methodCode .= "\t case $type->{index}: //$enum\n"; + $methodCode .= "\t switch(xop) {\n"; + $methodCode .= "\t case Smoke::EnumNew:\n"; + $methodCode .= "\t\txdata = (void*)new $enum;\n"; + $methodCode .= "\t\tbreak;\n"; + $methodCode .= "\t case Smoke::EnumDelete:\n"; # unnecessary + $methodCode .= "\t\tdelete ($enum*)xdata;\n"; + $methodCode .= "\t\tbreak;\n"; + $methodCode .= "\t case Smoke::EnumFromLong:\n"; + $methodCode .= "\t\t*($enum*)xdata = ($enum)xvalue;\n"; + $methodCode .= "\t\tbreak;\n"; + $methodCode .= "\t case Smoke::EnumToLong:\n"; + $methodCode .= "\t\txvalue = (long)*($enum*)xdata;\n"; + $methodCode .= "\t\tbreak;\n"; + $methodCode .= "\t }\n"; + $methodCode .= "\t break;\n"; + } + $methodCode .= "\t}\n"; + $methodCode .= " }\n"; + + return $methodCode; +} + +## Called by writeClassDoc +sub generateAllMethods +{ + my ($classNode) = @_; + my $methodCode = ''; + my $switchCode = ''; + $methodNumber = 0; + + #my $className = $classNode->{astNodeName}; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + my $xClassName = "x_" . join( "__", kdocAstUtil::heritage($classNode) ); + my $isGlobalSpace = ($xClassName eq ("x_".$main::globalSpaceClassName)); + my $sourcename = $classNode->{Source}->{astNodeName}; + + $sourcename =~ s!.*/(.*)!$1!m; + die "Empty source name for $classNode->{astNodeName}" if ( $sourcename eq '' ); + + my %addInclude = ( $sourcename => 1 ); + + if (!$isGlobalSpace) { + if(! $classNode->{BindingDerives}) { + $methodCode .= "private:\n"; + $methodCode .= " $className *xthis;\n"; + $methodCode .= "public:\n"; + $methodCode .= " $xClassName\(void *x) : xthis(($className*)x) {}\n"; + $switchCode .= " $xClassName xtmp(obj), *xself = &xtmp;\n"; + } else { + $switchCode .= " $xClassName *xself = ($xClassName*)obj;\n"; + $methodCode .= "public:\n"; + } + } else { + my $s; + for my $sn( @{$classNode->{Sources}} ) { + ($s = $sn->{astNodeName}) =~ s!.*/(.*)!$1!m; + $addInclude{ $s } = 1; + } + $methodCode .= "public:\n"; + $switchCode .= " (void) obj;\n"; + } + $switchCode .= " switch(xi) {\n"; + + # Do all enums first + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $methodNode ) = @_; + + if ( $methodNode->{NodeType} eq 'enum' ) { + my ($meth, $swit) = generateEnum( $classNode, $methodNode ); + $methodCode .= $meth; + $switchCode .= $swit; + } + }, undef ); + + # Then all static vars + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $methodNode ) = @_; + + if ( $methodNode->{NodeType} eq 'var' ) { + my ($meth, $swit) = generateVar( $classNode, $methodNode, \%addInclude ); + $methodCode .= $meth; + $switchCode .= $swit; + } + }, undef ); + + # Then all methods + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $methodNode ) = @_; + + if ( $methodNode->{NodeType} eq 'method' ) { + my ($meth, $swit) = generateMethod( $classNode, $methodNode, \%addInclude ); + $methodCode .= $meth; + $switchCode .= $swit; + } + }, undef ); + + # Virtual methods + if ($classNode->{BindingDerives}) { + my %virtualMethods; + allVirtualMethods( $classNode, \%virtualMethods ); + + for my $sig (sort keys %virtualMethods) { + my ($meth) = generateVirtualMethod( $classNode, $sig, $virtualMethods{$sig}{method}, $virtualMethods{$sig}{class}, \%addInclude ); + $methodCode .= $meth; + } + } + + $methodCode .= generateEnumCast( $classNode ); + + # Destructor + # "virtual" is useless, if the base class has a virtual destructor then the x_* class too. + #if($classNode->{HasVirtualDestructor} and $classNode->{HasDestructor}) { + # $methodCode .= " virtual ~$xClassName() {}\n"; + #} + # We generate a dtor though, because we might want to add stuff into it + if ( !$isGlobalSpace ) { + $methodCode .= " ~$xClassName() { ${libname}_Smoke->binding->deleted($classNode->{ClassIndex}, (void*)this); }\n"; + } + + if ($classNode->{CanBeInstanciated} and $classNode->{HasPublicDestructor}) { + die "$className destructor: methodNumber=$methodNumber != case entry=".$classNode->{case}{"~$className()"}."\n" + if $methodNumber != $classNode->{case}{"~$className()"}; + $switchCode .= "\tcase $methodNumber: delete ($className*)xself;\tbreak;\n"; + $methodNumber++; + } + + $switchCode .= " }\n"; + return ( $methodCode, $switchCode, \%addInclude ); +} + +# Return 0 if the class has no virtual dtor, 1 if it has, 2 if it's private +sub hasVirtualDestructor($) +{ + my ( $classNode ) = @_; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + return if ( $skippedClasses{$className} ); + + my $parentHasIt; + # Look at ancestors, and (recursively) call hasVirtualDestructor for each + # It's enough to have one parent with a prot/public virtual dtor + Iter::Ancestors( $classNode, $rootnode, undef, undef, sub { + my $vd = hasVirtualDestructor( $_[0] ); + $parentHasIt = $vd unless $parentHasIt > $vd; + } ); + return $parentHasIt if $parentHasIt; # 1 or 2 + + # Now look in $classNode - including private methods + my $doPrivate = $main::doPrivate; + $main::doPrivate = 1; + my $result; + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + return unless( $m->{NodeType} eq "method" && $m->{ReturnType} eq '~' ); + + if ( $m->{Flags} =~ /[vp]/ ) { + if ( $m->{Access} =~ /private/ ) { + $result=2; # private virtual + } else { + $result=1; # [protected or public] virtual + } + } + }, + undef + ); + $main::doPrivate = $doPrivate; + $result=0 if (!defined $result); + return $result; +} + +=head2 allVirtualMethods + + Parameters: class node, dict + + Adds to the dict, for all method nodes that are virtual, in this class and in parent classes : + {method} the method node, {class} the class node (the one where the virtual is implemented) + +=cut + +sub allVirtualMethods($$) +{ + my ( $classNode, $virtualMethods ) = @_; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + return if ( $skippedClasses{$className} ); + + # Look at ancestors, and (recursively) call allVirtualMethods for each + # This is done first, so that virtual methods that are reimplemented as 'private' + # can be removed from the list afterwards (below) + Iter::Ancestors( $classNode, $rootnode, undef, undef, sub { + allVirtualMethods( @_[0], $virtualMethods ); + }, undef + ); + + # Now look for virtual methods in $classNode - including private ones + my $doPrivate = $main::doPrivate; + $main::doPrivate = 1; + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + # Only interested in methods, and skip destructors + return unless( $m->{NodeType} eq "method" && $m->{ReturnType} ne '~' ); + + my $signature = methodSignature( $m, $#{$m->{ParamList}} ); + print STDERR $signature . " ($m->{Access})\n" if ($debug); + + # A method is virtual if marked as such (v=virtual p=pure virtual) + # or if a parent method with same signature was virtual + if ( $m->{Flags} =~ /[vp]/ or defined $virtualMethods->{$signature} ) { + if ( $m->{Access} =~ /private/ ) { + if ( defined $virtualMethods->{$signature} ) { # remove previously defined + delete $virtualMethods->{$signature}; + } + # else, nothing, just ignore private virtual method + } else { + $virtualMethods->{$signature}{method} = $m; + $virtualMethods->{$signature}{class} = $classNode; + } + } + }, + undef + ); + $main::doPrivate = $doPrivate; +} + +# Known typedef? If so, apply it. +sub applyTypeDef($) +{ + my $type = shift; + # Parse 'const' in front of it, and '*' or '&' after it + my $prefix = $type =~ s/^const\s+// ? 'const ' : ''; + my $suffix = $type =~ s/\s*([\&\*]+)$// ? $1 : ''; + + if (exists $typedeflist{$type}) { + return $prefix.$typedeflist{$type}.$suffix; + } + return $prefix.$type.$suffix; +} + +# Register type ($1) into %allTypes if not already there +sub registerType($$) { + my $type = shift; + #print "registerType: $type\n" if ($debug); + + $type =~ s/\s+const$//; # for 'char* const' + $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*' + + return if ( $type eq 'void' or $type eq '' or $type eq '~' ); + die if ( $type eq '...' ); # ouch + + # Let's register the real type, not its known equivalent + #$type = applyTypeDef($type); + + # Enum _value_ -> get corresponding type + if (exists $enumValueToType{$type}) { + $type = $enumValueToType{$type}; + } + + # Already in allTypes + if(exists $allTypes{$type}) { + return; + } + + die if $type eq 'QTextEdit::UndoRedoInfo::Type'; + die if $type eq ''; + + my $realType = $type; + + # Look for references (&) and pointers (* or **) - this will not handle *& correctly. + # We do this parsing here because both the type list and iterproto need it + if($realType =~ s/&$//) { + $allTypes{$type}{typeFlags} = 'Smoke::tf_ref'; + } + elsif($realType ne 'void*' && $realType =~ s/\*$//) { + $allTypes{$type}{typeFlags} = 'Smoke::tf_ptr'; + } + else { + $allTypes{$type}{typeFlags} = 'Smoke::tf_stack'; + } + + if ( $realType =~ s/^const\s+// ) { # Remove 'const' + $allTypes{$type}{typeFlags} .= ' | Smoke::tf_const'; + } + + # Apply typedefs, and store the resulting type. + # For instance, if $type was Q_UINT16&, realType will be ushort + $allTypes{$type}{realType} = applyTypeDef( $realType ); + + # In the first phase we only create entries into allTypes. + # The values (indexes) are calculated afterwards, once the list is full. + $allTypes{$type}{index} = -1; + #print STDERR "Register $type. Realtype: $realType\n" if($debug); +} + +# Get type from %allTypes +# This returns a hash with {index}, {isEnum}, {typeFlags}, {realType} +# (and {typeId} after the types array is written by writeSmokeDataFile) +sub findTypeEntry($) { + my $type = shift; + my $typeIndex = -1; + $type =~ s/\s+const$//; # for 'char* const' + $type =~ s/\s+const\s*\*$/\*/; # for 'char* const*' + + return undef if ( $type =~ '~' or $type eq 'void' or $type eq '' ); + + # Enum _value_ -> get corresponding type + if (exists $enumValueToType{$type}) { + $type = $enumValueToType{$type}; + } + + die "type not known: $type" unless defined $allTypes{$type}; + return $allTypes{ $type }; +} + +# List of all super-classes for a given class +sub superclass_list($) +{ + my $classNode = shift; + my @super; + Iter::Ancestors( $classNode, $rootnode, undef, undef, sub { + push @super, @_[0]; + push @super, superclass_list( @_[0] ); + }, undef ); + return @super; +} + +# Store the {case} dict in the class Node (method signature -> index in the "case" switch) +# This also determines which methods should NOT be in the switch, and sets {SkipFromSwitch} for them +sub prepareCaseDict($) { + + my $classNode = shift; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + $classNode->AddProp("case", {}); + my $methodNumber = 0; + + # First look at all enums for this class + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + + next unless $m->{NodeType} eq 'enum'; + foreach my $val ( @{$m->{ParamList}} ) { + my $fullEnumName = "$className\::".$val->{ArgName}; + print STDERR "Enum: $fullEnumName -> case $methodNumber\n" if ($debug); + $classNode->{case}{$fullEnumName} = $methodNumber; + $enumValueToType{$fullEnumName} = "$className\::$m->{astNodeName}"; + $methodNumber++; + } + }, undef ); + + # Check for static vars + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + + next unless $m->{NodeType} eq 'var'; + my $name = "$className\::".$m->{astNodeName}; + print STDERR "Var: $name -> case $methodNumber\n" if ($debug); + $classNode->{case}{$name} = $methodNumber; + $methodNumber++; + + }, undef ); + + + # Now look at all methods for this class + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + + next unless $m->{NodeType} eq 'method'; + my $name = $m->{astNodeName}; + my $isConstructor = ($name eq $classNode->{astNodeName} ); + if ($isConstructor and ($m->{ReturnType} eq '~')) # destructor + { + # Remember whether we'll generate a switch entry for the destructor + $m->{SkipFromSwitch} = 1 unless ($classNode->{CanBeInstanciated} and $classNode->{HasPublicDestructor}); + next; + } + + # Don't generate bindings for protected methods (incl. signals) if + # we're not deriving from the C++ class. Only take public and public_slots + my $ok = ( $classNode->{BindingDerives} or $m->{Access} =~ /public/ ) ? 1 : 0; + + # Don't generate bindings for pure virtuals - we can't call them ;) + $ok = 0 if ( $ok && $m->{Flags} =~ "p" ); + + # Bugfix for Qt-3.0.4: those methods are NOT implemented (report sent). + $ok = 0 if ( $ok && $className eq 'QLineEdit' && ( $name eq 'setPasswordChar' || $name eq 'passwordChar' ) ); + $ok = 0 if ( $ok && $className eq 'QWidgetItem' && $name eq 'widgetSizeHint' ); + + if ( !$ok ) + { + #print STDERR "Skipping $className\::$name\n" if ($debug); + $m->{SkipFromSwitch} = 1; + next; + } + + my @args = @{ $m->{ParamList} }; + my $last = $m->{FirstDefaultParam}; + $last = scalar @args unless defined $last; + my $iterationCount = scalar(@args) - $last; + while($iterationCount >= 0) { + my $sig = methodSignature( $m, $#args ); + $classNode->{case}{$sig} = $methodNumber; + #print STDERR "prepareCaseDict: registered case number $methodNumber for $sig in $className()\n" if ($debug); + pop @args; + $iterationCount--; + $methodNumber++; + } + }, undef ); + + # Add the destructor, at the end + if ($classNode->{CanBeInstanciated} and $classNode->{HasPublicDestructor}) { + $classNode->{case}{"~$className()"} = $methodNumber; + # workaround for ~Sub::Class() being seen as Sub::~Class() + $classNode->{case}{"~$classNode->{astNodeName}()"} = $methodNumber; + #print STDERR "prepareCaseDict: registered case number $methodNumber for ~$className()\n" if ($debug); + } +} + +=head2 + Write out the smokedata.cpp file containing all the arrays. +=cut + +sub writeSmokeDataFile($) { + my $rootnode = shift; + + # Make list of classes + my %allIncludes; # list of all header files for all classes + my @classlist; + push @classlist, ""; # Prepend empty item for "no class" + my %enumclasslist; + Iter::LocalCompounds( $rootnode, sub { + my $classNode = $_[0]; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + push @classlist, $className; + $enumclasslist{$className}++ if keys %{$classNode->{enumerations}}; + $classNode->{ClassIndex} = $#classlist; + addIncludeForClass( $classNode, \%allIncludes, undef ); + } ); + + my %classidx = do { my $i = 0; map { $_ => $i++ } @classlist }; + + my $file = "$outputdir/smokedata.cpp"; + open OUT, ">$file" or die "Couldn't create $file\n"; + + foreach my $incl (sort{ + return 1 if $a=~/qmotif/; # move qmotif* at bottom (they include dirty X11 headers) + return -1 if $b=~/qmotif/; + $a cmp $b + } keys %allIncludes) { + die if $incl eq ''; + print OUT "#include <$incl>\n"; + } + + print OUT "\n"; + print OUT "#include <smoke.h>\n\n"; + print OUT "#include <qt_smoke.h>\n\n"; + + # gcc optimizes this method like crazy. switch() is godly + print OUT "static void *${libname}_cast(void *xptr, Smoke::Index from, Smoke::Index to) {\n"; + print OUT " switch(from) {\n"; + + print STDERR "Writing ${libname}_cast function\n" if ($debug); + + # Prepare descendants information for each class + my %descendants; # classname -> list of descendant nodes + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + # Get _all_ superclasses (up any number of levels) + # and store that $classNode is a descendant of $s + my @super = superclass_list($classNode); + for my $s (@super) { + my $superClassName = join( "::", kdocAstUtil::heritage($s) ); + Ast::AddPropList( \%descendants, $superClassName, $classNode ); + } + } ); + + # Iterate over all classes, to write the xtypecast function + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + # @super will contain superclasses, the class itself, and all descendants + my @super = superclass_list($classNode); + push @super, $classNode; + if ( defined $descendants{$className} ) { + push @super, @{$descendants{$className}}; + } + my $cur = $classidx{$className}; + print OUT " case $cur:\t//$className\n"; + print OUT "\tswitch(to) {\n"; + $cur = -1; + for my $s (@super) { + my $superClassName = join( "::", kdocAstUtil::heritage($s) ); + next if !defined $classidx{$superClassName}; # inherits from unknown class, see below + next if $classidx{$superClassName} == $cur; # shouldn't happen in Qt + $cur = $classidx{$superClassName}; + print OUT "\t case $cur: return (void*)($superClassName*)($className*)xptr;\n"; + } + print OUT "\t default: return xptr;\n"; + print OUT "\t}\n"; + } ); + print OUT " default: return xptr;\n"; + print OUT " }\n"; + print OUT "}\n\n"; + + + # Write inheritance array + # Imagine you have "Class : public super1, super2" + # The inheritlist array will get 3 new items: super1, super2, 0 + my %inheritfinder; # key = (super1, super2) -> data = (index in @inheritlist). This one allows reuse. + my %classinherit; # we store that index in %classinherit{className} + # We don't actually need to store inheritlist in memory, we write it + # directly to the file. We only need to remember its current size. + my $inheritlistsize = 1; + + print OUT "// Group of class IDs (0 separated) used as super class lists.\n"; + print OUT "// Classes with super classes have an index into this array.\n"; + print OUT "static short ${libname}_inheritanceList[] = {\n"; + print OUT "\t0,\t// 0: (no super class)\n"; + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + my $className = join( "__", kdocAstUtil::heritage($classNode) ); + print STDERR "inheritanceList: looking at $className\n" if ($debug); + + # Make list of direct ancestors + my @super; + Iter::Ancestors( $classNode, $rootnode, undef, undef, sub { + my $superClassName = join( "::", kdocAstUtil::heritage($_[0]) ); + push @super, $superClassName; + }, undef ); + # Turn that into a list of class indexes + my $key = ''; + foreach my $superClass( @super ) { + if (defined $classidx{$superClass}) { + $key .= ', ' if ( length $key > 0 ); + $key .= $classidx{$superClass}; + } + } + if ( $key ne '' ) { + if ( !defined $inheritfinder{$key} ) { + print OUT "\t"; + my $index = $inheritlistsize; # Index of first entry (for this group) in inheritlist + foreach my $superClass( @super ) { + if (defined $classidx{$superClass}) { + print OUT "$classidx{$superClass}, "; + $inheritlistsize++; + } + } + $inheritlistsize++; + my $comment = join( ", ", @super ); + print OUT "0,\t// $index: $comment\n"; + $inheritfinder{$key} = $index; + } + $classinherit{$className} = $inheritfinder{$key}; + } else { # No superclass + $classinherit{$className} = 0; + } + } ); + print OUT "};\n\n"; + + + print OUT "// These are the xenum functions for manipulating enum pointers\n"; + for my $className (keys %enumclasslist) { + my $c = $className; + $c =~ s/::/__/g; + print OUT "void xenum_$c\(Smoke::EnumOperation, Smoke::Index, void*&, long&);\n"; + } + print OUT "\n"; + print OUT "// Those are the xcall functions defined in each x_*.cpp file, for dispatching method calls\n"; + my $firstClass = 1; + for my $className (@classlist) { + if ($firstClass) { + $firstClass = 0; + next; + } + my $c = $className; # make a copy + $c =~ s/::/__/g; + print OUT "void xcall_$c\(Smoke::Index, void*, Smoke::Stack);\n"; + } + print OUT "\n"; + + # Write class list afterwards because it needs offsets to the inheritance array. + print OUT "// List of all classes\n"; + print OUT "// Name, index into inheritanceList, method dispatcher, enum dispatcher, class flags\n"; + print OUT "static Smoke::Class ${libname}_classes[] = {\n"; + my $firstClass = 1; + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + my $className = join( "__", kdocAstUtil::heritage($classNode) ); + + if ($firstClass) { + $firstClass = 0; + print OUT "\t{ 0L, 0, 0, 0, 0 }, \t// 0 (no class)\n"; + } + my $c = $className; + $c =~ s/::/__/g; + my $xcallFunc = "xcall_$c"; + my $xenumFunc = "0"; + $xenumFunc = "xenum_$c" if exists $enumclasslist{$className}; + # %classinherit needs Foo__Bar, not Foo::Bar? + die "problem with $className" unless defined $classinherit{$c}; + + my $xClassFlags = 0; + $xClassFlags .= "|Smoke::cf_constructor" if $classNode->{CanBeInstanciated}; # correct? + $xClassFlags .= "|Smoke::cf_deepcopy" if $classNode->{CanBeCopied}; # HasCopyConstructor would be wrong (when it's private) + $xClassFlags .= "|Smoke::cf_virtual" if hasVirtualDestructor($classNode) == 1; + # $xClassFlags .= "|Smoke::cf_undefined" if ...; + $xClassFlags =~ s/0\|//; # beautify + print OUT "\t{ \"$className\", $classinherit{$c}, $xcallFunc, $xenumFunc, $xClassFlags }, \t//$classidx{$className}\n"; + } ); + print OUT "};\n\n"; + + + print OUT "// List of all types needed by the methods (arguments and return values)\n"; + print OUT "// Name, class ID if arg is a class, and TypeId\n"; + print OUT "static Smoke::Type ${libname}_types[] = {\n"; + my $typeCount = 0; + $allTypes{''}{index} = 0; # We need an "item 0" + for my $type (sort keys %allTypes) { + $allTypes{$type}{index} = $typeCount; # Register proper index in allTypes + if ( $typeCount == 0 ) { + print OUT "\t{ 0, 0, 0 },\t//0 (no type)\n"; + $typeCount++; + next; + } + my $isEnum = $allTypes{$type}{isEnum}; + my $typeId; + my $typeFlags = $allTypes{$type}{typeFlags}; + my $realType = $allTypes{$type}{realType}; + die "$type" if !defined $typeFlags; + die "$realType" if $realType =~ /\(/; + # First write the name + print OUT "\t{ \"$type\", "; + # Then write the classId (and find out the typeid at the same time) + if(exists $classidx{$realType}) { # this one first, we want t_class for QBlah* + $typeId = 't_class'; + print OUT "$classidx{$realType}, "; + } + elsif($type =~ /&$/ || $type =~ /\*$/) { + $typeId = 't_voidp'; + print OUT "0, "; # no classId + } + elsif($isEnum || $allTypes{$realType}{isEnum}) { + $typeId = 't_enum'; + if($realType =~ /(.*)::/) { + my $c = $1; + if($classidx{$c}) { + print OUT "$classidx{$c}, "; + } else { + print OUT "0 /* unknown class $c */, "; + } + } else { + print OUT "0 /* unknown $realType */, "; # no classId + } + } + else { + $typeId = $typeunion{$realType}; + if (defined $typeId) { + $typeId =~ s/s_/t_/; # from s_short to t_short for instance + } + else { + # Not a known class - ouch, this happens quite a lot + # (private classes, typedefs, template-based types, etc) + if ( $skippedClasses{$realType} ) { +# print STDERR "$realType has been skipped, using t_voidp for it\n"; + } else { + unless( $realType =~ /</ ) { # Don't warn for template stuff... + print STDERR "$realType isn't a known type (type=$type)\n"; + } + } + $typeId = 't_voidp'; # Unknown -> map to a void * + } + print OUT "0, "; # no classId + } + # Then write the flags + die "$type" if !defined $typeId; + print OUT "Smoke::$typeId | $typeFlags },"; + print OUT "\t//$typeCount\n"; + $typeCount++; + # Remember it for coerce_type + $allTypes{$type}{typeId} = $typeId; + } + print OUT "};\n\n"; + + + my %arglist; # registers the needs for argumentList (groups of type ids) + my %methods; + # Look for all methods and all enums, in all classes + # And fill in methods and arglist. This loop writes nothing to OUT. + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + print STDERR "writeSmokeDataFile: arglist: looking at $className\n" if ($debug); + + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + + my $methName = $m->{astNodeName}; + # For destructors, get a proper signature that includes the '~' + if ( $m->{ReturnType} eq '~' ) + { + $methName = '~' . $methName ; + # Let's even store that change, otherwise we have to do it many times + $m->{astNodeName} = $methName; + } + + if( $m->{NodeType} eq "enum" ) { + + foreach my $enum ( @{$m->{ParamList}} ) { + my $enumName = $enum->{ArgName}; + $methods{$enumName}++; + } + + } elsif ( $m->{NodeType} eq 'var' ) { + + $methods{$m->{astNodeName}}++; + + } elsif( $m->{NodeType} eq "method" ) { + + $methods{$methName}++; + my @protos; + makeprotos(\%classidx, $m, \@protos); + + #print "made @protos from $className $methName $m->{Signature})\n" if ($debug); + for my $p (@protos) { + $methods{$p}++; + my $argcnt = 0; + $argcnt = length($1) if $p =~ /([\$\#\?]+)/; + my $sig = methodSignature($m, $argcnt-1); + # Store in a class hash named "proto", a proto+signature => method association + $classNode->{proto}{$p}{$sig} = $m; + #$classNode->{signature}{$sig} = $p; + # There's probably a way to do this better, but this is the fastest way + # to get the old code going: store classname into method + $m->{class} = $className; + } + + my $firstDefaultParam = $m->{FirstDefaultParam}; + $firstDefaultParam = scalar(@{ $m->{ParamList} }) unless defined $firstDefaultParam; + my $argNames = ''; + my $args = ''; + for(my $i = 0; $i < @{ $m->{ParamList} }; $i++) { + $args .= ', ' if $i; + $argNames .= ', ' if $i; + my $argType = $m->{ParamList}[$i]{ArgType}; + my $typeEntry = findTypeEntry( $argType ); + $args .= defined $typeEntry ? $typeEntry->{index} : 0; + $argNames .= $argType; + + if($i >= ($firstDefaultParam - 1)) { + #print "arglist entry: $args\n"; + $arglist{$args} = $argNames; + } + + } + # create an entry for e.g. "arg0,arg1,arg2" where argN is index in allTypes of type for argN + # The value, $argNames, is temporarily stored, to be written out as comment + # It gets replaced with the index in the next loop. + #print "arglist entry : $args\n"; + $arglist{$args} = $argNames; + } + }, # end of sub + undef + ); + }); + + + $arglist{''} = 0; + # Print arguments array + print OUT "static Smoke::Index ${libname}_argumentList[] = {\n"; + my $argListCount = 0; + for my $args (sort keys %arglist) { + my $numTypes = scalar(split ',', $args); + if ($args eq '') { + print OUT "\t0,\t//0 (void)\n"; + } else { + # This is a nice trick : args can be written in one go ;) + print OUT "\t$args, 0,\t//$argListCount $arglist{$args} \n"; + } + $arglist{$args} = $argListCount; # Register proper index in argList + $argListCount += $numTypes + 1; # Move forward by as much as we wrote out + } + print OUT "};\n\n"; + + $methods{''} = 0; + my @methodlist = sort keys %methods; + my %methodidx = do { my $i = 0; map { $_ => $i++ } @methodlist }; + + print OUT "// Raw list of all methods, using munged names\n"; + print OUT "static const char *${libname}_methodNames[] = {\n"; + my $methodNameCount = $#methodlist; + for my $m (@methodlist) { + print OUT qq( "$m",\t//$methodidx{$m}\n); + } + print OUT "};\n\n"; + + print OUT "// (classId, name (index in methodNames), argumentList index, number of args, method flags, return type (index in types), xcall() index)\n"; + print OUT "static Smoke::Method ${libname}_methods[] = {\n"; + my @methods; + %allMethods = (); + my $methodCount = 0; + # Look at all classes and all enums again + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + my $classIndex = $classidx{$className}; + print STDERR "writeSmokeDataFile: methods: looking at $className\n" if ($debug); + + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + + if( $m->{NodeType} eq "enum" ) { + + foreach my $enum ( @{$m->{ParamList}} ) { + my $enumName = $enum->{ArgName}; + my $fullEnumName = "$className\::$enumName"; + my $sig = "$className\::$enumName\()"; + my $xmethIndex = $methodidx{$enumName}; + die "'Method index' for enum $sig not found" unless defined $xmethIndex; + my $typeId = findTypeEntry( $fullEnumName )->{index}; + die "enum has no {case} value in $className: $fullEnumName" unless defined $classNode->{case}{$fullEnumName}; + print OUT "\t{$classIndex, $xmethIndex, 0, 0, Smoke::mf_static, $typeId, $classNode->{case}{$fullEnumName}},\t//$methodCount $fullEnumName (enum)\n"; + $allMethods{$sig} = $methodCount; + print STDERR "Added entry for " . $sig . " into \$allMethods\n" if ($debug); + $methods[$methodCount] = { + c => $classIndex, + methIndex => $xmethIndex, + argcnt => '0', + args => 0, + retTypeIndex => 0, + idx => $classNode->{case}{$fullEnumName} + }; + $methodCount++; + } + + } elsif( $m->{NodeType} eq 'var' ) { + + my $name = $m->{astNodeName}; + my $fullName = "$className\::$name"; + my $sig = "$fullName\()"; + my $xmethIndex = $methodidx{$name}; + die "'Method index' for var $sig not found" unless defined $xmethIndex; + my $varType = $m->{Type}; + $varType =~ s/static\s//; + $varType =~ s/const\s+(.*)\s*&/$1/; + $varType =~ s/\s*$//; + my $typeId = findTypeEntry( $varType )->{index}; + die "var has no {case} value in $className: $fullName" unless defined $classNode->{case}{$fullName}; + print OUT "\t{$classIndex, $xmethIndex, 0, 0, Smoke::mf_static, $typeId, $classNode->{case}{$fullName}},\t//$methodCount $fullName (static var)\n"; + $allMethods{$sig} = $methodCount; + print STDERR "Added entry for " . $sig . " into \$allMethods\n" if ($debug); + $methods[$methodCount] = { + c => $classIndex, + methIndex => $xmethIndex, + argcnt => '0', + args => 0, + retTypeIndex => 0, + idx => $classNode->{case}{$fullName} + }; + $methodCount++; + + + } elsif( $m->{NodeType} eq "method" ) { + + # We generate a method entry only if the method is in the switch() code + # BUT: for pure virtuals, they need to have a method entry, even though they + # do NOT have a switch code. + return if ( $m->{SkipFromSwitch} && $m->{Flags} !~ "p" ); + + # No switch code for destructors if we didn't derive from the class (e.g. it has private ctors only) + return if ( $m->{ReturnType} eq '~' && ! ( $classNode->{BindingDerives} and $classNode->{HasPublicDestructor}) ); + + # Is this sorting really important? + #for my $m (sort {$a->{name} cmp $b->{name}} @{ $self->{$c}{method} }) { + + my $methName = $m->{astNodeName}; + my $def = $m->{FirstDefaultParam}; + $def = scalar(@{ $m->{ParamList} }) unless defined $def; + my $last = scalar(@{ $m->{ParamList} }) - 1; + #print STDERR "writeSmokeDataFile: methods: generating for method $methName, def=$def last=$last\n" if ($debug); + + while($last >= ($def-1)) { + last if $last < -1; + my $args = [ @{ $m->{ParamList} }[0..$last] ]; + my $sig = methodSignature($m, $last); + #my $methodSig = $classNode->{signature}{$sig}; # Munged signature + #print STDERR "writeSmokeDataFile: methods: sig=$className\::$sig methodSig=$methodSig\n" if ($debug); + #my $methodIndex = $methodidx{$methodSig}; + #die "$methodSig" if !defined $methodIndex; + + my $methodIndex = $methodidx{$methName}; + die "$methName" if !defined $methodIndex; + my $case = $classNode->{case}{$sig}; + my $typeEntry = findTypeEntry( $m->{ReturnType} ); + my $retTypeIndex = defined $typeEntry ? $typeEntry->{index} : 0; + + my $i = 0; + my $t = ''; + for my $arg (@$args) { + $t .= ', ' if $i++; + my $typeEntry = findTypeEntry( $arg->{ArgType} ); + $t .= defined $typeEntry ? $typeEntry->{index} : 0; + } + my $arglist = $t eq '' ? 0 : $arglist{$t}; + die "arglist for $t not found" unless defined $arglist; + if ( $m->{Flags} =~ "p" ) { + # Pure virtuals don't have a {case} number, that's normal + die if defined $case; + $case = -1; # This remains -1, not 0 ! + } else { + die "$className\::$methName has no case number for sig=$sig" unless defined $case; + } + my $argcnt = $last + 1; + my $methodFlags = '0'; + $methodFlags .= "|Smoke::mf_static" if $m->{Flags} =~ "s"; + $methodFlags .= "|Smoke::mf_const" if $m->{Flags} =~ "c"; # useful?? probably not + $methodFlags =~ s/0\|//; # beautify + + print OUT "\t{$classIndex, $methodIndex, $arglist, $argcnt, $methodFlags, $retTypeIndex, $case},\t//$methodCount $className\::$sig"; + print OUT " [pure virtual]" if ( $m->{Flags} =~ "p" ); # explain why $case = -1 ;) + print OUT "\n"; + + $allMethods{$className . "::" . $sig} = $methodCount; + $methods[$methodCount] = { + c => $classIndex, + methIndex => $methodIndex, + argcnt => $argcnt, + args => $arglist, + retTypeIndex => $retTypeIndex, + idx => $case + }; + $methodCount++; + $last--; + } # while + } # if method + } ); # Method Iter + } ); # Class Iter + print OUT "};\n\n"; + + my @protos; + Iter::LocalCompounds( $rootnode, sub { + my $classNode = shift; + my $className = join( "::", kdocAstUtil::heritage($classNode) ); + my $classIndex = $classidx{$className}; + print STDERR "writeSmokeDataFile: protos: looking at $className\n" if ($debug); + + Iter::MembersByType ( $classNode, undef, + sub { my ($classNode, $m ) = @_; + + if( $m->{NodeType} eq "enum" ) { + foreach my $enum ( @{$m->{ParamList}} ) { + my $enumName = $enum->{ArgName}; + my $sig = "$className\::$enumName\()"; + my $xmeth = $allMethods{$sig}; + die "'Method' for enum $sig not found" unless defined $xmeth; + my $xmethIndex = $methodidx{$enumName}; + die "'Method index' for enum $enumName not found" unless defined $xmethIndex; + push @protos, { + methIndex => $xmethIndex, + c => $classIndex, + over => { + $sig => { + sig => $sig, + } + }, + meth => $xmeth + }; + } + + } elsif( $m->{NodeType} eq 'var' ) { + + my $name = $m->{astNodeName}; + my $fullName = "$className\::$name"; + my $sig = "$fullName\()"; + my $xmeth = $allMethods{$sig}; + die "'Method' for var $sig not found" unless defined $xmeth; + my $xmethIndex = $methodidx{$name}; + die "'Method index' for var $name not found" unless defined $xmethIndex; + push @protos, { + methIndex => $xmethIndex, + c => $classIndex, + over => { + $sig => { + sig => $sig, + } + }, + meth => $xmeth + }; + + } + }); + + for my $p (keys %{ $classNode->{proto} }) { + # For each prototype + my $scratch = { %{ $classNode->{proto}{$p} } }; # sig->method association + # first, grab all the superclass voodoo + for my $supNode (superclass_list($classNode)) { + my $i = $supNode->{proto}{$p}; + next unless $i; + for my $k (keys %$i) { + $scratch->{$k} = $i->{$k} unless exists $scratch->{$k}; + } + } + + # Ok, now we have a full list + #if(scalar keys %$scratch > 1) { + #print STDERR "Overload: $p (@{[keys %$scratch]})\n" if ($debug); + #} + my $xmethIndex = $methodidx{$p}; + my $classIndex = $classidx{$className}; + for my $sig (keys %$scratch) { + #my $xsig = $scratch->{$sig}{class} . "::" . $sig; + my $xsig = $className . "::" . $sig; + $scratch->{$sig}{sig} = $xsig; + delete $scratch->{$sig} + if $scratch->{$sig}{Flags} =~ "p" # pure virtual + or not exists $allMethods{$xsig}; + } + push @protos, { + methIndex => $xmethIndex, + c => $classIndex, + over => $scratch + } if scalar keys %$scratch; + } + }); + + my @protolist = sort { $a->{c} <=> $b->{c} || $a->{methIndex} <=> $b->{methIndex} } @protos; +#for my $abc (@protos) { +#print "$abc->{methIndex}.$abc->{c}\n"; +#} + + print STDERR "Writing methodmap table\n" if ($debug); + my @resolve = (); + print OUT "// Class ID, munged name ID (index into methodNames), method def (see methods) if >0 or number of overloads if <0\n"; + my $methodMapCount = 1; + print OUT "static Smoke::MethodMap ${libname}_methodMaps[] = {\n"; + print OUT "\t{ 0, 0, 0 },\t//0 (no method)\n"; + for my $cur (@protolist) { + if(scalar keys %{ $cur->{over} } > 1) { + print OUT "\t{$cur->{c}, $cur->{methIndex}, -@{[1+scalar @resolve]}},\t//$methodMapCount $classlist[$cur->{c}]\::$methodlist[$cur->{methIndex}]\n"; + $methodMapCount++; + for my $k (keys %{ $cur->{over} }) { + my $p = $cur->{over}{$k}; + my $xsig = $p->{class} ? "$p->{class}\::$k" : $p->{sig}; + push @resolve, { k => $k, p => $p, cur => $cur, id => $allMethods{$xsig} }; + } + push @resolve, 0; + } else { + for my $k (keys %{ $cur->{over} }) { + my $p = $cur->{over}{$k}; + my $xsig = $p->{class} ? "$p->{class}\::$k" : $p->{sig}; + print OUT "\t{$cur->{c}, $cur->{methIndex}, $allMethods{$xsig}},\t//$methodMapCount $classlist[$cur->{c}]\::$methodlist[$cur->{methIndex}]\n"; + $methodMapCount++; + } + } + } + print OUT "};\n\n"; + + + print STDERR "Writing ambiguousMethodList\n" if ($debug); + print OUT "static Smoke::Index ${libname}_ambiguousMethodList[] = {\n"; + print OUT " 0,\n"; + for my $r (@resolve) { + unless($r) { + print OUT " 0,\n"; + next; + } + my $xsig = $r->{p}{class} ? "$r->{p}{class}\::$r->{k}" : $r->{p}{sig}; + die "ambiguousMethodList: no method found for $xsig\n" if !defined $allMethods{$xsig}; + print OUT " $allMethods{$xsig}, // $xsig\n"; + } + print OUT "};\n\n"; + +# print OUT "extern \"C\" { // needed?\n"; +# print OUT " void init_${libname}_Smoke();\n"; +# print OUT "}\n"; + print OUT "\n"; + print OUT "Smoke* qt_Smoke = 0L;\n"; + print OUT "\n"; + print OUT "// Create the Smoke instance encapsulating all the above.\n"; + print OUT "void init_${libname}_Smoke() {\n"; + print OUT " qt_Smoke = new Smoke(\n"; + print OUT " ${libname}_classes, ".$#classlist.",\n"; + print OUT " ${libname}_methods, $methodCount,\n"; + print OUT " ${libname}_methodMaps, $methodMapCount,\n"; + print OUT " ${libname}_methodNames, $methodNameCount,\n"; + print OUT " ${libname}_types, $typeCount,\n"; + print OUT " ${libname}_inheritanceList,\n"; + print OUT " ${libname}_argumentList,\n"; + print OUT " ${libname}_ambiguousMethodList,\n"; + print OUT " ${libname}_cast );\n"; + print OUT "}\n"; + close OUT; + +#print "@{[keys %allMethods ]}\n"; +} + +1; diff --git a/kalyptus/kalyptusDataDict.pm b/kalyptus/kalyptusDataDict.pm new file mode 100644 index 0000000..0de2480 --- /dev/null +++ b/kalyptus/kalyptusDataDict.pm @@ -0,0 +1,3042 @@ +#*************************************************************************** +# kalyptusDataDict.pm - A Qt/KDE types data dictionary +# ------------------- +# begin : Fri Oct 20 12:00:00 2000 +# copyright : (C) 2000-2001 Lost Highway Ltd. All Rights Reserved. +# email : [email protected] +# author : Richard Dale. +#***************************************************************************/ + +#/*************************************************************************** +# * * +# * This program 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 2 of the License, or * +# * (at your option) any later version. * +# * * +#***************************************************************************/ + +package kalyptusDataDict; + +use strict; +no strict "subs"; + +use vars qw/ %interfacemap %ctypemap %builtins /; + +BEGIN +{ + +%interfacemap = ( +'QPaintDevice' => 'QPaintDeviceInterface', +'QMenuData' => 'QMenuDataInterface', +'QRangeControl' => 'QRangeControlInterface', +'QMimeSource' => 'QMimeSourceInterface', +'QLayoutItem' => 'QLayoutItemInterface', +'QUrl' => 'QUrlInterface', +'QIODevice' => 'QIODeviceInterface', +'QXmlContentHandler' => 'QXmlContentHandlerInterface', +'QXmlErrorHandler' => 'QXmlErrorHandlerInterface', +'QXmlDTDHandler' => 'QXmlDTDHandlerInterface', +'QXmlEntityResolver' => 'QXmlEntityResolverInterface', +'QXmlLexicalHandler' => 'QXmlLexicalHandlerInterface', +'QXmlDeclHandler' => 'QXmlDeclHandlerInterface', +'KInstance' => 'KInstanceInterface', +'QwAbsSpriteFieldView' => 'QwAbsSpriteFieldViewInterface', +'PartBase' => 'PartBaseInterface', +'KCompletionBase' => 'KCompletionBaseInterface', +'KDirNotify' => 'KDirNotifyInterface', +'KXMLGUIClient' => 'KXMLGUIClientInterface', +'KFileView' => 'KFileViewInterface', +'KXMLGUIBuilder' => 'KXMLGUIBuilderInterface', +'DCOPObject' => 'DCOPObjectInterface', +'KDevCore' => 'KDevCoreInterface', +'QSqlQuery' => 'QSqlQueryInterface', + +); + +# A hard coded type translation table (the idea from the Roberto Alsina's Qtc +# python conversion scripts). The particular format used here makes it possible to use +# the same table with three different kdoc based Qt/KDE language binding generators; +# C, Objective-C and Java. +%ctypemap = ( + +'ASConsumer*' => 'kde_ASConsumer*', +'ASProducer*' => 'kde_ASProducer*', +'ASYNC' => 'void' , +'Address&' => 'kde_Address*' , +'Address*' => 'kde_Address*', +'AddressBook*' => 'kde_AddressBook*', +'AddressBook::Entry&' => 'kde_Entry*' , +'Addressee&' => 'kde_Addressee*', +'Addressee*' => 'kde_Addressee*', +'AddresseeData*' => 'kde_AddresseeData*', +'AddresseeDialog*' => 'kde_AddresseeDialog*', +'AddresseeItem*' => 'kde_AddresseeItem*', +'AlsaOut*' => 'kde_AlsaOut*', +'AnyConstRef&' => 'kde_AnyConstRef*', +'AnyConstRef*' => 'kde_AnyConstRef*', +'AnyRef&' => 'kde_AnyRef*', +'AnyRef*' => 'kde_AnyRef*', +'AnyRefBase&' => 'kde_AnyRefBase*', +'AnyRefBase*' => 'kde_AnyRefBase*', +'ArgList' => 'int' , +'ArrowType' => 'int' , +'Arts*' => 'kde_Arts*', +'Arts::AudioManagerClient' => 'int', +'Arts::Buffer&' => 'kde_Arts_Buffer*', +'Arts::Buffer*' => 'kde_Arts_Buffer*', +'Arts::ByteSoundProducer' => 'kde_Arts_ByteSoundProducer*', +'Arts::Connection*' => 'kde_Arts_Connection*', +'Arts::DynamicCast&' => 'kde_Arts_DynamicCast*', +'Arts::FlowSystemReceiver' => 'kde_Arts_FlowSystemReceiver*', +'Arts::FlowSystemSender' => 'kde_Arts_FlowSystemSender*', +'Arts::Format&' => 'kde_Arts_Format*', +'Arts::Format' => 'kde_Arts_Format', +'Arts::GenericAsyncStream*' => 'kde_Arts_GenericAsyncStream*', +'Arts::GenericDataChannel*' => 'kde_Arts_GenericDataChannel*', +'Arts::InterfaceDef' => 'kde_Arts_InterfaceDef*', +'Arts::MethodDef&' => 'kde_Arts_MethodDef*', +'Arts::ModuleDef&' => 'kde_Arts_ModuleDef*', +'Arts::Notification&' => 'kde_Arts_Notification*', +'Arts::Object' => 'kde_Arts_Object*', +'Arts::Object::Pool&' => 'kde_Arts_Object_Pool*', +'Arts::ObjectReference' => 'kde_Arts_ObjectReference*', +'Arts::PlayObject' => 'kde_Arts_PlayObject*', +'Arts::Reference&' => 'kde_Arts_Reference*', +'Arts::StereoEffect' => 'kde_Arts_StereoEffect*', +'Arts::StereoEffectStack' => 'kde_Arts_StereoEffectStack*', +'Arts::SubClass&' => 'kde_Arts_SubClass*', +'Arts::TypeDef' => 'kde_Arts_TypeDef*', +'Arts::poTime&' => 'kde_Arts_poTime*', +'Arts::poTime' => 'kde_Arts_poTime', +'AsyncStream*' => 'kde_AsyncStream*', +'Attr&' => 'kde_Attr*', +'Attr' => 'kde_Attr*', +'Attr*' => 'kde_Attr*', +'AttrImpl*' => 'kde_AttrImpl*', +'AttributeDef&' => 'kde_AttributeDef*', +'AttributeDef*' => 'kde_AttributeDef*', +'AudioManager&' => 'kde_AudioManager*', +'AudioManager' => 'kde_AudioManager*', +'AudioManager*' => 'kde_AudioManager*', +'AudioManagerClient&' => 'kde_AudioManagerClient*', +'AudioManagerClient' => 'kde_AudioManagerClient*', +'AudioManagerClient*' => 'kde_AudioManagerClient*', +'AudioManagerClient_base*' => 'kde_AudioManagerClient_base*', +'AudioManagerClient_skel*' => 'kde_AudioManagerClient_skel*', +'AudioManagerClient_stub*' => 'kde_AudioManagerClient_stub*', +'AudioManagerInfo&' => 'kde_AudioManagerInfo*', +'AudioManagerInfo*' => 'kde_AudioManagerInfo*', +'AudioManager_base*' => 'kde_AudioManager_base*', +'AudioManager_skel*' => 'kde_AudioManager_skel*', +'AudioManager_stub*' => 'kde_AudioManager_stub*', +'AudioPort*' => 'kde_AudioPort*', +'AudioSubSystem*' => 'kde_AudioSubSystem*', +'AudioSubSystemStart*' => 'kde_AudioSubSystemStart*', +'AuthAccept&' => 'kde_AuthAccept*', +'AuthAccept*' => 'kde_AuthAccept*', +'AuthInfo&' => 'kde_AuthInfo*', +'AuthInfo*' => 'kde_AuthInfo*', +'BGMode' => 'int', +'BMToken*' => 'kde_BMToken*', +'BackgroundMode' => 'int', +'BlockSelectionInterface*' => 'kde_BlockSelectionInterface*', +'BookmarkTokenizer*' => 'kde_BookmarkTokenizer*', +'Bool' => 'int' , +'Boolean&' => 'kde_Boolean*', +'Boolean*' => 'kde_Boolean*', +'BrowserExtension*' => 'kde_BrowserExtension*', +'BrowserHostExtension*' => 'kde_BrowserHostExtension*', +'BrowserInterface*' => 'kde_BrowserInterface*', +'BrushStyle' => 'int', +'Buffer&' => 'kde_Buffer*', +'Buffer*' => 'kde_Buffer*', +'ButtonCode' => 'int' , +'ButtonState' => 'int' , +'ByteAsyncStream*' => 'kde_ByteAsyncStream*', +'ByteDataPacket*' => 'kde_ByteDataPacket*', +'ByteSoundProducer&' => 'kde_ByteSoundProducer*', +'ByteSoundProducer' => 'kde_ByteSoundProducer*', +'ByteSoundProducer*' => 'kde_ByteSoundProducer*', +'ByteSoundProducer_base*' => 'kde_ByteSoundProducer_base*', +'ByteSoundProducer_skel*' => 'kde_ByteSoundProducer_skel*', +'ByteSoundProducer_stub*' => 'kde_ByteSoundProducer_stub*', +'ByteStreamToAudio&' => 'kde_ByteStreamToAudio*', +'ByteStreamToAudio' => 'kde_ByteStreamToAudio*', +'ByteStreamToAudio*' => 'kde_ByteStreamToAudio*', +'ByteStreamToAudio_base*' => 'kde_ByteStreamToAudio_base*', +'ByteStreamToAudio_skel*' => 'kde_ByteStreamToAudio_skel*', +'ByteStreamToAudio_stub*' => 'kde_ByteStreamToAudio_stub*', +'CDATASection&' => 'kde_CDATASection*', +'CDATASection' => 'kde_CDATASection*', +'CDATASection*' => 'kde_CDATASection*', +'CFlags' => 'int', +'COORD' => 'short' , +'CSSCharsetRule&' => 'kde_CSSCharsetRule*', +'CSSCharsetRule*' => 'kde_CSSCharsetRule*', +'CSSCharsetRuleImpl*' => 'kde_CSSCharsetRuleImpl*', +'CSSException&' => 'kde_CSSException*', +'CSSException*' => 'kde_CSSException*', +'CSSFontFaceRule&' => 'kde_CSSFontFaceRule*', +'CSSFontFaceRule*' => 'kde_CSSFontFaceRule*', +'CSSFontFaceRuleImpl*' => 'kde_CSSFontFaceRuleImpl*', +'CSSImportRule&' => 'kde_CSSImportRule*', +'CSSImportRule*' => 'kde_CSSImportRule*', +'CSSImportRuleImpl*' => 'kde_CSSImportRuleImpl*', +'CSSMediaRule&' => 'kde_CSSMediaRule*', +'CSSMediaRule*' => 'kde_CSSMediaRule*', +'CSSMediaRuleImpl*' => 'kde_CSSMediaRuleImpl*', +'CSSPageRule&' => 'kde_CSSPageRule*', +'CSSPageRule*' => 'kde_CSSPageRule*', +'CSSPageRuleImpl*' => 'kde_CSSPageRuleImpl*', +'CSSPrimitiveValue&' => 'kde_CSSPrimitiveValue*', +'CSSPrimitiveValue' => 'kde_CSSPrimitiveValue*', +'CSSPrimitiveValue*' => 'kde_CSSPrimitiveValue*', +'CSSPrimitiveValueImpl*' => 'kde_CSSPrimitiveValueImpl*', +'CSSRule&' => 'kde_CSSRule*', +'CSSRule' => 'kde_CSSRule*', +'CSSRule*' => 'kde_CSSRule*', +'CSSRuleImpl*' => 'kde_CSSRuleImpl*', +'CSSRuleList&' => 'kde_CSSRuleList*', +'CSSRuleList' => 'kde_CSSRuleList*', +'CSSRuleList*' => 'kde_CSSRuleList*', +'CSSRuleListImpl*' => 'kde_CSSRuleListImpl*', +'CSSStyleDeclaration&' => 'kde_CSSStyleDeclaration*', +'CSSStyleDeclaration' => 'kde_CSSStyleDeclaration*', +'CSSStyleDeclaration*' => 'kde_CSSStyleDeclaration*', +'CSSStyleDeclarationImpl*' => 'kde_CSSStyleDeclarationImpl*', +'CSSStyleRule&' => 'kde_CSSStyleRule*', +'CSSStyleRule*' => 'kde_CSSStyleRule*', +'CSSStyleRuleImpl*' => 'kde_CSSStyleRuleImpl*', +'CSSStyleSheet&' => 'kde_CSSStyleSheet*', +'CSSStyleSheet' => 'kde_CSSStyleSheet*', +'CSSStyleSheet*' => 'kde_CSSStyleSheet*', +'CSSStyleSheetImpl*' => 'kde_CSSStyleSheetImpl*', +'CSSUnknownRule&' => 'kde_CSSUnknownRule*', +'CSSUnknownRule*' => 'kde_CSSUnknownRule*', +'CSSUnknownRuleImpl*' => 'kde_CSSUnknownRuleImpl*', +'CSSValue&' => 'kde_CSSValue*', +'CSSValue' => 'kde_CSSValue*', +'CSSValue*' => 'kde_CSSValue*', +'CSSValueImpl*' => 'kde_CSSValueImpl*', +'CSSValueList&' => 'kde_CSSValueList*', +'CSSValueList*' => 'kde_CSSValueList*', +'CSSValueListImpl*' => 'kde_CSSValueListImpl*', +'CString&' => 'kde_CString*', +'CString' => 'kde_CString*', +'CString*' => 'kde_CString*', +'Cache*' => 'kde_Cache*', +'CacheInfo*' => 'kde_CacheInfo*', +'CachedObject*' => 'kde_CachedObject*', +'CachedWav*' => 'kde_CachedWav*', +'Cardinal' => 'int' , +'CharSet' => 'int', +'CharacterData&' => 'kde_CharacterData*', +'CharacterData*' => 'kde_CharacterData*', +'CharacterDataImpl*' => 'kde_CharacterDataImpl*', +'ChmodJob*' => 'kde_ChmodJob*', +'ClassInfo*' => 'kde_ClassInfo*', +'ClassStore*' => 'kde_ClassStore*', +'ClassTreeNode*' => 'kde_ClassTreeNode*', +'ClientHello&' => 'kde_ClientHello*', +'ClientHello*' => 'kde_ClientHello*', +'ClipboardInterface*' => 'kde_ClipboardInterface*', +'CodeCompletionInterface*' => 'kde_CodeCompletionInterface*', +'ColorMode' => 'int', +'Comment&' => 'kde_Comment*', +'Comment' => 'kde_Comment*', +'Comment*' => 'kde_Comment*', +'CommentImpl*' => 'kde_CommentImpl*', +'ComparisonFlags' => 'int', +'Compl' => 'kde_Compl', +'Completion&' => 'kde_Completion*', +'Completion*' => 'kde_Completion*', +'CompletionEntry&' => 'kde_CompletionEntry*', +'CompletionEntry*' => 'kde_CompletionEntry*', +'ComplexControl' => 'int', +'ComponentFactory*' => 'kde_ComponentFactory*', +'ConfigInterface*' => 'kde_ConfigInterface*', +'Connection*' => 'kde_Connection*', +'ConstIterator' => 'int' , +'Constructor' => 'kde_Constructor*', +'Constructor*' => 'kde_Constructor*', +'ConstructorImp*' => 'kde_ConstructorImp*', +'ContentsType' => 'int', +'Context&' => 'kde_Context*', +'Context*' => 'kde_Context*', +'ControlElement' => 'int', +'CopyInfo*' => 'kde_CopyInfo*', +'CopyJob*' => 'kde_CopyJob*', +'Core*' => 'kde_Core*', +'Counter&' => 'kde_Counter*', +'Counter' => 'kde_Counter*', +'Counter*' => 'kde_Counter*', +'Cursor*' => 'kde_Cursor*', +'CursorInterface*' => 'kde_CursorInterface*', +'DCOPClient*' => 'kde_DCOPClient*', +'DCOPClientTransaction*' => 'kde_DCOPClientTransaction*' , +'DCOPObject*' => 'kde_DCOPObject*', +'DCOPObjectProxy*' => 'kde_DCOPObjectProxy*', +'DCOPRef&' => 'kde_DCOPRef*' , +'DCOPRef*' => 'kde_DCOPRef*', +'DCOPStub*' => 'kde_DCOPStub*', +'DOM*' => 'kde_DOM*', +'DOM::CSSProperty*' => 'kde_CSSProperty*' , +'DOM::DOMString&' => 'kde_DOMString*' , +'DOM::DOMString' => 'kde_DOMString*' , +'DOM::Document&' => 'kde_DOMDocument*' , +'DOM::Document' => 'kde_DOMDocument*' , +'DOM::Document*' => 'kde_DOMDocument*' , +'DOM::ElementImpl*' => 'kde_DOM_ElementImpl*' , +'DOM::HTMLDocument' => 'kde_HTMLDocument*' , +'DOM::MediaList&' => 'kde_MediaList*', +'DOM::MediaList' => 'kde_MediaList', +'DOM::MediaList*' => 'kde_MediaList*', +'DOM::Node&' => 'kde_DOMNode*' , +'DOM::Node' => 'kde_DOMNode*' , +'DOM::NodeList&' => 'kde_DOMNodeList*', +'DOM::NodeList' => 'kde_DOMNodeList*', +'DOM::NodeList*' => 'kde_DOMNodeList*', +'DOM::Range' => 'kde_Range*' , +'DOM::StyleSheetList&' => 'kde_StyleSheetList*', +'DOM::StyleSheetList' => 'kde_StyleSheetList', +'DOM::StyleSheetList*' => 'kde_StyleSheetList*', +'DOMException&' => 'kde_DOMException*', +'DOMException*' => 'kde_DOMException*', +'DOMImplementation&' => 'kde_DOMImplementation*', +'DOMImplementation' => 'kde_DOMImplementation*', +'DOMImplementation*' => 'kde_DOMImplementation*', +'DOMImplementationImpl*' => 'kde_DOMImplementationImpl*', +'DOMString&' => 'kde_DOMString*', +'DOMString' => 'kde_DOMString*', +'DOMString*' => 'kde_DOMString*', +'DOMStringImpl*' => 'kde_DOMStringImpl*', +'DW_EXPORT*' => 'void*', +'DataPacket*' => 'kde_DataPacket*', +'DateFormat' => 'int', +'Debug*' => 'kde_Debug*', +'DecoderFn' => 'int' , +'DefaultProgress*' => 'kde_DefaultProgress*', +'DeleteJob*' => 'kde_DeleteJob*', +'DeviceManager*' => 'kde_DeviceManager*', +'Direction' => 'int', +'DispatchFunction' => 'kde_DispatchFunction*', +'Dispatcher*' => 'kde_Dispatcher*', +'Display' => 'Display', +'Display*' => 'Display*', +'DistributionList*' => 'kde_DistributionList*', +'DistributionListEditor*' => 'kde_DistributionListEditor*', +'DistributionListManager*' => 'kde_DistributionListManager*', +'Dock&' => 'int', +'Dock' => 'int', +'DockMainWindow*' => 'kde_DockMainWindow*', +'DockPosData&' => 'kde_DockPosData*' , +'DockPosData*' => 'kde_DockPosData*', +'DockWindowData*' => 'long', +'Document&' => 'kde_Document*', +'Document' => 'kde_Document*', +'Document*' => 'kde_Document*', +'DocumentFragment&' => 'kde_DocumentFragment*', +'DocumentFragment' => 'kde_DocumentFragment*', +'DocumentFragment*' => 'kde_DocumentFragment*', +'DocumentFragmentImpl*' => 'kde_DocumentFragmentImpl*', +'DocumentImpl*' => 'kde_DocumentImpl*', +'DocumentStyle&' => 'kde_DocumentStyle*', +'DocumentStyle*' => 'kde_DocumentStyle*', +'DocumentType&' => 'kde_DocumentType*', +'DocumentType' => 'kde_DocumentType*', +'DocumentType*' => 'kde_DocumentType*', +'DocumentationContext*' => 'kde_DocumentationContext*', +'DomShared*' => 'kde_DomShared*', +'DrageMode' => 'int', +'DrawContentsEvent*' => 'kde_DrawContentsEvent*', +'DwAddress&' => 'kde_DwAddress*', +'DwAddress*' => 'kde_DwAddress*', +'DwAddressList&' => 'kde_DwAddressList*', +'DwAddressList*' => 'kde_DwAddressList*', +'DwBody&' => 'kde_DwBody*', +'DwBody*' => 'kde_DwBody*', +'DwBodyPart&' => 'kde_DwBodyPart*', +'DwBodyPart*' => 'kde_DwBodyPart*', +'DwBool' => 'int', +'DwDateTime&' => 'kde_DwDateTime*', +'DwDateTime*' => 'kde_DwDateTime*', +'DwDispositionType&' => 'kde_DwDispositionType*', +'DwDispositionType*' => 'kde_DwDispositionType*', +'DwEntity&' => 'kde_DwEntity*', +'DwField&' => 'kde_DwField*', +'DwField*' => 'kde_DwField*', +'DwFieldBody&' => 'kde_DwFieldBody*', +'DwFieldBody*' => 'kde_DwFieldBody*', +'DwGroup&' => 'kde_DwGroup*', +'DwGroup*' => 'kde_DwGroup*', +'DwHeaders&' => 'kde_DwHeaders*', +'DwHeaders*' => 'kde_DwHeaders*', +'DwInt32' => 'int', +'DwMailbox&' => 'kde_DwMailbox*', +'DwMailbox*' => 'kde_DwMailbox*', +'DwMailboxList&' => 'kde_DwMailboxList*', +'DwMailboxList*' => 'kde_DwMailboxList*', +'DwMechanism&' => 'kde_DwMechanism*', +'DwMechanism*' => 'kde_DwMechanism*', +'DwMediaType&' => 'kde_DwMediaType*', +'DwMediaType*' => 'kde_DwMediaType*', +'DwMessage&' => 'kde_DwMessage*', +'DwMessage*' => 'kde_DwMessage*', +'DwMessageComponent&' => 'kde_DwMessageComponent*', +'DwMessageComponent*' => 'kde_DwMessageComponent*', +'DwMime*' => 'kde_DwMime*', +'DwMsgId&' => 'kde_DwMsgId*', +'DwMsgId*' => 'kde_DwMsgId*', +'DwObserver*' => 'kde_DwObserver*', +'DwParameter&' => 'kde_DwParameter*', +'DwParameter*' => 'kde_DwParameter*', +'DwProtocolClient*' => 'kde_DwProtocolClient*', +'DwString&' => 'kde_DwString*', +'DwString' => 'kde_DwString', +'DwString*' => 'kde_DwString*', +'DwText&' => 'kde_DwText*', +'DwText*' => 'kde_DwText*', +'DwTokenizer&' => 'kde_DwTokenizer*', +'DwUint16' => 'unsigned short', +'DwUint32' => 'unsigned int', +'DwUint8' => 'unsigned char', +'DynamicCast*' => 'kde_DynamicCast*', +'DynamicRequest&' => 'kde_DynamicRequest*', +'DynamicRequest*' => 'kde_DynamicRequest*', +'EXPORT_DOCKCLASS*' => 'kde_EXPORT_DOCKCLASS*', +'EchoMode' => 'int', +'EditInterface*' => 'kde_EditInterface*', +'Editor*' => 'kde_Editor*', +'EditorContext*' => 'kde_EditorContext*', +'Element&' => 'kde_Element*', +'Element' => 'kde_Element*', +'Element*' => 'kde_Element*', +'ElementImpl*' => 'kde_ElementImpl*', +'EmailSelectDialog*' => 'kde_EmailSelectDialog*', +'EncoderFn' => 'int' , +'Endian' => 'int', +'Entity&' => 'kde_Entity*', +'Entity*' => 'kde_Entity*', +'EntityReference&' => 'kde_EntityReference*', +'EntityReference' => 'kde_EntityReference*', +'EntityReference*' => 'kde_EntityReference*', +'Entry&' => 'kde_Entry*' , +'Entry*' => 'kde_Entry*', +'Entry::Address&' => 'kde_EntryAddress' , +'EnumComponent&' => 'kde_EnumComponent*', +'EnumComponent*' => 'kde_EnumComponent*', +'EnumDef&' => 'kde_EnumDef*', +'EnumDef*' => 'kde_EnumDef*', +'EnumEntry*' => 'kde_EnumEntry*', +'Error*' => 'kde_Error*', +'Event*' => 'kde_Event*', +'ExecState*' => 'kde_ExecState*', +'ExtensionLoader*' => 'kde_ExtensionLoader*', +'FALSE' => '0', +'FILE*' => 'FILE*', +'FMOut*' => 'kde_FMOut*', +'Factory*' => 'kde_Factory*', +'False' => '0', +'FileCopyJob*' => 'kde_FileCopyJob*', +'FileProtocol*' => 'kde_FileProtocol*', +'FileView&' => 'int' , +'FloatAsyncStream*' => 'kde_FloatAsyncStream*', +'FloatDataPacket*' => 'kde_FloatDataPacket*', +'FlowSystem&' => 'kde_FlowSystem*', +'FlowSystem' => 'kde_FlowSystem*', +'FlowSystem*' => 'kde_FlowSystem*', +'FlowSystemReceiver&' => 'kde_FlowSystemReceiver*', +'FlowSystemReceiver' => 'kde_FlowSystemReceiver*', +'FlowSystemReceiver*' => 'kde_FlowSystemReceiver*', +'FlowSystemReceiver_base*' => 'kde_FlowSystemReceiver_base*', +'FlowSystemReceiver_skel*' => 'kde_FlowSystemReceiver_skel*', +'FlowSystemReceiver_stub*' => 'kde_FlowSystemReceiver_stub*', +'FlowSystemSender&' => 'kde_FlowSystemSender*', +'FlowSystemSender' => 'kde_FlowSystemSender*', +'FlowSystemSender*' => 'kde_FlowSystemSender*', +'FlowSystemSender_base*' => 'kde_FlowSystemSender_base*', +'FlowSystemSender_skel*' => 'kde_FlowSystemSender_skel*', +'FlowSystemSender_stub*' => 'kde_FlowSystemSender_stub*', +'FlowSystem_base*' => 'kde_FlowSystem_base*', +'FlowSystem_impl*' => 'kde_FlowSystem_impl*', +'FlowSystem_skel*' => 'kde_FlowSystem_skel*', +'FlowSystem_stub*' => 'kde_FlowSystem_stub*', +'FocusPolicy' => 'int', +'Format&' => 'kde_Format*', +'Format*' => 'kde_Format*', +'Function*' => 'kde_Function*', +'FunctionImp*' => 'kde_FunctionImp*', +'GCI&' => 'GCI*' , +'GCI' => 'GCI*' , +'GCI*' => 'GCI*' , +'GUIActivateEvent*' => 'kde_GUIActivateEvent*', +'GUIStyle' => 'int', +'GUSOut*' => 'kde_GUSOut*', +'GenericAsyncStream*' => 'kde_GenericAsyncStream*', +'GenericDataChannel*' => 'kde_GenericDataChannel*', +'GenericDataPacket*' => 'kde_GenericDataPacket*', +'GenericFactory*' => 'kde_GenericFactory*', +'GenericFactoryBase*' => 'kde_GenericFactoryBase*', +'Global*' => 'kde_Global*', +'GlobalComm&' => 'kde_GlobalComm*', +'GlobalComm' => 'kde_GlobalComm*', +'GlobalComm*' => 'kde_GlobalComm*', +'GlobalComm_base*' => 'kde_GlobalComm_base*', +'GlobalComm_skel*' => 'kde_GlobalComm_skel*', +'GlobalComm_stub*' => 'kde_GlobalComm_stub*', +'HANDLE' => 'unsigned int', +'HBITMAP' => 'void *' , +'HCURSOR' => 'void *' , +'HDC' => 'void *' , +'HFONT' => 'void *' , +'HPALETTE' => 'void *' , +'HRGN' => 'void *' , +'HTMLAnchorElement&' => 'kde_HTMLAnchorElement*', +'HTMLAnchorElement*' => 'kde_HTMLAnchorElement*', +'HTMLAnchorElementImpl*' => 'kde_HTMLAnchorElementImpl*', +'HTMLAppletElement&' => 'kde_HTMLAppletElement*', +'HTMLAppletElement*' => 'kde_HTMLAppletElement*', +'HTMLAppletElementImpl*' => 'kde_HTMLAppletElementImpl*', +'HTMLAreaElement&' => 'kde_HTMLAreaElement*', +'HTMLAreaElement*' => 'kde_HTMLAreaElement*', +'HTMLAreaElementImpl*' => 'kde_HTMLAreaElementImpl*', +'HTMLBRElement&' => 'kde_HTMLBRElement*', +'HTMLBRElement*' => 'kde_HTMLBRElement*', +'HTMLBRElementImpl*' => 'kde_HTMLBRElementImpl*', +'HTMLBaseElement&' => 'kde_HTMLBaseElement*', +'HTMLBaseElement*' => 'kde_HTMLBaseElement*', +'HTMLBaseElementImpl*' => 'kde_HTMLBaseElementImpl*', +'HTMLBaseFontElement&' => 'kde_HTMLBaseFontElement*', +'HTMLBaseFontElement*' => 'kde_HTMLBaseFontElement*', +'HTMLBaseFontElementImpl*' => 'kde_HTMLBaseFontElementImpl*', +'HTMLBlockquoteElement&' => 'kde_HTMLBlockquoteElement*', +'HTMLBlockquoteElement*' => 'kde_HTMLBlockquoteElement*', +'HTMLBlockquoteElementImpl*' => 'kde_HTMLBlockquoteElementImpl*', +'HTMLBodyElement&' => 'kde_HTMLBodyElement*', +'HTMLBodyElement*' => 'kde_HTMLBodyElement*', +'HTMLBodyElementImpl*' => 'kde_HTMLBodyElementImpl*', +'HTMLButtonElement&' => 'kde_HTMLButtonElement*', +'HTMLButtonElement*' => 'kde_HTMLButtonElement*', +'HTMLButtonElementImpl*' => 'kde_HTMLButtonElementImpl*', +'HTMLCollection&' => 'kde_HTMLCollection*', +'HTMLCollection' => 'kde_HTMLCollection*', +'HTMLCollection*' => 'kde_HTMLCollection*', +'HTMLCollectionImpl*' => 'kde_HTMLCollectionImpl*', +'HTMLDListElement&' => 'kde_HTMLDListElement*', +'HTMLDListElement*' => 'kde_HTMLDListElement*', +'HTMLDListElementImpl*' => 'kde_HTMLDListElementImpl*', +'HTMLDirectoryElement&' => 'kde_HTMLDirectoryElement*', +'HTMLDirectoryElement*' => 'kde_HTMLDirectoryElement*', +'HTMLDirectoryElementImpl*' => 'kde_HTMLDirectoryElementImpl*', +'HTMLDivElement&' => 'kde_HTMLDivElement*', +'HTMLDivElement*' => 'kde_HTMLDivElement*', +'HTMLDivElementImpl*' => 'kde_HTMLDivElementImpl*', +'HTMLDocument&' => 'kde_HTMLDocument*', +'HTMLDocument*' => 'kde_HTMLDocument*', +'HTMLDocumentImpl*' => 'kde_HTMLDocumentImpl*', +'HTMLElement&' => 'kde_HTMLElement*', +'HTMLElement' => 'kde_HTMLElement*', +'HTMLElement*' => 'kde_HTMLElement*', +'HTMLElementImpl*' => 'kde_HTMLElementImpl*', +'HTMLFieldSetElement&' => 'kde_HTMLFieldSetElement*', +'HTMLFieldSetElement*' => 'kde_HTMLFieldSetElement*', +'HTMLFieldSetElementImpl*' => 'kde_HTMLFieldSetElementImpl*', +'HTMLFontElement&' => 'kde_HTMLFontElement*', +'HTMLFontElement*' => 'kde_HTMLFontElement*', +'HTMLFontElementImpl*' => 'kde_HTMLFontElementImpl*', +'HTMLFormElement&' => 'kde_HTMLFormElement*', +'HTMLFormElement' => 'kde_HTMLFormElement*', +'HTMLFormElement*' => 'kde_HTMLFormElement*', +'HTMLFormElementImpl*' => 'kde_HTMLFormElementImpl*', +'HTMLFrameElement&' => 'kde_HTMLFrameElement*', +'HTMLFrameElement*' => 'kde_HTMLFrameElement*', +'HTMLFrameElementImpl*' => 'kde_HTMLFrameElementImpl*', +'HTMLFrameSetElement&' => 'kde_HTMLFrameSetElement*', +'HTMLFrameSetElement*' => 'kde_HTMLFrameSetElement*', +'HTMLFrameSetElementImpl*' => 'kde_HTMLFrameSetElementImpl*', +'HTMLHRElement&' => 'kde_HTMLHRElement*', +'HTMLHRElement*' => 'kde_HTMLHRElement*', +'HTMLHRElementImpl*' => 'kde_HTMLHRElementImpl*', +'HTMLHeadElement&' => 'kde_HTMLHeadElement*', +'HTMLHeadElement*' => 'kde_HTMLHeadElement*', +'HTMLHeadElementImpl*' => 'kde_HTMLHeadElementImpl*', +'HTMLHeadingElement&' => 'kde_HTMLHeadingElement*', +'HTMLHeadingElement*' => 'kde_HTMLHeadingElement*', +'HTMLHeadingElementImpl*' => 'kde_HTMLHeadingElementImpl*', +'HTMLHtmlElement&' => 'kde_HTMLHtmlElement*', +'HTMLHtmlElement*' => 'kde_HTMLHtmlElement*', +'HTMLHtmlElementImpl*' => 'kde_HTMLHtmlElementImpl*', +'HTMLIFrameElement&' => 'kde_HTMLIFrameElement*', +'HTMLIFrameElement*' => 'kde_HTMLIFrameElement*', +'HTMLIFrameElementImpl*' => 'kde_HTMLIFrameElementImpl*', +'HTMLImageElement&' => 'kde_HTMLImageElement*', +'HTMLImageElement*' => 'kde_HTMLImageElement*', +'HTMLImageElementImpl*' => 'kde_HTMLImageElementImpl*', +'HTMLInputElement&' => 'kde_HTMLInputElement*', +'HTMLInputElement*' => 'kde_HTMLInputElement*', +'HTMLInputElementImpl*' => 'kde_HTMLInputElementImpl*', +'HTMLIsIndexElement&' => 'kde_HTMLIsIndexElement*', +'HTMLIsIndexElement*' => 'kde_HTMLIsIndexElement*', +'HTMLIsIndexElementImpl*' => 'kde_HTMLIsIndexElementImpl*', +'HTMLLIElement&' => 'kde_HTMLLIElement*', +'HTMLLIElement*' => 'kde_HTMLLIElement*', +'HTMLLIElementImpl*' => 'kde_HTMLLIElementImpl*', +'HTMLLabelElement&' => 'kde_HTMLLabelElement*', +'HTMLLabelElement*' => 'kde_HTMLLabelElement*', +'HTMLLabelElementImpl*' => 'kde_HTMLLabelElementImpl*', +'HTMLLegendElement&' => 'kde_HTMLLegendElement*', +'HTMLLegendElement*' => 'kde_HTMLLegendElement*', +'HTMLLegendElementImpl*' => 'kde_HTMLLegendElementImpl*', +'HTMLLinkElement&' => 'kde_HTMLLinkElement*', +'HTMLLinkElement*' => 'kde_HTMLLinkElement*', +'HTMLLinkElementImpl*' => 'kde_HTMLLinkElementImpl*', +'HTMLMapElement&' => 'kde_HTMLMapElement*', +'HTMLMapElement*' => 'kde_HTMLMapElement*', +'HTMLMapElementImpl*' => 'kde_HTMLMapElementImpl*', +'HTMLMenuElement&' => 'kde_HTMLMenuElement*', +'HTMLMenuElement*' => 'kde_HTMLMenuElement*', +'HTMLMenuElementImpl*' => 'kde_HTMLMenuElementImpl*', +'HTMLMetaElement&' => 'kde_HTMLMetaElement*', +'HTMLMetaElement*' => 'kde_HTMLMetaElement*', +'HTMLMetaElementImpl*' => 'kde_HTMLMetaElementImpl*', +'HTMLModElement&' => 'kde_HTMLModElement*', +'HTMLModElement*' => 'kde_HTMLModElement*', +'HTMLModElementImpl*' => 'kde_HTMLModElementImpl*', +'HTMLOListElement&' => 'kde_HTMLOListElement*', +'HTMLOListElement*' => 'kde_HTMLOListElement*', +'HTMLOListElementImpl*' => 'kde_HTMLOListElementImpl*', +'HTMLObjectElement&' => 'kde_HTMLObjectElement*', +'HTMLObjectElement*' => 'kde_HTMLObjectElement*', +'HTMLObjectElementImpl*' => 'kde_HTMLObjectElementImpl*', +'HTMLOptGroupElement&' => 'kde_HTMLOptGroupElement*', +'HTMLOptGroupElement*' => 'kde_HTMLOptGroupElement*', +'HTMLOptGroupElementImpl*' => 'kde_HTMLOptGroupElementImpl*', +'HTMLOptionElement&' => 'kde_HTMLOptionElement*', +'HTMLOptionElement*' => 'kde_HTMLOptionElement*', +'HTMLOptionElementImpl*' => 'kde_HTMLOptionElementImpl*', +'HTMLParagraphElement&' => 'kde_HTMLParagraphElement*', +'HTMLParagraphElement*' => 'kde_HTMLParagraphElement*', +'HTMLParagraphElementImpl*' => 'kde_HTMLParagraphElementImpl*', +'HTMLParamElement&' => 'kde_HTMLParamElement*', +'HTMLParamElement*' => 'kde_HTMLParamElement*', +'HTMLParamElementImpl*' => 'kde_HTMLParamElementImpl*', +'HTMLPreElement&' => 'kde_HTMLPreElement*', +'HTMLPreElement*' => 'kde_HTMLPreElement*', +'HTMLPreElementImpl*' => 'kde_HTMLPreElementImpl*', +'HTMLQuoteElement&' => 'kde_HTMLQuoteElement*', +'HTMLQuoteElement*' => 'kde_HTMLQuoteElement*', +'HTMLQuoteElementImpl*' => 'kde_HTMLQuoteElementImpl*', +'HTMLScriptElement&' => 'kde_HTMLScriptElement*', +'HTMLScriptElement*' => 'kde_HTMLScriptElement*', +'HTMLScriptElementImpl*' => 'kde_HTMLScriptElementImpl*', +'HTMLSelectElement&' => 'kde_HTMLSelectElement*', +'HTMLSelectElement*' => 'kde_HTMLSelectElement*', +'HTMLSelectElementImpl*' => 'kde_HTMLSelectElementImpl*', +'HTMLStyleElement&' => 'kde_HTMLStyleElement*', +'HTMLStyleElement*' => 'kde_HTMLStyleElement*', +'HTMLStyleElementImpl*' => 'kde_HTMLStyleElementImpl*', +'HTMLTableCaptionElement&' => 'kde_HTMLTableCaptionElement*', +'HTMLTableCaptionElement' => 'kde_HTMLTableCaptionElement*', +'HTMLTableCaptionElement*' => 'kde_HTMLTableCaptionElement*', +'HTMLTableCaptionElementImpl*' => 'kde_HTMLTableCaptionElementImpl*', +'HTMLTableCellElement&' => 'kde_HTMLTableCellElement*', +'HTMLTableCellElement*' => 'kde_HTMLTableCellElement*', +'HTMLTableCellElementImpl*' => 'kde_HTMLTableCellElementImpl*', +'HTMLTableColElement&' => 'kde_HTMLTableColElement*', +'HTMLTableColElement*' => 'kde_HTMLTableColElement*', +'HTMLTableColElementImpl*' => 'kde_HTMLTableColElementImpl*', +'HTMLTableElement&' => 'kde_HTMLTableElement*', +'HTMLTableElement*' => 'kde_HTMLTableElement*', +'HTMLTableElementImpl*' => 'kde_HTMLTableElementImpl*', +'HTMLTableRowElement&' => 'kde_HTMLTableRowElement*', +'HTMLTableRowElement*' => 'kde_HTMLTableRowElement*', +'HTMLTableRowElementImpl*' => 'kde_HTMLTableRowElementImpl*', +'HTMLTableSectionElement&' => 'kde_HTMLTableSectionElement*', +'HTMLTableSectionElement' => 'kde_HTMLTableSectionElement*', +'HTMLTableSectionElement*' => 'kde_HTMLTableSectionElement*', +'HTMLTableSectionElementImpl*' => 'kde_HTMLTableSectionElementImpl*', +'HTMLTextAreaElement&' => 'kde_HTMLTextAreaElement*', +'HTMLTextAreaElement*' => 'kde_HTMLTextAreaElement*', +'HTMLTextAreaElementImpl*' => 'kde_HTMLTextAreaElementImpl*', +'HTMLTitleElement&' => 'kde_HTMLTitleElement*', +'HTMLTitleElement*' => 'kde_HTMLTitleElement*', +'HTMLTitleElementImpl*' => 'kde_HTMLTitleElementImpl*', +'HTMLUListElement&' => 'kde_HTMLUListElement*', +'HTMLUListElement*' => 'kde_HTMLUListElement*', +'HTMLUListElementImpl*' => 'kde_HTMLUListElementImpl*', +'HandlerType' => 'qt_HandlerType*' , +'HashEntry*' => 'kde_HashEntry*', +'HashTable*' => 'kde_HashTable*', +'Header&' => 'kde_Header*', +'Header*' => 'kde_Header*', +'HighlightingInterface*' => 'kde_HighlightingInterface*', +'HistoryProvider*' => 'kde_HistoryProvider*', +'HostImp*' => 'kde_HostImp*', +'IDLFileReg*' => 'kde_IDLFileReg*', +'IOManager*' => 'kde_IOManager*', +'IONotify*' => 'kde_IONotify*', +'IOType*' => 'kde_IOType*', +'IOWatchFD*' => 'kde_IOWatchFD*', +'Icon' => 'int', +'IconListBox*' => 'kde_IconListBox*', +'Imp*' => 'void*', +'Info*' => 'kde_Info*', +'InterfaceDef&' => 'kde_InterfaceDef*', +'InterfaceDef' => 'kde_InterfaceDef*', +'InterfaceDef*' => 'kde_InterfaceDef*', +'InterfaceEntry*' => 'kde_InterfaceEntry*', +'InterfaceRepo&' => 'kde_InterfaceRepo*', +'InterfaceRepo' => 'kde_InterfaceRepo*', +'InterfaceRepo*' => 'kde_InterfaceRepo*', +'InterfaceRepo_base*' => 'kde_InterfaceRepo_base*', +'InterfaceRepo_impl*' => 'kde_InterfaceRepo_impl*', +'InterfaceRepo_skel*' => 'kde_InterfaceRepo_skel*', +'InterfaceRepo_stub*' => 'kde_InterfaceRepo_stub*', +'InternalFunctionImp*' => 'kde_InternalFunctionImp*', +'Interpreter*' => 'kde_Interpreter*', +'Invocation&' => 'kde_Invocation*', +'Invocation*' => 'kde_Invocation*', +'Iterator' => 'Iterator*' , +'Job*' => 'void*', +'K&' => 'K*' , +'KAboutApplication*' => 'kde_KAboutApplication*', +'KAboutContainer*' => 'kde_KAboutContainer*' , +'KAboutContributor*' => 'kde_KAboutContributor*', +'KAboutData*' => 'kde_KAboutData*' , +'KAboutDialog*' => 'kde_KAboutDialog*', +'KAboutKDE*' => 'kde_KAboutKDE*', +'KAboutPerson*' => 'kde_KAboutPerson*', +'KAboutTranslator*' => 'kde_KAboutTranslator*', +'KAboutWidget*' => 'kde_KAboutWidget*', +'KAccel*' => 'kde_KAccel*' , +'KAccelAction&' => 'kde_KAccelAction*', +'KAccelAction*' => 'kde_KAccelAction*', +'KAccelActions&' => 'kde_KAccelActions*', +'KAccelActions*' => 'kde_KAccelActions*', +'KAccelBase*' => 'kde_KAccelBase*', +'KAccelGen*' => 'kde_KAccelGen*', +'KAccelMenu*' => 'kde_KAccelMenu*', +'KAccelSequence&' => 'kde_KAccelSequence*', +'KAccelSequence' => 'kde_KAccelSequence*', +'KAccelSequence*' => 'kde_KAccelSequence*', +'KAccelShortcut&' => 'kde_KAccelShortcut*', +'KAccelShortcut' => 'kde_KAccelShortcut*', +'KAccelShortcut*' => 'kde_KAccelShortcut*', +'KAccelShortcuts&' => 'kde_KAccelShortcuts*', +'KAccelShortcuts*' => 'kde_KAccelShortcuts*', +'KAction*' => 'kde_KAction*' , +'KActionCollection&' => 'kde_KActionCollection*' , +'KActionCollection' => 'kde_KActionCollection*' , +'KActionCollection*' => 'kde_KActionCollection*' , +'KActionMenu*' => 'kde_KActionMenu*', +'KActionSeparator*' => 'kde_KActionSeparator*', +'KAddressInfo*' => 'kde_KAddressInfo*', +'KAlphaPainter*' => 'kde_KAlphaPainter*', +'KAnimWidget*' => 'kde_KAnimWidget*' , +'KAppTreeListItem*' => 'kde_KAppTreeListItem*' , +'KApplication*' => 'kde_KApplication*' , +'KApplicationPropsPlugin*' => 'kde_KApplicationPropsPlugin*', +'KApplicationTree*' => 'kde_KApplicationTree*', +'KArchive*' => 'kde_KArchive*', +'KArchiveDirectory*' => 'kde_KArchiveDirectory*', +'KArchiveEntry*' => 'kde_KArchiveEntry*', +'KArchiveFile*' => 'kde_KArchiveFile*', +'KArrowButton*' => 'kde_KArrowButton*', +'KArtsDispatcher*' => 'kde_KArtsDispatcher*', +'KArtsFloatWatch*' => 'kde_KArtsFloatWatch*', +'KAsyncIO*' => 'kde_KAsyncIO*', +'KAudioPlayer*' => 'kde_KAudioPlayer*', +'KAuthIcon*' => 'kde_KAuthIcon*', +'KAutoMount*' => 'kde_KAutoMount*', +'KAutoUnmount*' => 'kde_KAutoUnmount*', +'KBindingPropsPlugin*' => 'kde_KBindingPropsPlugin*', +'KBlankEffect*' => 'kde_KBlankEffect*', +'KBufferedIO*' => 'kde_KBufferedIO*', +'KBugReport*' => 'kde_KBugReport*', +'KButtonBox*' => 'kde_KButtonBox*', +'KCModule*' => 'kde_KCModule*' , +'KCatalogue&' => 'kde_KCatalogue*', +'KCatalogue*' => 'kde_KCatalogue*', +'KCharSelect*' => 'kde_KCharSelect*', +'KCharSelectTable*' => 'kde_KCharSelectTable*', +'KCharsets*' => 'kde_KCharsets*' , +'KCmdLineArgs*' => 'kde_KCmdLineArgs*' , +'KCmdLineOptions*' => 'kde_KCmdLineOptions*' , +'KCodecs*' => 'kde_KCodecs*', +'KColor&' => 'kde_KColor*' , +'KColor*' => 'kde_KColor*', +'KColorButton*' => 'kde_KColorButton*', +'KColorCells*' => 'kde_KColorCells*', +'KColorCombo*' => 'kde_KColorCombo*', +'KColorDialog*' => 'kde_KColorDialog*', +'KColorDrag*' => 'kde_KColorDrag*' , +'KColorPatch*' => 'kde_KColorPatch*', +'KCombiView*' => 'kde_KCombiView*', +'KComboBox*' => 'kde_KComboBox*' , +'KCommand*' => 'kde_KCommand*', +'KCommandHistory*' => 'kde_KCommandHistory*', +'KCompletion*' => 'kde_KCompletion*' , +'KCompletionBase*' => 'kde_KCompletionBase*', +'KCompletionBase::KeyBindingType' => 'kde_KCompletionBase_KeyBindingType*' , +'KCompletionBox*' => 'kde_KCompletionBox*', +'KConfig*' => 'kde_KConfig*' , +'KConfigBackEnd*' => 'kde_KConfigBackEnd*', +'KConfigBase&' => 'kde_KConfigBase*', +'KConfigBase*' => 'kde_KConfigBase*' , +'KConfigBase::ConfigState' => 'kde_KConfigBase_ConfigState' , +'KConfigGroup*' => 'kde_KConfigGroup*', +'KConfigGroupSaver*' => 'kde_KConfigGroupSaver*', +'KConfigINIBackEnd*' => 'kde_KConfigINIBackEnd*', +'KContainerLayout*' => 'kde_KContainerLayout*', +'KContainerLayoutItem*' => 'kde_KContainerLayoutItem*' , +'KContextMenuManager*' => 'kde_KContextMenuManager*', +'KCookie*' => 'kde_KCookie*', +'KCrash*' => 'kde_KCrash*', +'KCursor*' => 'kde_KCursor*', +'KDBGFUNC' => 'void *' , +'KDCOPActionProxy*' => 'kde_KDCOPActionProxy*', +'KDCOPPropertyProxy*' => 'kde_KDCOPPropertyProxy*', +'KDEAniMenu*' => 'kde_KDEAniMenu*', +'KDEDModule*' => 'kde_KDEDModule*', +'KDEDesktopMimeType*' => 'kde_KDEDesktopMimeType*', +'KDEDesktopMimeType::Service&' => 'kde_KDEDesktopMimeType_Service*' , +'KDESasl*' => 'kde_KDESasl*', +'KDEStyle*' => 'kde_KDEStyle*', +'KDEsuClient*' => 'kde_KDEsuClient*', +'KDataTool*' => 'kde_KDataTool*', +'KDataToolAction*' => 'kde_KDataToolAction*', +'KDataToolInfo&' => 'kde_KDataToolInfo*', +'KDataToolInfo*' => 'kde_KDataToolInfo*', +'KDateInternalMonthPicker*' => 'kde_KDateInternalMonthPicker*', +'KDateInternalYearSelector*' => 'kde_KDateInternalYearSelector*', +'KDatePicker*' => 'kde_KDatePicker*', +'KDateTable*' => 'kde_KDateTable*', +'KDateValidator*' => 'kde_KDateValidator*', +'KDateWidget*' => 'kde_KDateWidget*', +'KDesktopFile*' => 'kde_KDesktopFile*' , +'KDevApi*' => 'kde_KDevApi*', +'KDevAppFrontend*' => 'kde_KDevAppFrontend*', +'KDevCompilerOptions*' => 'kde_KDevCompilerOptions*', +'KDevCore*' => 'kde_KDevCore*', +'KDevFactory*' => 'kde_KDevFactory*', +'KDevLanguageSupport*' => 'kde_KDevLanguageSupport*', +'KDevMakeFrontend*' => 'kde_KDevMakeFrontend*', +'KDevPart*' => 'kde_KDevPart*', +'KDevProject*' => 'kde_KDevProject*', +'KDevVersionControl*' => 'kde_KDevVersionControl*', +'KDevicePropsPlugin*' => 'kde_KDevicePropsPlugin*', +'KDialog*' => 'kde_KDialog*', +'KDialogBase*' => 'kde_KDialogBase*' , +'KDialogBaseTile*' => 'kde_KDialogBaseTile*', +'KDialogQueue*' => 'kde_KDialogQueue*', +'KDirLister*' => 'kde_KDirLister*', +'KDirNotify*' => 'kde_KDirNotify*', +'KDirNotify_stub*' => 'kde_KDirNotify_stub*', +'KDirOperator*' => 'kde_KDirOperator*', +'KDirSelectDialog*' => 'kde_KDirSelectDialog*', +'KDirSize*' => 'kde_KDirSize*' , +'KDirWatch*' => 'kde_KDirWatch*' , +'KDirectionButton*' => 'kde_KDirectionButton*', +'KDockArea*' => 'kde_KDockArea*', +'KDockMainWindow*' => 'kde_KDockMainWindow*', +'KDockManager*' => 'kde_KDockManager*' , +'KDockTabBar*' => 'kde_KDockTabBar*', +'KDockTabBar::TabPos' => 'int', +'KDockTabBarPainter*' => 'kde_KDockTabBarPainter*', +'KDockTabCtl*' => 'kde_KDockTabCtl*', +'KDockTabCtl_PrivateStruct*' => 'kde_KDockTabCtl_PrivateStruct*' , +'KDockTabGroup*' => 'kde_KDockTabGroup*' , +'KDockWidget*' => 'kde_KDockWidget*' , +'KDockWidgetAbstractHeader*' => 'kde_KDockWidgetAbstractHeader*' , +'KDockWidgetAbstractHeaderDrag*' => 'kde_KDockWidgetAbstractHeaderDrag*', +'KDockWidgetHeader*' => 'kde_KDockWidgetHeader*', +'KDockWidgetHeaderDrag*' => 'kde_KDockWidgetHeaderDrag*', +'KDockWindow*' => 'kde_KDockWindow*', +'KDoubleNumInput*' => 'kde_KDoubleNumInput*', +'KDualColorButton*' => 'kde_KDualColorButton*', +'KEMailSettings*' => 'kde_KEMailSettings*', +'KEdFind*' => 'kde_KEdFind*', +'KEdGotoLine*' => 'kde_KEdGotoLine*', +'KEdReplace*' => 'kde_KEdReplace*', +'KEdit*' => 'kde_KEdit*', +'KEditListBox*' => 'kde_KEditListBox*', +'KEditToolbar*' => 'kde_KEditToolbar*', +'KEditToolbarWidget*' => 'kde_KEditToolbarWidget*', +'KEntry&' => 'kde_KEntry*' , +'KEntry' => 'kde_KEntry*' , +'KEntry*' => 'kde_KEntry*', +'KEntryKey&' => 'kde_KEntryKey*' , +'KEntryKey*' => 'kde_KEntryKey*', +'KEntryMap' => 'kde_KEntryMap*' , +'KEntryMap*' => 'kde_KEntryMap*' , +'KExecMimeType*' => 'kde_KExecMimeType*', +'KExecPropsPlugin*' => 'kde_KExecPropsPlugin*', +'KExtendedSocket*' => 'kde_KExtendedSocket*', +'KFile*' => 'kde_KFile*', +'KFile::FileView' => 'int' , +'KFile::Mode' => 'int' , +'KFile::SelectionMode' => 'int' , +'KFileBookmark*' => 'kde_KFileBookmark*' , +'KFileBookmarkManager*' => 'kde_KFileBookmarkManager*', +'KFileComboBox*' => 'kde_KFileComboBox*', +'KFileDetailView*' => 'kde_KFileDetailView*', +'KFileDialog*' => 'kde_KFileDialog*' , +'KFileFilter*' => 'kde_KFileFilter*', +'KFileFilterCombo*' => 'kde_KFileFilterCombo*', +'KFileIconView*' => 'kde_KFileIconView*', +'KFileIconViewItem*' => 'kde_KFileIconViewItem*', +'KFileItem&' => 'kde_KFileItem*', +'KFileItem*' => 'kde_KFileItem*' , +'KFileItemList&' => 'kde_KFileItemList*' , +'KFileItemList' => 'kde_KFileItemList*' , +'KFileItemList*' => 'kde_KFileItemList*' , +'KFileListViewItem*' => 'kde_KFileListViewItem*', +'KFileMetaInfo*' => 'kde_KFileMetaInfo*', +'KFileMetaInfoItem*' => 'kde_KFileMetaInfoItem*', +'KFileMetaInfoProvider*' => 'kde_KFileMetaInfoProvider*', +'KFileOpenWithHandler*' => 'kde_KFileOpenWithHandler*', +'KFilePermissionsPropsPlugin*' => 'kde_KFilePermissionsPropsPlugin*', +'KFilePlugin*' => 'kde_KFilePlugin*', +'KFilePreview*' => 'kde_KFilePreview*', +'KFilePropsPlugin*' => 'kde_KFilePropsPlugin*', +'KFileReader*' => 'kde_KFileReader*' , +'KFileTreeBranch*' => 'kde_KFileTreeBranch*', +'KFileTreeView*' => 'kde_KFileTreeView*', +'KFileTreeViewItem*' => 'kde_KFileTreeViewItem*', +'KFileTreeViewToolTip*' => 'kde_KFileTreeViewToolTip*', +'KFileView*' => 'kde_KFileView*' , +'KFileView::FileView' => 'int', +'KFileViewItem&' => 'kde_KFileViewItem*', +'KFileViewItem*' => 'kde_KFileViewItem*' , +'KFileViewItem**' => 'kde_KFileViewItem**' , +'KFileViewItemList&' => 'kde_KFileViewItemList*' , +'KFileViewItemList*' => 'kde_KFileViewItemList*' , +'KFileViewSignaler*' => 'kde_KFileViewSignaler*', +'KFilterBase*' => 'kde_KFilterBase*', +'KFilterDev*' => 'kde_KFilterDev*', +'KFloatValidator*' => 'kde_KFloatValidator*', +'KFloatWatchProxy&' => 'kde_KFloatWatchProxy*', +'KFloatWatchProxy' => 'kde_KFloatWatchProxy*', +'KFloatWatchProxy*' => 'kde_KFloatWatchProxy*', +'KFolderType*' => 'kde_KFolderType*', +'KFontAction*' => 'kde_KFontAction*', +'KFontChooser*' => 'kde_KFontChooser*', +'KFontCombo*' => 'kde_KFontCombo*', +'KFontDialog*' => 'kde_KFontDialog*', +'KFontSizeAction*' => 'kde_KFontSizeAction*', +'KGenericFactory*' => 'kde_KGenericFactory*', +'KGenericFactoryBase*' => 'kde_KGenericFactoryBase*', +'KGlobal*' => 'kde_KGlobal*', +'KGlobalAccel*' => 'kde_KGlobalAccel*' , +'KGlobalSettings*' => 'kde_KGlobalSettings*', +'KGlobalSettings::Completion' => 'int' , +'KGradientSelector*' => 'kde_KGradientSelector*', +'KGuiItem&' => 'kde_KGuiItem*', +'KGuiItem' => 'kde_KGuiItem*', +'KGuiItem*' => 'kde_KGuiItem*', +'KHSSelector*' => 'kde_KHSSelector*', +'KHTMLPart*' => 'kde_KHTMLPart*' , +'KHTMLSettings&' => 'kde_KHTMLSettings*', +'KHTMLSettings*' => 'kde_KHTMLSettings*' , +'KHTMLView*' => 'kde_KHTMLView*' , +'KHelpMenu*' => 'kde_KHelpMenu*', +'KHistoryCombo*' => 'kde_KHistoryCombo*', +'KIO*' => 'kde_KIO*', +'KIO::AuthInfo&' => 'kde_AuthInfo*', +'KIO::CopyJob*' => 'kde_CopyJob*' , +'KIO::DeleteJob*' => 'kde_DeleteJob*' , +'KIO::Job*' => 'kde_Job*' , +'KIO::ListJob*' => 'kde_ListJob*' , +'KIO::MetaData&' => 'kde_MetaData*', +'KIO::RenameDlg_Mode' => 'int', +'KIO::RenameDlg_Result' => 'int', +'KIO::SimpleJob*' => 'kde_SimpleJob*', +'KIO::SkipDlg_Result' => 'int', +'KIO::Slave*' => 'kde_Slave*', +'KIO::UDSEntry&' => 'kde_UDSEntry*' , +'KIO::UDSEntryList&' => 'kde_UDSEntryList*' , +'KIOInputStream&' => 'kde_KIOInputStream*', +'KIOInputStream*' => 'kde_KIOInputStream*', +'KIOTestSlow&' => 'kde_KIOTestSlow*', +'KIOTestSlow' => 'kde_KIOTestSlow*', +'KIOTestSlow*' => 'kde_KIOTestSlow*', +'KIPC*' => 'kde_KIPC*', +'KIcon' => 'kde_KIcon*' , +'KIcon*' => 'kde_KIcon*', +'KIconButton*' => 'kde_KIconButton*', +'KIconCanvas*' => 'kde_KIconCanvas*', +'KIconDialog*' => 'kde_KIconDialog*', +'KIconEffect*' => 'kde_KIconEffect*' , +'KIconLoader*' => 'kde_KIconLoader*' , +'KIconSelectAction*' => 'kde_KIconSelectAction*', +'KIconTheme*' => 'kde_KIconTheme*' , +'KIconView*' => 'kde_KIconView*', +'KIconViewItem*' => 'kde_KIconViewItem*', +'KImageEffect*' => 'kde_KImageEffect*', +'KImageFilePreview*' => 'kde_KImageFilePreview*', +'KImageIO*' => 'kde_KImageIO*', +'KInetSocketAddress&' => 'kde_KInetSocketAddress*', +'KInetSocketAddress*' => 'kde_KInetSocketAddress*', +'KInstance&' => 'kde_KInstance*' , +'KInstance' => 'kde_KInstance*' , +'KInstance*' => 'kde_KInstance*' , +'KIntNumInput*' => 'kde_KIntNumInput*', +'KIntSpinBox*' => 'kde_KIntSpinBox*', +'KIntValidator*' => 'kde_KIntValidator*', +'KJS*' => 'kde_KJS*', +'KJS::KJSO&' => 'kde_KJS_KJSO*', +'KJS::UString&' => 'kde_KJS_UString*', +'KJSO&' => 'kde_KJSO*', +'KJSO' => 'kde_KJSO*', +'KJSO*' => 'kde_KJSO*', +'KJScript*' => 'kde_KJScript*', +'KJanusWidget*' => 'kde_KJanusWidget*', +'KJavaApplet*' => 'kde_KJavaApplet*' , +'KJavaAppletContext*' => 'kde_KJavaAppletContext*' , +'KJavaAppletServer*' => 'kde_KJavaAppletServer*' , +'KJavaAppletWidget*' => 'kde_KJavaAppletWidget*', +'KJavaProcess*' => 'kde_KJavaProcess*', +'KJavaScriptAdvice&' => 'kde_KJavaScriptAdvice*' , +'KKeyChooser*' => 'kde_KKeyChooser*', +'KKeyChooserItem*' => 'kde_KKeyChooserItem*', +'KKeyDialog*' => 'kde_KKeyDialog*', +'KKeyEntry&' => 'kde_KKeyEntry*' , +'KKeyEntry*' => 'kde_KKeyEntry*', +'KKeyEntryMap&' => 'kde_KKeyEntryMap*' , +'KKeyEntryMap' => 'kde_KKeyEntryMap*' , +'KKeyEntryMap*' => 'kde_KKeyEntryMap*' , +'KKeySequence&' => 'kde_KKeySequence*', +'KKeySequence' => 'kde_KKeySequence*', +'KKeySequence*' => 'kde_KKeySequence*', +'KKeySequence::I18N' => 'int', +'KKeySequences&' => 'kde_KKeySequences*', +'KKeySequences' => 'kde_KKeySequences*', +'KKeySequences*' => 'kde_KKeySequences*', +'KLed*' => 'kde_KLed*', +'KLibFactory*' => 'kde_KLibFactory*' , +'KLibLoader*' => 'kde_KLibLoader*' , +'KLibrary*' => 'kde_KLibrary*' , +'KLineEdit*' => 'kde_KLineEdit*' , +'KLineEditDlg*' => 'kde_KLineEditDlg*', +'KListAction*' => 'kde_KListAction*', +'KListBox*' => 'kde_KListBox*', +'KListView*' => 'kde_KListView*' , +'KListViewItem*' => 'kde_KListViewItem*', +'KLocale&' => 'kde_KLocale*' , +'KLocale*' => 'kde_KLocale*' , +'KMJobViewer*' => 'kde_KMJobViewer*', +'KMMainView*' => 'kde_KMMainView*', +'KMManager*' => 'kde_KMManager*', +'KMObject*' => 'kde_KMObject*', +'KMPrinter&' => 'kde_KMPrinter*', +'KMPrinter*' => 'kde_KMPrinter*', +'KMPrinterList*' => 'kde_KMPrinterList*', +'KMPrinterPage*' => 'kde_KMPrinterPage*', +'KMacroCommand*' => 'kde_KMacroCommand*', +'KMainWindow*' => 'kde_KMainWindow*', +'KMainWindowInterface*' => 'kde_KMainWindowInterface*', +'KMenuBar*' => 'kde_KMenuBar*' , +'KMessageBox*' => 'kde_KMessageBox*', +'KMidSimpleAPI*' => 'kde_KMidSimpleAPI*', +'KMimeMagic*' => 'kde_KMimeMagic*' , +'KMimeMagicResult*' => 'kde_KMimeMagicResult*' , +'KMimeSourceFactory*' => 'kde_KMimeSourceFactory*' , +'KMimeType*' => 'kde_KMimeType*', +'KMimeType::List&' => 'kde_KMimeType_List*' , +'KMimeType::Ptr&' => 'kde_KMimeType_Ptr*' , +'KMimeType::Ptr' => 'kde_KMimeType_Ptr' , +'KMouseSettings*' => 'kde_KMouseSettings*', +'KMultipleDrag*' => 'kde_KMultipleDrag*', +'KNDBGFUNC' => 'void *' , +'KNotifyClient*' => 'kde_KNotifyClient*', +'KNumInput*' => 'kde_KNumInput*' , +'KOCRDialog*' => 'kde_KOCRDialog*', +'KOCRDialogFactory*' => 'kde_KOCRDialogFactory*', +'KOpenSSLProxy*' => 'kde_KOpenSSLProxy*', +'KOpenWithDlg*' => 'kde_KOpenWithDlg*', +'KOpenWithHandler*' => 'kde_KOpenWithHandler*' , +'KPAC*' => 'kde_KPAC*', +'KPReloadObject*' => 'kde_KPReloadObject*', +'KPalette&' => 'kde_KPalette*' , +'KPalette*' => 'kde_KPalette*', +'KPaletteTable*' => 'kde_KPaletteTable*', +'KPanelAppMenu*' => 'kde_KPanelAppMenu*', +'KPanelApplet*' => 'kde_KPanelApplet*', +'KPanelExtension*' => 'kde_KPanelExtension*', +'KPanelMenu*' => 'kde_KPanelMenu*' , +'KParts*' => 'kde_KParts*', +'KParts::BrowserExtension*' => 'kde_BrowserExtension*' , +'KParts::GUIActivateEvent*' => 'kde_GUIActivateEvent*' , +'KParts::Part*' => 'kde_Part*', +'KParts::PartManager*' => 'kde_PartManager*' , +'KParts::ReadOnlyPart*' => 'kde_ReadOnlyPart*' , +'KParts::URLArgs&' => 'kde_URLArgs*' , +'KParts::URLArgs' => 'kde_URLArgs*', +'KPasswordDialog*' => 'kde_KPasswordDialog*', +'KPasswordEdit*' => 'kde_KPasswordEdit*', +'KPixmap&' => 'kde_KPixmap*' , +'KPixmap' => 'kde_KPixmap*' , +'KPixmap*' => 'kde_KPixmap*', +'KPixmapEffect*' => 'kde_KPixmapEffect*', +'KPixmapIO*' => 'kde_KPixmapIO*', +'KPixmapProvider*' => 'kde_KPixmapProvider*' , +'KPixmapSplitter*' => 'kde_KPixmapSplitter*', +'KPlayObject*' => 'kde_KPlayObject*', +'KPlayObjectFactory*' => 'kde_KPlayObjectFactory*', +'KPopupFrame*' => 'kde_KPopupFrame*', +'KPopupMenu*' => 'kde_KPopupMenu*' , +'KPopupTitle*' => 'kde_KPopupTitle*', +'KPreviewWidgetBase*' => 'kde_KPreviewWidgetBase*', +'KPrintAction*' => 'kde_KPrintAction*', +'KPrintDialogPage*' => 'kde_KPrintDialogPage*', +'KPrinter*' => 'kde_KPrinter*', +'KPrinterWrapper*' => 'kde_KPrinterWrapper*', +'KProcIO*' => 'kde_KProcIO*' , +'KProcess&' => 'kde_KProcess*' , +'KProcess*' => 'kde_KProcess*' , +'KProcessController*' => 'kde_KProcessController*', +'KProcessRunner*' => 'kde_KProcessRunner*', +'KProgress*' => 'kde_KProgress*', +'KPropertiesDialog*' => 'kde_KPropertiesDialog*' , +'KPropsDlgPlugin*' => 'kde_KPropsDlgPlugin*' , +'KProtocolInfo*' => 'kde_KProtocolInfo*', +'KProtocolManager*' => 'kde_KProtocolManager*', +'KPushButton*' => 'kde_KPushButton*', +'KRFCDate*' => 'kde_KRFCDate*', +'KRadioAction*' => 'kde_KRadioAction*', +'KRandomSequence*' => 'kde_KRandomSequence*', +'KRecentDocument*' => 'kde_KRecentDocument*', +'KRecentFilesAction*' => 'kde_KRecentFilesAction*' , +'KRegExp*' => 'kde_KRegExp*', +'KRegExpEditor*' => 'kde_KRegExpEditor*', +'KRegExpEditorInterface*' => 'kde_KRegExpEditorInterface*', +'KRestrictedLine*' => 'kde_KRestrictedLine*', +'KRootPermsIcon*' => 'kde_KRootPermsIcon*', +'KRootPixmap*' => 'kde_KRootPixmap*', +'KRootProp*' => 'kde_KRootProp*', +'KRuler*' => 'kde_KRuler*', +'KRun*' => 'kde_KRun*', +'KSSL&' => 'kde_KSSL*', +'KSSL*' => 'kde_KSSL*', +'KSSLAuthAction' => 'int', +'KSSLAuthAction*' => 'int*', +'KSSLCertBox*' => 'kde_KSSLCertBox*', +'KSSLCertChain&' => 'kde_KSSLCertChain*', +'KSSLCertChain*' => 'kde_KSSLCertChain*', +'KSSLCertDlg*' => 'kde_KSSLCertDlg*', +'KSSLCertDlgRet' => 'kde_KSSLCertDlgRet*', +'KSSLCertDlgRet*' => 'kde_KSSLCertDlgRet*', +'KSSLCertificate&' => 'kde_KSSLCertificate*', +'KSSLCertificate*' => 'kde_KSSLCertificate*', +'KSSLCertificateCache*' => 'kde_KSSLCertificateCache*', +'KSSLCertificateFactory*' => 'kde_KSSLCertificateFactory*', +'KSSLCertificateHome*' => 'kde_KSSLCertificateHome*', +'KSSLConnectionInfo&' => 'kde_KSSLConnectionInfo*', +'KSSLConnectionInfo*' => 'kde_KSSLConnectionInfo*', +'KSSLInfoDlg*' => 'kde_KSSLInfoDlg*', +'KSSLKeyGen*' => 'kde_KSSLKeyGen*', +'KSSLKeyType' => 'kde_KSSLKeyType', +'KSSLPKCS12*' => 'kde_KSSLPKCS12*', +'KSSLPKCS7*' => 'kde_KSSLPKCS7*', +'KSSLPeerInfo&' => 'kde_KSSLPeerInfo*', +'KSSLPeerInfo*' => 'kde_KSSLPeerInfo*', +'KSSLSettings*' => 'kde_KSSLSettings*', +'KSSLSigners*' => 'kde_KSSLSigners*', +'KSSLX509Map*' => 'kde_KSSLX509Map*', +'KSSLX509V3&' => 'kde_KSSLX509V3*', +'KSSLX509V3*' => 'kde_KSSLX509V3*', +'KSaveFile*' => 'kde_KSaveFile*', +'KScanDialog*' => 'kde_KScanDialog*', +'KScanDialogFactory*' => 'kde_KScanDialogFactory*', +'KScreenSaver*' => 'kde_KScreenSaver*', +'KScriptClientInterface*' => 'kde_KScriptClientInterface*', +'KScriptClientInterface::Result' => 'int', +'KScriptInterface*' => 'kde_KScriptInterface*', +'KScriptManager*' => 'kde_KScriptManager*', +'KSelectAction*' => 'kde_KSelectAction*', +'KSelector*' => 'kde_KSelector*', +'KSeparator*' => 'kde_KSeparator*', +'KServerSocket*' => 'kde_KServerSocket*', +'KService&' => 'kde_KService*' , +'KService*' => 'kde_KService*', +'KService::List' => 'kde_KService_List*' , +'KService::Ptr' => 'kde_KService_Ptr*' , +'KServiceGroup*' => 'kde_KServiceGroup*', +'KServiceOffer&' => 'kde_KServiceOffer*' , +'KServiceOffer*' => 'kde_KServiceOffer*', +'KServiceType*' => 'kde_KServiceType*', +'KServiceTypeProfile*' => 'kde_KServiceTypeProfile*' , +'KSessionManaged*' => 'kde_KSessionManaged*', +'KShared&' => 'kde_KShared*' , +'KShared*' => 'kde_KShared*', +'KSharedPixmap*' => 'kde_KSharedPixmap*', +'KSharedPtr&' => 'kde_KSharedPtr*' , +'KSharedPtr*' => 'kde_KSharedPtr*', +'KShellCompletion*' => 'kde_KShellCompletion*', +'KShellProcess*' => 'kde_KShellProcess*', +'KShortcuts&' => 'kde_KShortcuts*', +'KShortcuts' => 'kde_KShortcuts*', +'KShortcuts*' => 'kde_KShortcuts*', +'KShred*' => 'kde_KShred*', +'KSimpleConfig&' => 'kde_KSimpleConfig*' , +'KSimpleConfig*' => 'kde_KSimpleConfig*', +'KSimpleFileFilter*' => 'kde_KSimpleFileFilter*', +'KSocket*' => 'kde_KSocket*', +'KSocketAddress&' => 'kde_KSocketAddress*', +'KSocketAddress*' => 'kde_KSocketAddress*', +'KSocks*' => 'kde_KSocks*', +'KSpell*' => 'kde_KSpell*', +'KSpellConfig&' => 'kde_KSpellConfig*' , +'KSpellConfig' => 'kde_KSpellConfig*' , +'KSpellConfig*' => 'kde_KSpellConfig*' , +'KSpellDlg*' => 'kde_KSpellDlg*', +'KSqueezedTextLabel*' => 'kde_KSqueezedTextLabel*', +'KStandardDirs*' => 'kde_KStandardDirs*' , +'KStartupInfo*' => 'kde_KStartupInfo*', +'KStartupInfoData&' => 'kde_KStartupInfoData*', +'KStartupInfoData*' => 'kde_KStartupInfoData*', +'KStartupInfoId&' => 'kde_KStartupInfoId*', +'KStartupInfoId' => 'kde_KStartupInfoId*', +'KStartupInfoId*' => 'kde_KStartupInfoId*', +'KStaticDeleter*' => 'kde_KStaticDeleter*', +'KStaticDeleterBase*' => 'kde_KStaticDeleterBase*' , +'KStatusBar*' => 'kde_KStatusBar*' , +'KStatusBar::BarStatusstat::Toggle' => 'int' , +'KStatusBarLabel*' => 'kde_KStatusBarLabel*', +'KStdAccel*' => 'kde_KStdAccel*', +'KStdAccel::StdAccel' => 'int' , +'KStdAction*' => 'kde_KStdAction*', +'KStdGuiItem*' => 'kde_KStdGuiItem*', +'KStringHandler*' => 'kde_KStringHandler*', +'KStyle*' => 'kde_KStyle*' , +'KSycoca*' => 'kde_KSycoca*' , +'KSycocaEntry*' => 'kde_KSycocaEntry*' , +'KSycocaFactory*' => 'kde_KSycocaFactory*' , +'KSycocaFactoryId' => 'kde_KSycocaFactoryId' , +'KSycocaType&' => 'kde_KSycocaType*' , +'KSycocaType' => 'kde_KSycocaType*' , +'KSystemTray*' => 'kde_KSystemTray*', +'KTMainWindow*' => 'kde_KTMainWindow*', +'KTabButton*' => 'kde_KTabButton*', +'KTabCtl*' => 'kde_KTabCtl*', +'KTar*' => 'kde_KTar*', +'KTarBase*' => 'kde_KTarBase*' , +'KTarData*' => 'kde_KTarData*', +'KTarDirectory*' => 'kde_KTarDirectory*' , +'KTarEntry*' => 'kde_KTarEntry*' , +'KTarFile*' => 'kde_KTarFile*', +'KTarGz*' => 'kde_KTarGz*', +'KTempFile*' => 'kde_KTempFile*', +'KTextBrowser*' => 'kde_KTextBrowser*', +'KTextEditor*' => 'kde_KTextEditor*', +'KTextEditor__View&' => 'kde_KTextEditor__View*', +'KTextEditor__View' => 'kde_KTextEditor__View*', +'KTextEditor__View*' => 'kde_KTextEditor__View*', +'KThemeBase*' => 'kde_KThemeBase*', , +'KThemeCache*' => 'kde_KThemeCache*', +'KThemePixmap&' => 'kde_KThemePixmap*' , +'KThemePixmap*' => 'kde_KThemePixmap*' , +'KThemeStyle*' => 'kde_KThemeStyle*', +'KTipDatabase*' => 'kde_KTipDatabase*', +'KTipDialog*' => 'kde_KTipDialog*', +'KToggleAction*' => 'kde_KToggleAction*' , +'KToolBar*' => 'kde_KToolBar*' , +'KToolBar::BarStatus' => 'int', +'KToolBar::BarStatusstat::Toggle' => 'int' , +'KToolBarButton*' => 'kde_KToolBarButton*' , +'KToolBarButtonList*' => 'kde_KToolBarButtonList*', +'KToolBarPopupAction*' => 'kde_KToolBarPopupAction*', +'KToolBarPos' => 'int' , +'KToolBarRadioGroup*' => 'kde_KToolBarRadioGroup*', +'KToolBarSeparator*' => 'kde_KToolBarSeparator*', +'KToolButtonType' => 'int' , +'KTrader*' => 'kde_KTrader*' , +'KTypeList*' => 'kde_KTypeList*', +'KURIFilter*' => 'kde_KURIFilter*' , +'KURIFilterData&' => 'kde_KURIFilterData*' , +'KURIFilterData*' => 'kde_KURIFilterData*', +'KURIFilterPlugin*' => 'kde_KURIFilterPlugin*', +'KURIFilterPluginList*' => 'kde_KURIFilterPluginList*', +'KURL& url ()' => 'kde_KURL*', +'KURL& urlName ()' => 'kde_KURL*', +'KURL&' => 'kde_KURL*' , +'KURL' => 'kde_KURL*' , +'KURL*' => 'kde_KURL*', +'KURL::List&' => 'kde_KURLList*' , +'KURL::List' => 'kde_KURLList*' , +'KURLComboBox*' => 'kde_KURLComboBox*', +'KURLComboItem*' => 'kde_KURLComboItem*' , +'KURLCompletion*' => 'kde_KURLCompletion*', +'KURLDrag*' => 'kde_KURLDrag*', +'KURLLabel*' => 'kde_KURLLabel*', +'KURLPixmapProvider*' => 'kde_KURLPixmapProvider*', +'KURLPropsPlugin*' => 'kde_KURLPropsPlugin*', +'KURLRequester*' => 'kde_KURLRequester*', +'KURLRequesterDlg*' => 'kde_KURLRequesterDlg*', +'KUniqueApplication*' => 'kde_KUniqueApplication*', +'KUnixSocketAddress*' => 'kde_KUnixSocketAddress*', +'KValueSelector*' => 'kde_KValueSelector*', +'KWin*' => 'kde_KWin*', +'KWinModule*' => 'kde_KWinModule*', +'KWindowListMenu*' => 'kde_KWindowListMenu*', +'KWizard*' => 'kde_KWizard*', +'KWordWrap*' => 'kde_KWordWrap*', +'KWritePermsIcon*' => 'kde_KWritePermsIcon*', +'KXMLGUIBuilder*' => 'kde_KXMLGUIBuilder*' , +'KXMLGUIClient*' => 'kde_KXMLGUIClient*' , +'KXMLGUIFactory*' => 'kde_KXMLGUIFactory*' , +'KXMessages*' => 'kde_KXMessages*', +'KXYSelector*' => 'kde_KXYSelector*', +'KZoneAllocator*' => 'kde_KZoneAllocator*', +'KabAPI*' => 'kde_KabAPI*', +'KabKey&' => 'kde_KabKey*' , +'KabKey' => 'kde_KabKey*' , +'KabKey*' => 'kde_KabKey*', +'Key&' => 'Key*' , +'KeyBindingMap' => 'kde_KeyBindingMap*' , +'KeyValueMap&' => 'kde_KeyValueMap*' , +'KeyValueMap*&' => 'kde_KeyValueMap*' , +'KeyValueMap*' => 'kde_KeyValueMap*' , +'Keymap*' => 'kde_Keymap*', +'LinkStyle&' => 'kde_LinkStyle*', +'LinkStyle*' => 'kde_LinkStyle*', +'List&' => 'kde_List*', +'List' => 'kde_List', +'List*' => 'kde_List*', +'ListIterator&' => 'kde_ListIterator*', +'ListIterator' => 'kde_ListIterator', +'ListIterator*' => 'kde_ListIterator*', +'ListJob*' => 'kde_ListJob*', +'ListNode*' => 'kde_ListNode*', +'ListProgress*' => 'kde_ListProgress*', +'Lookup*' => 'kde_Lookup*', +'MCOPConfig*' => 'kde_MCOPConfig*', +'MCOPUtils*' => 'kde_MCOPUtils*', +'MSG*' => 'MSG*' , +'MailServer&' => 'MailServer*' , +'MailServer*' => 'kde_MailServer*', +'MainWindow*' => 'kde_MainWindow*', +'Mark*' => 'kde_Mark*', +'MarkInterface*' => 'kde_MarkInterface*', +'MediaAsyncStream*' => 'kde_MediaAsyncStream*', +'MediaDataPacket*' => 'kde_MediaDataPacket*', +'MediaFrame*' => 'kde_MediaFrame*', +'MediaList&' => 'kde_MediaList*', +'MediaList' => 'kde_MediaList', +'MediaList*' => 'kde_MediaList*', +'MediaListImpl*' => 'kde_MediaListImpl*', +'MediaModule&' => 'kde_MediaModule*', +'MediaModule' => 'kde_MediaModule*', +'MediaModule*' => 'kde_MediaModule*', +'MediaModule_base*' => 'kde_MediaModule_base*', +'MediaModule_skel*' => 'kde_MediaModule_skel*', +'MediaModule_stub*' => 'kde_MediaModule_stub*', +'MenuDockData*' => 'kde_MenuDockData*', +'MetaData&' => 'kde_MetaData*', +'MetaData' => 'kde_MetaData*', +'MetaData*' => 'kde_MetaData*', +'MethodDef&' => 'kde_MethodDef*', +'MethodDef*' => 'kde_MethodDef*', +'MidiEvent*' => 'kde_MidiEvent*', +'MidiFileInfo*' => 'kde_MidiFileInfo*', +'MidiMapper*' => 'kde_MidiMapper*', +'MidiOut*' => 'kde_MidiOut*', +'MidiPlayer*' => 'kde_MidiPlayer*', +'MidiStatus*' => 'kde_MidiStatus*', +'MidiTrack*' => 'kde_MidiTrack*', +'MimetypeJob*' => 'kde_MimetypeJob*', +'Mode' => 'int', +'ModuleDef&' => 'kde_ModuleDef*', +'ModuleDef*' => 'kde_ModuleDef*', +'MouseDoubleClickEvent*' => 'kde_MouseDoubleClickEvent*', +'MouseEvent*' => 'kde_MouseEvent*', +'MouseMoveEvent*' => 'kde_MouseMoveEvent*', +'MousePressEvent*' => 'kde_MousePressEvent*', +'MouseReleaseEvent*' => 'kde_MouseReleaseEvent*', +'MultiGetJob*' => 'kde_MultiGetJob*', +'MultiPort*' => 'kde_MultiPort*', +'NET*' => 'kde_NET*', +'NET::WindowType' => 'int' , +'NETIcon' => 'kdeNETIcon*' , +'NETIcon*' => 'kde_NETIcon*', +'NETPoint&' => 'kde_NETPoint*' , +'NETPoint' => 'kde_NETPoint*' , +'NETPoint*' => 'kde_NETPoint*', +'NETRect&' => 'kde_NETRect*' , +'NETRect' => 'kde_NETRect*' , +'NETRect*' => 'kde_NETRect*', +'NETRootInfo&' => 'kde_NETRootInfo*' , +'NETRootInfo*' => 'kde_NETRootInfo*', +'NETRootInfoPrivate*' => 'kde_NETRootInfoPrivate*', +'NETSize&' => 'kde_NETSize*' , +'NETSize' => 'kde_NETSize*' , +'NETSize*' => 'kde_NETSize*', +'NETStrut' => 'kde_NETStrut*' , +'NETStrut*' => 'kde_NETStrut*', +'NETWinInfo&' => 'kde_NETWinInfo*' , +'NETWinInfo*' => 'kde_NETWinInfo*', +'NETWinInfoPrivate*' => 'kde_NETWinInfoPrivate*', +'NamedNodeMap&' => 'kde_NamedNodeMap*', +'NamedNodeMap' => 'kde_NamedNodeMap*', +'NamedNodeMap*' => 'kde_NamedNodeMap*', +'NamedNodeMapImpl*' => 'kde_NamedNodeMapImpl*', +'NetAccess*' => 'kde_NetAccess*', +'NetRC*' => 'kde_NetRC*', +'Node&' => 'kde_DOMNode*', +'Node' => 'kde_DOMNode*', +'Node*' => 'kde_DOMNode*', +'NodeFilter&' => 'kde_NodeFilter*', +'NodeFilter' => 'kde_NodeFilter*', +'NodeFilter*' => 'kde_NodeFilter*', +'NodeFilterImpl*' => 'kde_NodeFilterImpl*', +'NodeImpl*' => 'kde_NodeImpl*', +'NodeIterator&' => 'kde_NodeIterator*', +'NodeIterator' => 'kde_NodeIterator*', +'NodeIterator*' => 'kde_NodeIterator*', +'NodeIteratorImpl*' => 'kde_NodeIteratorImpl*', +'NodeList&' => 'kde_DOMNodeList*', +'NodeList' => 'kde_DOMNodeList*', +'NodeList*' => 'kde_DOMNodeList*', +'NodeListImpl*' => 'kde_NodeListImpl*', +'NodePtr' => 'int' , +'NodeType' => 'int' , +'Notation&' => 'kde_Notation*', +'Notation*' => 'kde_Notation*', +'NoteArray*' => 'kde_NoteArray*', +'Notification&' => 'kde_Notification*', +'Notification' => 'kde_Notification*', +'Notification*' => 'kde_Notification*', +'NotificationClient*' => 'kde_NotificationClient*', +'NotificationManager*' => 'kde_NotificationManager*', +'Null*' => 'null', +'Number&' => 'kde_Number*', +'Number*' => 'kde_Number*', +'Object&' => 'kde_Object*', +'Object' => 'kde_Object*', +'Object*' => 'kde_Object*', +'ObjectImp*' => 'kde_ObjectImp*', +'ObjectManager*' => 'kde_ObjectManager*', +'ObjectReference&' => 'kde_ObjectReference*', +'ObjectReference*' => 'kde_ObjectReference*', +'Object_base*' => 'kde_Object_base*', +'Object_skel*' => 'kde_Object_skel*', +'Object_stub*' => 'kde_Object_stub*', +'Observer*' => 'kde_Observer*', +'OfferList' => 'kde_OfferList*' , +'Offset' => 'int', +'OnewayDispatchFunction' => 'kde_OnewayDispatchFunction*', +'OnewayInvocation&' => 'kde_OnewayInvocation*', +'OnewayInvocation*' => 'kde_OnewayInvocation*', +'OpenURLEvent*' => 'kde_OpenURLEvent*', +'Orientation' => 'int', +'PFlags' => 'int', +'PIAccess' => 'int', +'PID' => 'long', +'PIType' => 'int', +'PTY*' => 'kde_PTY*', +'PageSize' => 'int', +'ParamDef&' => 'kde_ParamDef*', +'ParamDef*' => 'kde_ParamDef*', +'ParsedArgument*' => 'kde_ParsedArgument*', +'ParsedAttribute*' => 'kde_ParsedAttribute*', +'ParsedClass&' => 'kde_ParsedClass&', +'ParsedClass*' => 'kde_ParsedClass*', +'ParsedClassContainer*' => 'kde_ParsedClassContainer*', +'ParsedContainer*' => 'kde_ParsedContainer*', +'ParsedItem*' => 'kde_ParsedItem*', +'ParsedMethod*' => 'kde_ParsedMethod*', +'ParsedParent*' => 'kde_ParsedParent*', +'ParsedScopeContainer*' => 'kde_ParsedScopeContainer*', +'ParsedSignalSlot*' => 'kde_ParsedSignalSlot*', +'ParsedStruct*' => 'kde_ParsedStruct*', +'Part*' => 'kde_Part*', +'PartActivateEvent*' => 'kde_PartActivateEvent*', +'PartBase*' => 'kde_PartBase*', +'PartManager*' => 'kde_PartManager*', +'PartSelectEvent*' => 'kde_PartSelectEvent*', +'PassDlg*' => 'kde_PassDlg*', +'PasswordDialog*' => 'kde_PasswordDialog*', +'PenCapStyle' => 'int' , +'PenJoinStyle' => 'int' , +'PenStyle' => 'int', +'PersistantClassStore*' => 'kde_PersistantClassStore*', +'PhoneNumber&' => 'kde_PhoneNumber*', +'PhoneNumber*' => 'kde_PhoneNumber*', +'PipeBuffer*' => 'kde_PipeBuffer*', +'PipeSegment*' => 'kde_PipeSegment*', +'Pix&' => 'kde_Pix*' , +'Pix' => 'kde_Pix*' , +'PixelMetric' => 'int', +'PlayObject&' => 'kde_PlayObject*', +'PlayObject' => 'kde_PlayObject*', +'PlayObject*' => 'kde_PlayObject*', +'PlayObjectFactory&' => 'kde_PlayObjectFactory*', +'PlayObjectFactory' => 'kde_PlayObjectFactory', +'PlayObjectFactory*' => 'kde_PlayObjectFactory*', +'PlayObjectFactory_base*' => 'kde_PlayObjectFactory_base*', +'PlayObjectFactory_skel*' => 'kde_PlayObjectFactory_skel*', +'PlayObjectFactory_stub*' => 'kde_PlayObjectFactory_stub*', +'PlayObject_base*' => 'kde_PlayObject_base*', +'PlayObject_private&' => 'kde_PlayObject_private*', +'PlayObject_private' => 'kde_PlayObject_private', +'PlayObject_private*' => 'kde_PlayObject_private*', +'PlayObject_private_base*' => 'kde_PlayObject_private_base*', +'PlayObject_private_skel*' => 'kde_PlayObject_private_skel*', +'PlayObject_private_stub*' => 'kde_PlayObject_private_stub*', +'PlayObject_skel*' => 'kde_PlayObject_skel*', +'PlayObject_stub*' => 'kde_PlayObject_stub*', +'PlayerController*' => 'kde_PlayerController*', +'Plugin*' => 'kde_Plugin*', +'PluginInfo*' => 'kde_PluginInfo*', +'Policy' => 'int', +'Pool&' => 'kde_Pool*', +'Pool*' => 'kde_Pool*', +'PopupMenuInterface*' => 'kde_PopupMenuInterface*', +'Port*' => 'kde_Port*', +'PreviewJob*' => 'kde_PreviewJob*', +'PrimitiveElement' => 'int', +'PrintInterface*' => 'kde_PrintInterface*', +'PrinterMode' => 'int', +'ProcessingInstruction&' => 'kde_ProcessingInstruction*', +'ProcessingInstruction' => 'kde_ProcessingInstruction*', +'ProcessingInstruction*' => 'kde_ProcessingInstruction*', +'ProgressBase*' => 'kde_ProgressBase*', +'ProgressItem*' => 'kde_ProgressItem*', +'PropagationMode' => 'int', +'ProtocolInfo*' => 'kde_ProtocolInfo*', +'Ptr' => 'void *', +'PtyProcess*' => 'kde_PtyProcess*', +'QAccel*' => 'qt_QAccel*', +'QAccessible*' => 'qt_QAccessible*', +'QAccessibleFactoryInterface*' => 'qt_QAccessibleFactoryInterface*', +'QAccessibleInterface*' => 'qt_QAccessibleInterface*', +'QAccessibleInterface**' => 'qt_QAccessibleInterface**', +'QAccessibleObject*' => 'qt_QAccessibleObject*', +'QAction*' => 'qt_QAction*' , +'QActionGroup*' => 'qt_QActionGroup*', +'QApplication*' => 'qt_QApplication*' , +'QArabicCodec*' => 'qt_QArabicCodec*', +'QArray*' => 'qt_QArray*', +'QAsciiBucket*' => 'qt_QAsciiBucket*', +'QAsciiCache*' => 'qt_QAsciiCache*', +'QAsciiCacheIterator*' => 'qt_QAsciiCacheIterator*', +'QAsciiDict*' => 'qt_QAsciiDict*', +'QAsciiDictIterator*' => 'qt_QAsciiDictIterator*', +'QAsyncIO*' => 'qt_QAsyncIO*', +'QAuBucket*' => 'qt_QAuBucket*' , +'QAuServer*' => 'qt_QAuServer*', +'QBaseBucket*' => 'qt_QBaseBucket*' , +'QBig5Codec*' => 'qt_QBig5Codec*', +'QBitArray&' => 'qt_QBitArray*' , +'QBitArray' => 'qt_QBitArray*' , +'QBitArray*' => 'qt_QBitArray*' , +'QBitVal&' => 'qt_QBitVal*' , +'QBitVal' => 'qt_QBitVal*' , +'QBitVal*' => 'qt_QBitVal*', +'QBitmap&' => 'qt_QBitmap *', +'QBitmap' => 'qt_QBitmap *', +'QBitmap*' => 'qt_QBitmap *', +'QBoxLayout*' => 'qt_QBoxLayout*', +'QBrush&' => 'qt_QBrush *', +'QBrush' => 'qt_QBrush*' , +'QBrush*' => 'qt_QBrush*' , +'QBrushData*' => 'qt_QBrushData*', +'QBuffer*' => 'qt_QBuffer*', +'QButton*' => 'qt_QButton *', +'QButtonGroup*' => 'qt_QButtonGroup*' , +'QByteArray& arr ()' => 'qt_QByteArray*', +'QByteArray&' => 'qt_QByteArray*' , +'QByteArray' => 'qt_QByteArray*', +'QByteArray*' => 'qt_QByteArray*', +'QCDEStyle*' => 'qt_QCDEStyle*', +'QCOORD&' => 'short', +'QCOORD' => 'short', +'QCOORD*' => 'short *', +'QCString&' => 'qt_QCString*' , +'QCString' => 'qt_QCString*' , +'QCString*' => 'qt_QCString*' , +'QCStringLess*' => 'qt_QCStringLess*' , +'QCStringList' => 'kde_QCStringList*' , +'QCache*' => 'qt_QCache*', +'QCacheIterator*' => 'qt_QCacheIterator*', +'QCanvas*' => 'qt_QCanvas*' , +'QCanvasEllipse*' => 'qt_QCanvasEllipse*', +'QCanvasItem*' => 'qt_QCanvasItem*' , +'QCanvasItemList' => 'qt_QCanvasItemList*' , +'QCanvasItemList*' => 'qt_QCanvasItemList*', +'QCanvasLine*' => 'qt_QCanvasLine*', +'QCanvasPixmap*' => 'qt_QCanvasPixmap*' , +'QCanvasPixmapArray*' => 'qt_QCanvasPixmapArray*' , +'QCanvasPolygon*' => 'qt_QCanvasPolygon*', +'QCanvasPolygonalItem*' => 'qt_QCanvasPolygonalItem*', +'QCanvasRectangle*' => 'qt_QCanvasRectangle*', +'QCanvasSpline*' => 'qt_QCanvasSpline*', +'QCanvasSprite*' => 'qt_QCanvasSprite*', +'QCanvasText*' => 'qt_QCanvasText*', +'QCanvasView*' => 'qt_QCanvasView*' , +'QChain*' => 'qt_QChain*' , +'QChar&' => 'qt_QChar*' , +'QChar' => 'qt_QChar*' , +'QChar*' => 'qt_QChar*' , +'QChar::Category' => 'int' , +'QChar::Decomposition' => 'int' , +'QChar::Direction' => 'int' , +'QChar::Joining' => 'int' , +'QCharRef&' => 'qt_QCharRef*' , +'QCharRef' => 'qt_QCharRef*' , +'QCharRef*' => 'qt_QCharRef*', +'QCheckBox*' => 'qt_QCheckBox*', +'QCheckListItem*' => 'qt_QCheckListItem *', +'QCheckTableItem*' => 'qt_QCheckTableItem*', +'QChildEvent*' => 'qt_QChildEvent*' , +'QClassInfo*' => 'qt_QClassInfo*' , +'QCleanupHandler*' => 'qt_QCleanupHandler*', +'QClipboard*' => 'qt_QClipboard *', +'QCloseEvent*' => 'qt_QCloseEvent*' , +'QCollection&' => 'qt_QCollection*' , +'QCollection*' => 'qt_QCollection*', +'QCollection::Item&' => 'void *' , +'QCollection::Item' => 'void *' , +'QColor &' => 'qt_QColor *', +'QColor&' => 'qt_QColor *', +'QColor&fillColor::white' => 'int' , +'QColor&linkColor::blue' => 'int' , +'QColor' => 'qt_QColor *', +'QColor*' => 'qt_QColor*' , +'QColorDialog*' => 'qt_QColorDialog*', +'QColorDrag*' => 'qt_QColorDrag*', +'QColorGroup&' => 'qt_QColorGroup *', +'QColorGroup' => 'qt_QColorGroup*' , +'QColorGroup*' => 'qt_QColorGroup*' , +'QColorGroup::ColorRole' => 'int' , +'QComboBox*' => 'qt_QComboBox*' , +'QComboBox::Policy' => 'int' , +'QComboBox::Policypolicy::AtBottom' => 'int' , +'QComboTableItem*' => 'qt_QComboTableItem*', +'QCommonStyle*' => 'qt_QCommonStyle*', +'QCompactStyle*' => 'qt_QCompactStyle*', +'QComponentFactory*' => 'qt_QComponentFactory*', +'QComponentFactoryInterface*' => 'qt_QComponentFactoryInterface*', +'QComponentInterface*' => 'qt_QComponentInterface*', +'QComponentRegistration*' => 'qt_QComponentRegistration*', +'QComponentServerInterface*' => 'qt_QComponentServerInterface*', +'QConfigDB*' => 'qt_QConfigDB*' , +'QConfigDB*' => 'qt_QConfigDB*' , +'QConnection*' => 'qt_QConnection*', +'QConnectionList&' => 'qt_QConnectionList*' , +'QConnectionList*' => 'qt_QConnectionList*' , +'QConnectionListIt&' => 'qt_QConnectionListIt*' , +'QConnectionListIt*' => 'qt_QConnectionListIt*', +'QConstString' => 'qt_QConstString*', +'QConstString*' => 'qt_QConstString*', +'QContextMenuEvent*' => 'qt_QContextMenuEvent*', +'QCursor&' => 'qt_QCursor *', +'QCursor' => 'qt_QCursor*' , +'QCursor*' => 'qt_QCursor *', +'QCustomEvent*' => 'qt_QCustomEvent*' , +'QCustomMenuItem*' => 'qt_QCustomMenuItem*' , +'QDOM_NodeListPrivate*' => 'void*' , +'QDOM_NodePrivate*' => 'void*' , +'QDataBrowser*' => 'qt_QDataBrowser*', +'QDataPump*' => 'qt_QDataPump*', +'QDataSink*' => 'qt_QDataSink*' , +'QDataSource*' => 'qt_QDataSource*' , +'QDataStream&' => 'qt_QDataStream *', +'QDataStream*' => 'qt_QDataStream*' , +'QDataTable*' => 'qt_QDataTable*', +'QDataView*' => 'qt_QDataView*', +'QDate &' => 'qt_QDate *', +'QDate date()' => 'qt_QDate*', +'QDate&' => 'qt_QDate *', +'QDate' => 'qt_QDate *', +'QDate*' => 'qt_QDate*', +'QDateEdit*' => 'qt_QDateEdit*', +'QDateTime&' => 'qt_QDateTime *', +'QDateTime' => 'qt_QDateTime *', +'QDateTime*' => 'qt_QDateTime*' , +'QDateTimeEdit*' => 'qt_QDateTimeEdit*', +'QDateTimeEditBase*' => 'qt_QDateTimeEditBase*', +'QDesktopWidget*' => 'qt_QDesktopWidget*', +'QDial*' => 'qt_QDial*', +'QDialog*' => 'qt_QDialog*', +'QDict*' => 'qt_QDict*', +'QDictIterator*' => 'qt_QDictIterator*', +'QDir&' => 'qt_QDir *', +'QDir' => 'qt_QDir *', +'QDir*' => 'qt_QDir *', +'QDir::SortSpec&' => 'int' , +'QDir::SortSpec' => 'int' , +'QDirSortItem*' => 'qt_QDirSortItem*', +'QDiskFont*' => 'qt_QDiskFont*', +'QDispatchInterface*' => 'qt_QDispatchInterface*', +'QDns*' => 'qt_QDns*', +'QDnsSocket*' => 'qt_QDnsSocket*', +'QDockArea*' => 'qt_QDockArea*', +'QDockAreaLayout*' => 'qt_QDockAreaLayout*', +'QDockWindow*' => 'qt_QDockWindow*', +'QDomAttr&' => 'qt_QDomAttr*' , +'QDomAttr' => 'qt_QDomAttr*' , +'QDomAttr*' => 'qt_QDomAttr*', +'QDomCDATASection&' => 'qt_QDomCDATASection*' , +'QDomCDATASection' => 'qt_QDomCDATASection*' , +'QDomCDATASection*' => 'qt_QDomCDATASection*', +'QDomCharacterData&' => 'qt_QDomCharacterData*' , +'QDomCharacterData' => 'qt_QDomCharacterData*' , +'QDomCharacterData*' => 'qt_QDomCharacterData*', +'QDomComment&' => 'qt_QDomComment*' , +'QDomComment' => 'qt_QDomComment*' , +'QDomComment*' => 'qt_QDomComment*', +'QDomDocument&' => 'qt_QDomDocument*' , +'QDomDocument' => 'qt_QDomDocument*' , +'QDomDocument*' => 'qt_QDomDocument*', +'QDomDocumentFragment&' => 'qt_QDomDocumentFragment*' , +'QDomDocumentFragment' => 'qt_QDomDocumentFragment*' , +'QDomDocumentFragment*' => 'qt_QDomDocumentFragment*', +'QDomDocumentType&' => 'qt_QDomDocumentType*' , +'QDomDocumentType' => 'qt_QDomDocumentType*' , +'QDomDocumentType*' => 'qt_QDomDocumentType*', +'QDomElement&' => 'qt_QDomElement*' , +'QDomElement' => 'qt_QDomElement*' , +'QDomElement*' => 'qt_QDomElement*', +'QDomEntity&' => 'qt_QDomEntity*' , +'QDomEntity' => 'qt_QDomEntity*' , +'QDomEntity*' => 'qt_QDomEntity*', +'QDomEntityReference&' => 'qt_QDomEntityReference*' , +'QDomEntityReference' => 'qt_QDomEntityReference*' , +'QDomEntityReference*' => 'qt_QDomEntityReference*', +'QDomImplementation&' => 'qt_QDomImplementation*' , +'QDomImplementation' => 'qt_QDomImplementation*' , +'QDomImplementation*' => 'qt_QDomImplementation*', +'QDomNamedNodeMap&' => 'qt_QDomNamedNodeMap*' , +'QDomNamedNodeMap' => 'qt_QDomNamedNodeMap*' , +'QDomNamedNodeMap*' => 'qt_QDomNamedNodeMap*', +'QDomNode&' => 'qt_QDomNode*' , +'QDomNode' => 'qt_QDomNode*' , +'QDomNode*' => 'qt_QDomNode*', +'QDomNode::NodeType' => 'int', +'QDomNodeList&' => 'qt_QDomNodeList*' , +'QDomNodeList' => 'qt_QDomNodeList*' , +'QDomNodeList*' => 'qt_QDomNodeList*', +'QDomNodePrivate*' => 'qt_QDomNodePrivate*', +'QDomNotation&' => 'qt_QDomNotation*' , +'QDomNotation' => 'qt_QDomNotation*' , +'QDomNotation*' => 'qt_QDomNotation*', +'QDomProcessingInstruction&' => 'qt_QDomProcessingInstruction*' , +'QDomProcessingInstruction' => 'qt_QDomProcessingInstruction*' , +'QDomProcessingInstruction*' => 'qt_QDomProcessingInstruction*', +'QDomText&' => 'qt_QDomText*' , +'QDomText' => 'qt_QDomText*' , +'QDomText*' => 'qt_QDomText*', +'QDoubleValidator*' => 'qt_QDoubleValidator*', +'QDragEnterEvent*' => 'qt_QDragEnterEvent*' , +'QDragLeaveEvent*' => 'qt_QDragLeaveEvent*' , +'QDragManager*' => 'qt_QDragManager*', +'QDragMoveEvent*' => 'qt_QDragMoveEvent*' , +'QDragObject*' => 'qt_QDragObject*' , +'QDragResponseEvent*' => 'qt_QDragResponseEvent*', +'QDropEvent*' => 'qt_QDropEvent*' , +'QDropSite*' => 'qt_QDropSite*', +'QEditorFactory*' => 'qt_QEditorFactory*', +'QErrorMessage*' => 'qt_QErrorMessage*', +'QEucJpCodec*' => 'qt_QEucJpCodec*', +'QEucKrCodec*' => 'qt_QEucKrCodec*', +'QEvent*' => 'qt_QEvent *', +'QEventLoop::ProcessEventsFlags' => 'uint', +'QFeatureListInterface*' => 'qt_QFeatureListInterface*', +'QFile&' => 'qt_QFile *', +'QFile*' => 'qt_QFile*' , +'QFileDialog*' => 'qt_QFileDialog*', +'QFileIconProvider*' => 'qt_QFileIconProvider*' , +'QFileInfo&' => 'qt_QFileInfo *', +'QFileInfo*' => 'qt_QFileInfo*', +'QFileInfoList*' => 'qt_QFileInfoList*' , +'QFilePreview*' => 'qt_QFilePreview*' , +'QFocusData*' => 'qt_QFocusData*' , +'QFocusEvent*' => 'qt_QFocusEvent*' , +'QFont&' => 'qt_QFont *', +'QFont' => 'qt_QFont *', +'QFont*' => 'qt_QFont *', +'QFont::CharSet' => 'int', +'QFont::CharSetcharset::Unicode' => 'int' , +'QFont::StyleHint' => 'int', +'QFontData&' => 'qt_QFontData*' , +'QFontDatabase*' => 'qt_QFontDatabase*', +'QFontDialog*' => 'qt_QFontDialog*', +'QFontInfo&' => 'qt_QFontInfo *', +'QFontInfo' => 'qt_QFontInfo *', +'QFontInfo*' => 'qt_QFontInfo*', +'QFontMetrics&' => 'qt_QFontMetrics *', +'QFontMetrics' => 'qt_QFontMetrics *', +'QFontMetrics*' => 'qt_QFontMetrics*', +'QFrame*' => 'qt_QFrame*' , +'QFtp*' => 'qt_QFtp*', +'QGArray&' => 'qt_QGArray*' , +'QGArray*' => 'qt_QGArray*', +'QGCache&' => 'qt_QGCache*' , +'QGCache*' => 'qt_QGCache*', +'QGCacheIterator&' => 'qt_QGCacheIterator*' , +'QGCacheIterator*' => 'qt_QGCacheIterator*', +'QGDict&' => 'qt_QGDict*' , +'QGDict*' => 'qt_QGDict*', +'QGDictIterator&' => 'qt_QGDictIterator*' , +'QGDictIterator*' => 'qt_QGDictIterator*', +'QGL*' => 'qt_QGL*', +'QGLColormap&' => 'qt_QGLColormap*', +'QGLColormap*' => 'qt_QGLColormap*', +'QGLContext*' => 'qt_QGLContext*' , +'QGLFormat&' => 'qt_QGLFormat*' , +'QGLFormat' => 'qt_QGLFormat*' , +'QGLFormat*' => 'qt_QGLFormat*', +'QGLWidget*' => 'qt_QGLWidget*' , +'QGLayoutIterator*' => 'qt_QGLayoutIterator*' , +'QGList&' => 'qt_QGList*' , +'QGList*' => 'qt_QGList*' , +'QGListIterator&' => 'qt_QGListIterator*' , +'QGListIterator*' => 'qt_QGListIterator*', +'QGPlugin*' => 'qt_QGPlugin*', +'QGPluginManager*' => 'qt_QGPluginManager*', +'QGVector&' => 'qt_QGVector*' , +'QGVector*' => 'qt_QGVector*' , +'QGbkCodec*' => 'qt_QGbkCodec*', +'QGfx*' => 'qt_QGfx*' , +'QGrid*' => 'qt_QGrid*' , +'QGrid::Direction' => 'int' , +'QGridLayout*' => 'qt_QGridLayout*', +'QGridView*' => 'qt_QGridView*', +'QGroupBox*' => 'qt_QGroupBox*', +'QGuardedPtr*' => 'qt_QGuardedPtr*', +'QGuardedPtrPrivate*' => 'qt_QGuardedPtrPrivate*', +'QHBox*' => 'qt_QHBox*' , +'QHBoxLayout*' => 'qt_QHBoxLayout*' , +'QHButtonGroup*' => 'qt_QHButtonGroup*', +'QHGroupBox*' => 'qt_QHGroupBox*', +'QHeader*' => 'qt_QHeader *', +'QHebrewCodec*' => 'qt_QHebrewCodec*', +'QHideEvent*' => 'qt_QHideEvent*' , +'QHostAddress&' => 'qt_QHostAddress*' , +'QHostAddress' => 'qt_QHostAddress*' , +'QHostAddress*' => 'qt_QHostAddress*' , +'QHttp*' => 'qt_QHttp*', +'QIMEvent*' => 'qt_QIMEvent*', +'QIODevice*' => 'qt_QIODevice *', +'QIODevice::Offset' => 'int', +'QIODeviceSource*' => 'qt_QIODeviceSource*', +'QIOManager*' => 'qt_QIOManager*', +'QIOWatch*' => 'qt_QIOWatch*', +'QIconDrag*' => 'qt_QIconDrag*', +'QIconDragItem&' => 'qt_QIconDragItem*' , +'QIconDragItem*' => 'qt_QIconDragItem*', +'QIconSet&' => 'qt_QIconSet*' , +'QIconSet' => 'qt_QIconSet*' , +'QIconSet*' => 'qt_QIconSet*' , +'QIconView*' => 'qt_QIconView*' , +'QIconViewItem*' => 'qt_QIconViewItem*' , +'QImage&' => 'qt_QImage *', +'QImage' => 'qt_QImage *', +'QImage*' => 'qt_QImage*' , +'QImageConsumer*' => 'qt_QImageConsumer*' , +'QImageData*' => 'qt_QImageData*', +'QImageDecoder*' => 'qt_QImageDecoder*', +'QImageDrag*' => 'qt_QImageDrag*', +'QImageFormat*' => 'qt_QImageFormat*' , +'QImageFormatInterface*' => 'qt_QImageFormatInterface*', +'QImageFormatPlugin*' => 'qt_QImageFormatPlugin*', +'QImageFormatType*' => 'qt_QImageFormatType*' , +'QImageIO*' => 'qt_QImageIO*', +'QImageTextKeyLang&' => 'qt_QImageTextKeyLang*' , +'QImageTextKeyLang*' => 'qt_QImageTextKeyLang*', +'QInputDialog*' => 'qt_QInputDialog*', +'QIntBucket*' => 'qt_QIntBucket*', +'QIntCache*' => 'qt_QIntCache*', +'QIntCacheIterator*' => 'qt_QIntCacheIterator*', +'QIntDict*' => 'qt_QIntDict*', +'QIntDictIterator*' => 'qt_QIntDictIterator*', +'QIntValidator*' => 'qt_QIntValidator*', +'QInterfaceListInterface*' => 'qt_QInterfaceListInterface*', +'QInterfacePtr*' => 'qt_QInterfacePtr*', +'QInterlaceStyle*' => 'qt_QInterlaceStyle*', +'QInternal*' => 'qt_QInternal*', +'QJisCodec*' => 'qt_QJisCodec*', +'QJpUnicodeConv*' => 'qt_QJpUnicodeConv*' , +'QKeyEvent*' => 'qt_QKeyEvent*' , +'QKeySequence&' => 'qt_QKeySequence*', +'QKeySequence' => 'qt_QKeySequence*', +'QKeySequence*' => 'qt_QKeySequence*', +'QKoi8Codec*' => 'qt_QKoi8Codec*', +'QLCDNumber*' => 'qt_QLCDNumber*', +'QLNode*' => 'qt_QLNode*' , +'QLabel*' => 'qt_QLabel *', +'QLayout*' => 'qt_QLayout *', +'QLayoutItem*' => 'qt_QLayoutItem*' , +'QLayoutIterator&' => 'qt_QLayoutIterator*' , +'QLayoutIterator' => 'qt_QLayoutIterator*' , +'QLayoutIterator*' => 'qt_QLayoutIterator*', +'QLibrary*' => 'qt_QLibrary*', +'QLibrary::Policy' => 'int', +'QLibraryInterface*' => 'qt_QLibraryInterface*', +'QLineEdit*' => 'qt_QLineEdit*' , +'QLineEdit::EchoMode' => 'int' , +'QList*' => 'qt_QList*', +'QListBox*' => 'qt_QListBox *', +'QListBoxItem*' => 'qt_QListBoxItem *', +'QListBoxPixmap*' => 'qt_QListBoxPixmap*', +'QListBoxText*' => 'qt_QListBoxText*', +'QListIterator*' => 'qt_QListIterator*', +'QListView*' => 'qt_QListView *', +'QListViewItem*&' => 'qt_QListViewItem*', +'QListViewItem*' => 'qt_QListViewItem *', +'QListViewItemIterator&' => 'qt_QListViewItemIterator*' , +'QListViewItemIterator' => 'qt_QListViewItemIterator*' , +'QListViewItemIterator*' => 'qt_QListViewItemIterator*', +'QLocalFs*' => 'qt_QLocalFs*', +'QMCPI*' => 'qt_QMCPI*', +'QMSG*' => 'QMSG*' , +'QMainWindow*' => 'qt_QMainWindow*' , +'QMainWindow::ToolBarDock' => 'int', +'QMainWindow::ToolBarDock::Top' => 'int' , +'QMap&' => 'qt_QMap*' , +'QMap*' => 'qt_QMap*', +'QMapConstIterator*' => 'qt_QMapConstIterator*', +'QMapIterator*' => 'qt_QMapIterator*', +'QMapNode*' => 'qt_QMapNode*', +'QMapNodeBase*&' => 'qt_QMapNodeBase*' , +'QMapNodeBase*' => 'qt_QMapNodeBase*' , +'QMapPrivate*' => 'qt_QMapPrivate*', +'QMapPrivateBase*' => 'qt_QMapPrivateBase*' , +'QMemArray*' => 'qt_QMemArray*', +'QMember' => 'qt_QMember*' , +'QMember*' => 'qt_QMember*' , +'QMenuBar*' => 'qt_QMenuBar *', +'QMenuData*' => 'qt_QMenuData*', +'QMenuData**' => 'qt_QMenuData**' , +'QMenuItem*' => 'qt_QMenuItem *', +'QMessageBox*' => 'qt_QMessageBox*', +'QMetaData*' => 'qt_QMetaData*' , +'QMetaData::Access*' => 'int*' , +'QMetaEnum*' => 'qt_QMetaEnum*' , +'QMetaEnum::Item*' => 'int*' , +'QMetaObject*&' => 'qt_QMetaObject*', +'QMetaObject*' => 'qt_QMetaObject *', +'QMetaObjectCleanUp*' => 'qt_QMetaObjectCleanUp*', +'QMetaObjectInit*' => 'qt_QMetaObjectInit*', +'QMetaProperty*' => 'qt_QMetaProperty*' , +'QMimeSource*' => 'qt_QMimeSource*' , +'QMimeSourceFactory*' => 'qt_QMimeSourceFactory*' , +'QMotifPlusStyle*' => 'qt_QMotifPlusStyle*', +'QMotifStyle*' => 'qt_QMotifStyle*', +'QMouseEvent*' => 'qt_QMouseEvent*' , +'QMoveEvent*' => 'qt_QMoveEvent*' , +'QMovie&' => 'qt_QMovie *', +'QMovie*' => 'qt_QMovie *', +'QMultiLineEdit*' => 'qt_QMultiLineEdit*', +'QMultiLineEditRow*' => 'qt_QMultiLineEditRow*', +'QMutex*' => 'qt_QMutex*', +'QNPInstance*' => 'qt_QNPInstance*', +'QNPStream*' => 'qt_QNPStream*', +'QNPWidget*' => 'qt_QNPWidget*', +'QNPlugin*' => 'qt_QNPlugin*', +'QNetworkOperation*' => 'qt_QNetworkOperation*' , +'QNetworkProtocol*' => 'qt_QNetworkProtocol*' , +'QNetworkProtocol::Operation' => 'int' , +'QNetworkProtocol::State' => 'int' , +'QNetworkProtocolFactory*' => 'qt_QNetworkProtocolFactory*', +'QNetworkProtocolFactoryBase*' => 'qt_QNetworkProtocolFactoryBase*' , +'QObject*' => 'qt_QObject *', +'QObjectCleanupHandler*' => 'qt_QObjectCleanupHandler*', +'QObjectDictionary&' => 'qt_QObjectDictionary*' , +'QObjectDictionary*' => 'qt_QObjectDictionary*', +'QObjectInterface*' => 'qt_QObjectInterface*', +'QObjectList&' => 'qt_QObjectList*' , +'QObjectList*' => 'qt_QObjectList*', +'QObjectListIt&' => 'qt_QObjectListIt*' , +'QObjectListIt*' => 'qt_QObjectListIt*', +'QPNGImagePacker*' => 'qt_QPNGImagePacker*', +'QPNGImageWriter*' => 'qt_QPNGImageWriter*', +'QPaintDevice*' => 'qt_QPaintDevice *', +'QPaintDeviceMetrics*' => 'qt_QPaintDeviceMetrics*', +'QPaintDeviceX11Data*' => 'qt_QPaintDeviceX11Data*' , +'QPaintEvent*' => 'qt_QPaintEvent*' , +'QPainter&' => 'qt_QPainter*' , +'QPainter*' => 'qt_QPainter *', +'QPair*' => 'qt_QPair*', +'QPalData*' => 'qt_QPalData*', +'QPalette&' => 'qt_QPalette *', +'QPalette' => 'qt_QPalette *', +'QPalette*' => 'qt_QPalette *', +'QPen&' => 'qt_QPen *', +'QPen' => 'qt_QPen*' , +'QPen*' => 'qt_QPen*', +'QPenData*' => 'qt_QPenData*', +'QPicture&' => 'qt_QPicture *', +'QPicture' => 'qt_QPicture*', +'QPicture*' => 'qt_QPicture*', +'QPicturePrivate*' => 'qt_QPicturePrivate*', +'QPixmap& pixmap()' => 'kde_QPixmap*', +'QPixmap&' => 'qt_QPixmap *', +'QPixmap' => 'qt_QPixmap *', +'QPixmap*' => 'qt_QPixmap *', +'QPixmap::Optimization' => 'int' , +'QPixmap::Optimization' => 'int', +'QPixmap::Optimization::DefaultOptim' => 'int' , +'QPixmapCache*' => 'qt_QPixmapCache*', +'QPixmapData*' => 'qt_QPixmapData*', +'QPlatinumStyle*' => 'qt_QPlatinumStyle*', +'QPluginManager*' => 'qt_QPluginManager*', +'QPoint&' => 'qt_QPoint*', +'QPoint&pos()' => 'int' , +'QPoint&pos::pos()' => 'int' , +'QPoint' => 'qt_QPoint*', +'QPoint*' => 'qt_QPoint*' , +'QPointArray&' => 'qt_QPointArray*', +'QPointArray' => 'qt_QPointArray*', +'QPointArray*' => 'qt_QPointArray*', +'QPointVal&' => 'qt_QPointVal*' , +'QPointVal' => 'qt_QPointVal*' , +'QPolygonScanner*' => 'qt_QPolygonScanner*', +'QPopupMenu*' => 'qt_QPopupMenu*', +'QPrintDialog*' => 'qt_QPrintDialog*', +'QPrinter*' => 'qt_QPrinter*' , +'QPrinter::PrinterMode' => 'int', +'QProcess*' => 'qt_QProcess*', +'QProgressBar*' => 'qt_QProgressBar*', +'QProgressDialog*' => 'qt_QProgressDialog*', +'QPtrBucket*' => 'qt_QPtrBucket*', +'QPtrCollection&' => 'qt_QPtrCollection*', +'QPtrCollection*' => 'qt_QPtrCollection*', +'QPtrDict*' => 'qt_QPtrDict*', +'QPtrDictIterator*' => 'qt_QPtrDictIterator*', +'QPtrList*' => 'qt_QPtrList*', +'QPtrListIterator*' => 'qt_QPtrListIterator*', +'QPtrQueue*' => 'qt_QPtrQueue*', +'QPtrStack*' => 'qt_QPtrStack*', +'QPtrVector*' => 'qt_QPtrVector*', +'QPushButton*' => 'qt_QPushButton*', +'QQueue*' => 'qt_QQueue*', +'QRESULT' => 'long', +'QRadioButton*' => 'qt_QRadioButton*', +'QRangeControl*' => 'qt_QRangeControl*', +'QRect&' => 'qt_QRect*', +'QRect' => 'qt_QRect*', +'QRect*' => 'qt_QRect*', +'QRegExp&' => 'qt_QRegExp*', +'QRegExp*' => 'qt_QRegExp*', +'QRegExpValidator*' => 'qt_QRegExpValidator*', +'QRegion&' => 'qt_QRegion *', +'QRegion' => 'qt_QRegion *', +'QRegion*' => 'qt_QRegion*', +'QRegionData*' => 'qt_QRegionData*', +'QRemoteFactory*' => 'qt_QRemoteFactory*', +'QRemotePlugin*' => 'qt_QRemotePlugin*', +'QResizeEvent*' => 'qt_QResizeEvent*' , +'QRgb' => 'unsigned int', +'QRgb*' => 'int *', +'QRichText&' => 'qt_QRichText*' , +'QSGIStyle*' => 'qt_QSGIStyle*', +'QScrollBar&' => 'qt_QScrollBar*' , +'QScrollBar*' => 'qt_QScrollBar*' , +'QScrollView*' => 'qt_QScrollView*', +'QSemaphore*' => 'qt_QSemaphore*', +'QSemiModal*' => 'qt_QSemiModal*', +'QSenderObject*' => 'qt_QSenderObject*', +'QServerSocket*' => 'qt_QServerSocket*', +'QSessionManager&' => 'qt_QSessionManager*' , +'QSessionManager*' => 'qt_QSessionManager*', +'QSettings*' => 'qt_QSettings*', +'QShared*' => 'qt_QShared*', +'QShowEvent*' => 'qt_QShowEvent*' , +'QSignal*' => 'qt_QSignal *', +'QSignalDict&' => 'qt_QSignalDict*' , +'QSignalDict*' => 'qt_QSignalDict*', +'QSignalDictIt&' => 'qt_QSignalDictIt*' , +'QSignalDictIt*' => 'qt_QSignalDictIt*', +'QSignalMapper*' => 'qt_QSignalMapper*', +'QSignalVec&' => 'qt_QSignalVec*', +'QSignalVec*' => 'qt_QSignalVec*', +'QSimpleRichText*' => 'qt_QSimpleRichText*', +'QSize&' => 'qt_QSize *', +'QSize' => 'qt_QSize *', +'QSize*' => 'qt_QSize*' , +'QSizeGrip*' => 'qt_QSizeGrip*', +'QSizePolicy&' => 'qt_QSizePolicy*' , +'QSizePolicy' => 'qt_QSizePolicy*' , +'QSizePolicy*' => 'qt_QSizePolicy*', +'QSizePolicy::ExpandData' => 'int' , +'QSizePolicy::SizeTypehData::Minimum' => 'int' , +'QSizePolicy::SizeTypevData::Minimum' => 'int' , +'QSjisCodec*' => 'qt_QSjisCodec*', +'QSlider*' => 'qt_QSlider*', +'QSmartPtr&' => 'qt_QSmartPtr*' , +'QSmartPtr*' => 'qt_QSmartPtr*', +'QSmartPtrPrivate*' => 'qt_QSmartPtrPrivate*', +'QSocket*' => 'qt_QSocket*', +'QSocketDevice*' => 'qt_QSocketDevice*' , +'QSocketNotifier*' => 'qt_QSocketNotifier*', +'QSocketNotifier::Type' => 'int', +'QSortedList*' => 'qt_QSortedList*', +'QSound*' => 'qt_QSound*', +'QSpacerItem*' => 'qt_QSpacerItem*' , +'QSpinBox*' => 'qt_QSpinBox*', +'QSpinWidget*' => 'qt_QSpinWidget*', +'QSplitter*' => 'qt_QSplitter*', +'QSql*' => 'qt_QSql*', +'QSql::Confirm' => 'int', +'QSql::Op' => 'int', +'QSqlCursor&' => 'qt_QSqlCursor*', +'QSqlCursor' => 'qt_QSqlCursor*', +'QSqlCursor*' => 'qt_QSqlCursor*', +'QSqlDatabase*' => 'qt_QSqlDatabase*', +'QSqlDriver*' => 'qt_QSqlDriver*', +'QSqlDriverCreator*' => 'qt_QSqlDriverCreator*', +'QSqlDriverCreatorBase*' => 'qt_QSqlDriverCreatorBase*', +'QSqlDriverFactoryInterface*' => 'qt_QSqlDriverFactoryInterface*', +'QSqlDriverPlugin*' => 'qt_QSqlDriverPlugin*', +'QSqlEditorFactory*' => 'qt_QSqlEditorFactory*', +'QSqlError&' => 'qt_QSqlError*', +'QSqlError' => 'qt_QSqlError*', +'QSqlError*' => 'qt_QSqlError*', +'QSqlField&' => 'qt_QSqlField*', +'QSqlField' => 'qt_QSqlField*', +'QSqlField*' => 'qt_QSqlField*', +'QSqlFieldInfo&' => 'qt_QSqlFieldInfo*', +'QSqlFieldInfo*' => 'qt_QSqlFieldInfo*', +'QSqlForm' => 'qt_QSqlForm*', +'QSqlForm*' => 'qt_QSqlForm*', +'QSqlIndex&' => 'qt_QSqlIndex*', +'QSqlIndex' => 'qt_QSqlIndex*', +'QSqlIndex*' => 'qt_QSqlIndex*', +'QSqlPropertyMap*' => 'qt_QSqlPropertyMap*', +'QSqlQuery&' => 'qt_QSqlQuery*', +'QSqlQuery' => 'qt_QSqlQuery*', +'QSqlQuery*' => 'qt_QSqlQuery*', +'QSqlRecord&' => 'qt_QSqlRecord*', +'QSqlRecord' => 'qt_QSqlRecord*', +'QSqlRecord*' => 'qt_QSqlRecord*', +'QSqlRecordInfo&' => 'qt_QSqlRecordInfo*', +'QSqlRecordInfo' => 'qt_QSqlRecordInfo*', +'QSqlRecordInfo*' => 'qt_QSqlRecordInfo*', +'QSqlRecordPrivate*' => 'qt_QSqlRecordPrivate*', +'QSqlRecordShared*' => 'qt_QSqlRecordShared*', +'QSqlResult' => 'qt_QSqlResult*', +'QSqlResult*' => 'qt_QSqlResult*', +'QSqlResultShared*' => 'qt_QSqlResultShared*', +'QStack*' => 'qt_QStack*', +'QStatusBar*' => 'qt_QStatusBar*' , +'QStoredDrag*' => 'qt_QStoredDrag*', +'QStrIList' => 'kde_QStrIList', +'QStrIList*' => 'qt_QStrIList*', +'QStrIVec*' => 'qt_QStrIVec*', +'QStrList&' => 'qt_QStrList *', +'QStrList' => 'qt_QStrList *', +'QStrList*' => 'qt_QStrList *', +'QStrListIterator*' => 'qt_QStrListIterator*', +'QStrVec*' => 'qt_QStrVec*', +'QString&' => 'qt_QString *', +'QString&::null' => 'qt_QString*' , +'QString&button0Text::null' => 'qt_QString*' , +'QString&button1Text::null' => 'qt_QString*' , +'QString&button2Text::null' => 'qt_QString*' , +'QString&buttonText::null' => 'qt_QString*' , +'QString&caption::null' => 'qt_QString*' , +'QString&charSet::null' => 'qt_QString*' , +'QString&context::null' => 'qt_QString*' , +'QString&defValue::null' => 'qt_QString*' , +'QString&dir::null' => 'qt_QString*' , +'QString&directory::null' => 'qt_QString*' , +'QString&filter::null' => 'qt_QString*' , +'QString&initially::null' => 'qt_QString*' , +'QString&location::null' => 'qt_QString*' , +'QString&n::null' => 'qt_QString*' , +'QString&nameFilter::null' => 'qt_QString*' , +'QString&noButtonText::null' => 'qt_QString*' , +'QString&search_delimiters::null' => 'qt_QString*' , +'QString&style::null' => 'qt_QString*' , +'QString&suffix::null' => 'qt_QString*' , +'QString&text::null' => 'qt_QString*' , +'QString&text_::null' => 'qt_QString*' , +'QString&translation::null' => 'qt_QString*' , +'QString&yesButtonText::null' => 'qt_QString*' , +'QString' => 'qt_QString *', +'QString*' => 'qt_QString*' , +'QString::null' => 'qt_QString_null()' , +'QStringBucket*' => 'qt_QStringBucket*', +'QStringData*' => 'qt_QStringData*', +'QStringList&' => 'qt_QStringList*' , +'QStringList' => 'qt_QStringList*' , +'QStringList*' => 'qt_QStringList*' , +'QStringcharSetName::null' => 'qt_QStringcharSetName*' , +'QStyle&' => 'qt_QStyle*' , +'QStyle*' => 'qt_QStyle*' , +'QStyle::ScrollControl' => 'int' , +'QStyle::StylePixmap' => 'int', +'QStyle::SubControl' => 'int', +'QStyle::SubRect' => 'int', +'QStyleFactory*' => 'qt_QStyleFactory*', +'QStyleFactoryInterface*' => 'qt_QStyleFactoryInterface*', +'QStyleHintReturn*' => 'qt_QStyleHintReturn*', +'QStyleOption&' => 'int', +'QStyleOption' => 'int', +'QStyleOption*' => 'int*', +'QStylePlugin*' => 'qt_QStylePlugin*', +'QStyleSheet*' => 'qt_QStyleSheet*' , +'QStyleSheetItem&' => 'qt_QStyleSheetItem*' , +'QStyleSheetItem*' => 'qt_QStyleSheetItem*' , +'QStyleSheetItem::DisplayMode*' => 'int', +'QStyleSheetItem::ListStyle*' => 'int', +'QStyleSheetItem::WhiteSpaceMode' => 'int', +'QTSCIICodec*' => 'qt_QTSCIICodec*', +'QTSMFI' => 'int' , +'QTab*' => 'qt_QTab*', +'QTabBar*' => 'qt_QTabBar*' , +'QTabBar::Shape' => 'int' , +'QTabDialog*' => 'qt_QTabDialog*', +'QTabWidget*' => 'qt_QTabWidget*', +'QTable*' => 'qt_QTable*' , +'QTableHeader*' => 'qt_QTableHeader*', +'QTableItem*' => 'qt_QTableItem*' , +'QTableSelection&' => 'qt_QTableSelection*' , +'QTableSelection' => 'qt_QTableSelection*' , +'QTableSelection*' => 'qt_QTableSelection*', +'QTableView*' => 'qt_QTableView*', +'QTabletEvent*' => 'qt_QTabletEvent*', +'QTextBrowser*' => 'qt_QTextBrowser*', +'QTextCodec*' => 'qt_QTextCodec*' , +'QTextCodecFactory*' => 'qt_QTextCodecFactory*', +'QTextCodecFactoryInterface*' => 'qt_QTextCodecFactoryInterface*', +'QTextCodecPlugin*' => 'qt_QTextCodecPlugin*', +'QTextCursor*' => 'qt_QTextCursor*', +'QTextDecoder*' => 'qt_QTextDecoder*' , +'QTextDocument*' => 'qt_QTextDocument*', +'QTextDrag*' => 'qt_QTextDrag*', +'QTextEdit*' => 'qt_QTextEdit*', +'QTextEncoder*' => 'qt_QTextEncoder*' , +'QTextFormat*' => 'qt_QTextFormat*', +'QTextIStream*' => 'qt_QTextIStream*', +'QTextOStream&' => 'qt_QTextOStream*' , +'QTextOStream*' => 'qt_QTextOStream*', +'QTextOStreamIterator*' => 'qt_QTextOStreamIterator*', +'QTextParag**' => 'qt_QTextParag**', +'QTextStream&' => 'qt_QTextStream*' , +'QTextStream*' => 'qt_QTextStream*' , +'QTextView*' => 'qt_QTextView*', +'QThread*' => 'qt_QThread*', +'QThreadData*' => 'qt_QThreadData*', +'QThreadEvent*' => 'qt_QThreadEvent*', +'QTime&' => 'qt_QTime *', +'QTime' => 'qt_QTime *', +'QTime*' => 'qt_QTime*', +'QTimeEdit*' => 'qt_QTimeEdit*', +'QTimeWatch*' => 'qt_QTimeWatch*', +'QTimer*' => 'qt_QTimer*', +'QTimerEvent*' => 'qt_QTimerEvent*' , +'QToolBar*' => 'qt_QToolBar*' , +'QToolButton*' => 'qt_QToolButton*' , +'QToolTip*' => 'qt_QToolTip*', +'QToolTipGroup*' => 'qt_QToolTipGroup *', +'QTranslator*' => 'qt_QTranslator*' , +'QTranslatorMessage&' => 'qt_QTranslatorMessage*' , +'QTranslatorMessage' => 'qt_QTranslatorMessage*' , +'QTranslatorMessage*' => 'qt_QTranslatorMessage*', +'QTsciiCodec*' => 'qt_QTsciiCodec*', +'QUObject*' => 'qt_QUObject*', +'QUnknownInterface*' => 'qt_QUnknownInterface*', +'QUnknownInterface**' => 'qt_QUnknownInterface**', +'QUriDrag*' => 'qt_QUriDrag*', +'QUrl&' => 'qt_QUrl*' , +'QUrl' => 'qt_QUrl*' , +'QUrl*' => 'qt_QUrl*', +'QUrlInfo&' => 'qt_QUrlInfo*' , +'QUrlInfo' => 'qt_QUrlInfo*' , +'QUrlInfo*' => 'qt_QUrlInfo*', +'QUrlOperator&' => 'qt_QUrlOperator*' , +'QUrlOperator*' => 'qt_QUrlOperator*' , +'QUtf16Codec*' => 'qt_QUtf16Codec*', +'QUtf8Codec*' => 'qt_QUtf8Codec*', +'QUuid&' => 'qt_QUuid*', +'QUuid*' => 'qt_QUuid*', +'QVBox*' => 'qt_QVBox*' , +'QVBoxLayout*' => 'qt_QVBoxLayout*', +'QVButtonGroup*' => 'qt_QVButtonGroup*', +'QVFbHeader*' => 'qt_QVFbHeader*', +'QVFbKeyData*' => 'qt_QVFbKeyData*', +'QVGroupBox*' => 'qt_QVGroupBox*', +'QValidator*' => 'qt_QValidator *', +'QValidator::State' => 'int', +'QValueList*' => 'qt_QValueList*', +'QValueListConstIterator*' => 'qt_QValueListConstIterator*', +'QValueListIterator*' => 'qt_QValueListIterator*', +'QValueListNode*' => 'qt_QValueListNode*', +'QValueListPrivate*' => 'qt_QValueListPrivate*', +'QValueStack*' => 'qt_QValueStack*', +'QValueVector*' => 'qt_QValueVector*', +'QValueVectorPrivate*' => 'qt_QValueVectorPrivate*', +'QVariant&' => 'qt_QVariant *', +'QVariant' => 'qt_QVariant *', +'QVariant*' => 'qt_QVariant*', +'QVariant::Type' => 'int' , +'QVariantPrivate*' => 'qt_QVariantPrivate*' , +'QVector*' => 'qt_QVector*', +'QWMatrix&' => 'qt_QWMatrix *', +'QWMatrix' => 'qt_QWMatrix *', +'QWMatrix*' => 'qt_QWMatrix*', +'QWSDecoration&' => 'qt_QWSDecoration*' , +'QWSDecoration*' => 'qt_QWSDecoration*' , +'QWSDisplay*' => 'qt_QWSDisplay*' , +'QWSEvent*' => 'qt_QWSEvent*' , +'QWaitCondition*' => 'qt_QWaitCondition*', +'QWhatsThis*' => 'qt_QWhatsThis*', +'QWheelEvent*' => 'qt_QWheelEvent*' , +'QWidget *' => 'qt_QWidget *', +'QWidget' => 'qt_QWidget *', +'QWidget*' => 'qt_QWidget *', +'QWidgetFactory*' => 'qt_QWidgetFactory*', +'QWidgetIntDict&' => 'qt_QWidgetIntDict*' , +'QWidgetIntDict*' => 'qt_QWidgetIntDict*', +'QWidgetIntDictIt&' => 'qt_QWidgetIntDictIt*' , +'QWidgetIntDictIt*' => 'qt_QWidgetIntDictIt*', +'QWidgetItem*' => 'qt_QWidgetItem*', +'QWidgetList&' => 'qt_QWidgetList *' , +'QWidgetList&' => 'qt_QWidgetList*' , +'QWidgetList' => 'qt_QWidgetList *' , +'QWidgetList' => 'qt_QWidgetList*' , +'QWidgetList*' => 'qt_QWidgetList *', +'QWidgetList*' => 'qt_QWidgetList*', +'QWidgetListIt&' => 'qt_QWidgetListIt*' , +'QWidgetListIt*' => 'qt_QWidgetListIt*', +'QWidgetMapper*' => 'qt_QWidgetMapper*', +'QWidgetPlugin*' => 'qt_QWidgetPlugin*', +'QWidgetStack*' => 'qt_QWidgetStack*', +'QWindowsMime*' => 'qt_QWindowsMime*' , +'QWindowsStyle*' => 'qt_QWindowsStyle*', +'QWizard*' => 'qt_QWizard*', +'QWorkspace*' => 'qt_QWorkspace*', +'QXEmbed*' => 'qt_QXEmbed*' , +'QXmlAttributes&' => 'qt_QXmlAttributes*' , +'QXmlAttributes*' => 'qt_QXmlAttributes*', +'QXmlContentHandler*' => 'qt_QXmlContentHandler*' , +'QXmlDTDHandler*' => 'qt_QXmlDTDHandler*' , +'QXmlDeclHandler*' => 'qt_QXmlDeclHandler*' , +'QXmlDefaultHandler*' => 'qt_QXmlDefaultHandler*', +'QXmlEntityResolver*' => 'qt_QXmlEntityResolver*' , +'QXmlErrorHandler*' => 'qt_QXmlErrorHandler*' , +'QXmlInputSource&' => 'qt_QXmlInputSource*' , +'QXmlInputSource*&' => 'qt_QXmlInputSource*', +'QXmlInputSource*' => 'qt_QXmlInputSource*' , +'QXmlLexicalHandler*' => 'qt_QXmlLexicalHandler*' , +'QXmlLocator*' => 'qt_QXmlLocator*' , +'QXmlNamespaceSupport*' => 'qt_QXmlNamespaceSupport*', +'QXmlParseException&' => 'qt_QXmlParseException*' , +'QXmlParseException*' => 'qt_QXmlParseException*', +'QXmlReader*' => 'qt_QXmlReader*', +'QXmlSimpleReader*' => 'qt_QXmlSimpleReader*' , +'QXtApplication*' => 'qt_QXtApplication*', +'QXtWidget*' => 'qt_QXtWidget*', +'Q_INT16&' => 'short', +'Q_INT16' => 'short', +'Q_INT32&' => 'int', +'Q_INT32' => 'int', +'Q_INT8&' => 'char', +'Q_INT8' => 'char', +'Q_LONG&' => 'long', +'Q_LONG' => 'long', +'Q_PACKED*' => 'void*', +'Q_UINT16&' => 'unsigned short', +'Q_UINT16' => 'unsigned short', +'Q_UINT32&' => 'unsigned int', +'Q_UINT32' => 'unsigned int', +'Q_UINT8&' => 'unsigned char', +'Q_UINT8' => 'unsigned char', +'Q_UINT8*' => 'unsigned char*' , +'Q_ULONG&' => 'long', +'Q_ULONG' => 'long', +'Qt*' => 'qt_Qt*' , +'Qt::ArrowType' => 'int' , +'Qt::BackgroundMode' => 'int', +'Qt::DateFormat' => 'int', +'Qt::GUIStyle' => 'int' , +'Qt::GUIStylecolorStyle::WindowsStyle' => 'int' , +'Qt::GUIStylestyle::WindowsStyle' => 'int' , +'Qt::Orientation' => 'int' , +'Qt::RasterOp' => 'int' , +'Qt::UIEffect' => 'int' , +'Qt::WFlags' => 'int' , +'QtMultiLineEdit*' => 'qt_QtMultiLineEdit*', +'QtMultiLineEditRow*' => 'qt_QtMultiLineEditRow*', +'QtTableView*' => 'qt_QtTableView*', +'QwAbsSpriteFieldView*' => 'qt_QwAbsSpriteFieldView*' , +'QwClusterizer*' => 'qt_QwClusterizer*' , +'QwEllipse*' => 'qt_QwEllipse*', +'QwImageSpriteField*' => 'qt_QwImageSpriteField*', +'QwMobilePositionedSprite*' => 'qt_QwMobilePositionedSprite*', +'QwMobileSprite*' => 'qt_QwMobileSprite*', +'QwPolygon*' => 'qt_QwPolygon*', +'QwPolygonalGraphic*' => 'qt_QwPolygonalGraphic*', +'QwPositionedSprite*' => 'qt_QwPositionedSprite*', +'QwPublicList*' => 'qt_QwPublicList*' , +'QwRealMobileSprite*' => 'qt_QwRealMobileSprite*', +'QwRealSprite*' => 'qt_QwRealSprite*', +'QwRectangle*' => 'qt_QwRectangle*', +'QwScrollingSpriteFieldView*' => 'qt_QwScrollingSpriteFieldView*', +'QwSprite*' => 'qt_QwSprite*', +'QwSpriteField*' => 'qt_QwSpriteField*' , +'QwSpriteField*' => 'qt_QwSpriteField*' , +'QwSpriteFieldGraphic&' => 'qt_QwSpriteFieldGraphic*' , +'QwSpriteFieldGraphic*' => 'qt_QwSpriteFieldGraphic*' , +'QwSpriteFieldView*' => 'qt_QwSpriteFieldView*', +'QwSpritePixmap*' => 'qt_QwSpritePixmap*' , +'QwSpritePixmapSequence*' => 'qt_QwSpritePixmapSequence*' , +'QwTextSprite*' => 'qt_QwTextSprite*', +'QwTiledSpriteField*' => 'qt_QwTiledSpriteField*', +'QwVirtualSprite*' => 'qt_QwVirtualSprite*', +'RArray*' => 'kde_RArray*', +'RGBColor&' => 'kde_RGBColor*', +'RGBColor' => 'kde_RGBColor*', +'RGBColor*' => 'kde_RGBColor*', +'Range&' => 'kde_Range*', +'Range' => 'kde_Range*', +'Range*' => 'kde_Range*', +'RangeException&' => 'kde_RangeException*', +'RangeException*' => 'kde_RangeException*', +'RangeImpl*' => 'kde_RangeImpl*', +'RasterOp' => 'int', +'RawDataPacket*' => 'kde_RawDataPacket*', +'ReadOnlyPart*' => 'kde_ReadOnlyPart*', +'ReadWritePart*' => 'kde_ReadWritePart*', +'Rect&' => 'kde_Rect*', +'Rect' => 'kde_Rect*', +'Rect*' => 'kde_Rect*', +'Reference&' => 'kde_Reference*', +'Reference*' => 'kde_Reference*', +'ReferenceClean*' => 'kde_ReferenceClean*', +'ReferenceHelper*' => 'kde_ReferenceHelper*', +'Region' => 'int', +'RegionType' => 'int', +'RemoteScheduleNode*' => 'kde_RemoteScheduleNode*', +'RenameDlg*' => 'kde_RenameDlg*', +'RenderStyle*' => 'kde_RenderStyle*' , +'Rep*' => 'kde_Rep*', +'RunMode' => 'int' , +'SButton*' => 'kde_SButton*', +'SCFlags' => 'int', +'SFlags' => 'int', +'ScheduleNode*' => 'kde_ScheduleNode*', +'Scheduler*' => 'kde_Scheduler*', +'ScrollBarMode' => 'int', +'ScrollControl' => 'int' , +'SearchInterface*' => 'kde_SearchInterface*', +'Section&' => 'kde_Section*' , +'Section*&' => 'kde_Section*' , +'Section*' => 'kde_Section*' , +'SegmentStyle' => 'int', +'SelectionInterface*' => 'kde_SelectionInterface*', +'Separator' => 'int', +'Server&' => 'Server*' , +'Server*' => 'kde_Server*', +'ServerHello&' => 'kde_ServerHello*', +'ServerHello*' => 'kde_ServerHello*', +'Service*' => 'kde_Service*', +'SessionData*' => 'kde_SessionData*', +'SimpleFormat*' => 'kde_SimpleFormat*', +'SimpleJob*' => 'kde_SimpleJob*', +'SimpleSoundServer&' => 'kde_SimpleSoundServer*', +'SimpleSoundServer' => 'kde_SimpleSoundServer*', +'SimpleSoundServer*' => 'kde_SimpleSoundServer*', +'SimpleSoundServer_base*' => 'kde_SimpleSoundServer_base*', +'SimpleSoundServer_skel*' => 'kde_SimpleSoundServer_skel*', +'SimpleSoundServer_stub*' => 'kde_SimpleSoundServer_stub*', +'SkipDlg*' => 'kde_SkipDlg*', +'Slave*' => 'kde_Slave*', +'SlaveBase*' => 'kde_SlaveBase*', +'SlaveBasePrivate*' => 'kde_SlaveBasePrivate*', +'SlaveConfig*' => 'kde_SlaveConfig*', +'SlaveInterface*' => 'kde_SlaveInterface*', +'SocketConnection*' => 'kde_SocketConnection*', +'Spec' => 'int', +'SpecialEvent*' => 'kde_SpecialEvent*', +'SshProcess*' => 'kde_SshProcess*', +'SshProcessPrivate*' => 'kde_SshProcessPrivate*', +'StartupClass*' => 'kde_StartupClass*', +'StartupManager*' => 'kde_StartupManager*', +'StatJob*' => 'kde_StatJob*', +'State' => 'int', +'QSocket::State' => 'int', +'StatusbarProgress*' => 'kde_StatusbarProgress*', +'StdAddressBook*' => 'kde_StdAddressBook*', +'StdFlowSystem*' => 'kde_StdFlowSystem*', +'StdIOManager*' => 'kde_StdIOManager*', +'StdScheduleNode*' => 'kde_StdScheduleNode*', +'StdSynthModule*' => 'kde_StdSynthModule*', +'StereoEffect&' => 'kde_StereoEffect*', +'StereoEffect' => 'kde_StereoEffect*', +'StereoEffect*' => 'kde_StereoEffect*', +'StereoEffectStack&' => 'kde_StereoEffectStack*', +'StereoEffectStack' => 'kde_StereoEffectStack*', +'StereoEffectStack*' => 'kde_StereoEffectStack*', +'StereoEffectStack_base*' => 'kde_StereoEffectStack_base*', +'StereoEffectStack_skel*' => 'kde_StereoEffectStack_skel*', +'StereoEffectStack_stub*' => 'kde_StereoEffectStack_stub*', +'StereoEffect_base*' => 'kde_StereoEffect_base*', +'StereoEffect_skel*' => 'kde_StereoEffect_skel*', +'StereoEffect_stub*' => 'kde_StereoEffect_stub*', +'StereoFFTScope&' => 'kde_StereoFFTScope*', +'StereoFFTScope' => 'kde_StereoFFTScope*', +'StereoFFTScope*' => 'kde_StereoFFTScope*', +'StereoFFTScope_base*' => 'kde_StereoFFTScope_base*', +'StereoFFTScope_skel*' => 'kde_StereoFFTScope_skel*', +'StereoFFTScope_stub*' => 'kde_StereoFFTScope_stub*', +'StereoVolumeControl&' => 'kde_StereoVolumeControl*', +'StereoVolumeControl' => 'kde_StereoVolumeControl*', +'StereoVolumeControl*' => 'kde_StereoVolumeControl*', +'StereoVolumeControl_base*' => 'kde_StereoVolumeControl_base*', +'StereoVolumeControl_skel*' => 'kde_StereoVolumeControl_skel*', +'StereoVolumeControl_stub*' => 'kde_StereoVolumeControl_stub*', +'StreamMode&' => 'int', +'String*' => 'kde_String*', +'StringSectionMap::iterator&' => 'kde_StringSectionMap*' , +'StringSectionMap::iterator' => 'kde_StringSectionMap*r' , +'StubProcess*' => 'kde_StubProcess*', +'StyleHint' => 'int', +'StyleListImpl*' => 'kde_StyleListImpl*', +'StylePixmap' => 'int', +'StyleSheet&' => 'kde_StyleSheet*', +'StyleSheet' => 'kde_StyleSheet*', +'StyleSheet*' => 'kde_StyleSheet*', +'StyleSheetImpl*' => 'kde_StyleSheetImpl*', +'StyleSheetList&' => 'kde_StyleSheetList*', +'StyleSheetList' => 'kde_StyleSheetList', +'StyleSheetList*' => 'kde_StyleSheetList*', +'StyleSheetListImpl*' => 'kde_StyleSheetListImpl*', +'StyleStrategy' => 'int', +'SuProcess*' => 'kde_SuProcess*', +'SubClass&' => 'kde_SubClass*', +'SubClass*' => 'kde_SubClass*', +'SubControl' => 'int', +'SubRect' => 'int', +'SynthBuffer*' => 'kde_SynthBuffer*', +'SynthModule&' => 'kde_SynthModule*', +'SynthModule' => 'kde_SynthModule*', +'SynthModule*' => 'kde_SynthModule*', +'SynthModule_base*' => 'kde_SynthModule_base*', +'SynthModule_skel*' => 'kde_SynthModule_skel*', +'SynthModule_stub*' => 'kde_SynthModule_stub*', +'SynthOut*' => 'kde_SynthOut*', +'Synth_ADD&' => 'kde_Synth_ADD*', +'Synth_ADD' => 'kde_Synth_ADD*', +'Synth_ADD*' => 'kde_Synth_ADD*', +'Synth_ADD_base*' => 'kde_Synth_ADD_base*', +'Synth_ADD_skel*' => 'kde_Synth_ADD_skel*', +'Synth_ADD_stub*' => 'kde_Synth_ADD_stub*', +'Synth_AMAN_PLAY&' => 'kde_Synth_AMAN_PLAY*', +'Synth_AMAN_PLAY' => 'kde_Synth_AMAN_PLAY*', +'Synth_AMAN_PLAY*' => 'kde_Synth_AMAN_PLAY*', +'Synth_AMAN_PLAY_base*' => 'kde_Synth_AMAN_PLAY_base*', +'Synth_AMAN_PLAY_skel*' => 'kde_Synth_AMAN_PLAY_skel*', +'Synth_AMAN_PLAY_stub*' => 'kde_Synth_AMAN_PLAY_stub*', +'Synth_AMAN_RECORD&' => 'kde_Synth_AMAN_RECORD*', +'Synth_AMAN_RECORD' => 'kde_Synth_AMAN_RECORD*', +'Synth_AMAN_RECORD*' => 'kde_Synth_AMAN_RECORD*', +'Synth_AMAN_RECORD_base*' => 'kde_Synth_AMAN_RECORD_base*', +'Synth_AMAN_RECORD_skel*' => 'kde_Synth_AMAN_RECORD_skel*', +'Synth_AMAN_RECORD_stub*' => 'kde_Synth_AMAN_RECORD_stub*', +'Synth_BUS_DOWNLINK&' => 'kde_Synth_BUS_DOWNLINK*', +'Synth_BUS_DOWNLINK' => 'kde_Synth_BUS_DOWNLINK*', +'Synth_BUS_DOWNLINK*' => 'kde_Synth_BUS_DOWNLINK*', +'Synth_BUS_DOWNLINK_base*' => 'kde_Synth_BUS_DOWNLINK_base*', +'Synth_BUS_DOWNLINK_skel*' => 'kde_Synth_BUS_DOWNLINK_skel*', +'Synth_BUS_DOWNLINK_stub*' => 'kde_Synth_BUS_DOWNLINK_stub*', +'Synth_BUS_UPLINK&' => 'kde_Synth_BUS_UPLINK*', +'Synth_BUS_UPLINK' => 'kde_Synth_BUS_UPLINK*', +'Synth_BUS_UPLINK*' => 'kde_Synth_BUS_UPLINK*', +'Synth_BUS_UPLINK_base*' => 'kde_Synth_BUS_UPLINK_base*', +'Synth_BUS_UPLINK_skel*' => 'kde_Synth_BUS_UPLINK_skel*', +'Synth_BUS_UPLINK_stub*' => 'kde_Synth_BUS_UPLINK_stub*', +'Synth_FREQUENCY&' => 'kde_Synth_FREQUENCY*', +'Synth_FREQUENCY' => 'kde_Synth_FREQUENCY*', +'Synth_FREQUENCY*' => 'kde_Synth_FREQUENCY*', +'Synth_FREQUENCY_base*' => 'kde_Synth_FREQUENCY_base*', +'Synth_FREQUENCY_skel*' => 'kde_Synth_FREQUENCY_skel*', +'Synth_FREQUENCY_stub*' => 'kde_Synth_FREQUENCY_stub*', +'Synth_MUL&' => 'kde_Synth_MUL*', +'Synth_MUL' => 'kde_Synth_MUL*', +'Synth_MUL*' => 'kde_Synth_MUL*', +'Synth_MULTI_ADD&' => 'kde_Synth_MULTI_ADD*', +'Synth_MULTI_ADD' => 'kde_Synth_MULTI_ADD*', +'Synth_MULTI_ADD*' => 'kde_Synth_MULTI_ADD*', +'Synth_MULTI_ADD_base*' => 'kde_Synth_MULTI_ADD_base*', +'Synth_MULTI_ADD_skel*' => 'kde_Synth_MULTI_ADD_skel*', +'Synth_MULTI_ADD_stub*' => 'kde_Synth_MULTI_ADD_stub*', +'Synth_MUL_base*' => 'kde_Synth_MUL_base*', +'Synth_MUL_skel*' => 'kde_Synth_MUL_skel*', +'Synth_MUL_stub*' => 'kde_Synth_MUL_stub*', +'Synth_PLAY&' => 'kde_Synth_PLAY*', +'Synth_PLAY' => 'kde_Synth_PLAY*', +'Synth_PLAY*' => 'kde_Synth_PLAY*', +'Synth_PLAY_WAV&' => 'kde_Synth_PLAY_WAV*', +'Synth_PLAY_WAV' => 'kde_Synth_PLAY_WAV*', +'Synth_PLAY_WAV*' => 'kde_Synth_PLAY_WAV*', +'Synth_PLAY_WAV_base*' => 'kde_Synth_PLAY_WAV_base*', +'Synth_PLAY_WAV_skel*' => 'kde_Synth_PLAY_WAV_skel*', +'Synth_PLAY_WAV_stub*' => 'kde_Synth_PLAY_WAV_stub*', +'Synth_PLAY_base*' => 'kde_Synth_PLAY_base*', +'Synth_PLAY_skel*' => 'kde_Synth_PLAY_skel*', +'Synth_PLAY_stub*' => 'kde_Synth_PLAY_stub*', +'Synth_RECORD&' => 'kde_Synth_RECORD*', +'Synth_RECORD' => 'kde_Synth_RECORD*', +'Synth_RECORD*' => 'kde_Synth_RECORD*', +'Synth_RECORD_base*' => 'kde_Synth_RECORD_base*', +'Synth_RECORD_skel*' => 'kde_Synth_RECORD_skel*', +'Synth_RECORD_stub*' => 'kde_Synth_RECORD_stub*', +'Synth_WAVE_SIN&' => 'kde_Synth_WAVE_SIN*', +'Synth_WAVE_SIN' => 'kde_Synth_WAVE_SIN*', +'Synth_WAVE_SIN*' => 'kde_Synth_WAVE_SIN*', +'Synth_WAVE_SIN_base*' => 'kde_Synth_WAVE_SIN_base*', +'Synth_WAVE_SIN_skel*' => 'kde_Synth_WAVE_SIN_skel*', +'Synth_WAVE_SIN_stub*' => 'kde_Synth_WAVE_SIN_stub*', +'T&' => 'T*' , +'T' => 'T*' , +'T*' => 'T*' , +'TCPConnection*' => 'kde_TCPConnection*', +'TCPServer*' => 'kde_TCPServer*', +'TCPSlaveBase*' => 'kde_TCPSlaveBase*', +'TRUE' => '1', +'Task*' => 'kde_Task*', +'Text&' => 'kde_Text*', +'Text' => 'kde_Text*', +'Text*' => 'kde_Text*', +'TextFormat' => 'int' , +'TextImpl*' => 'kde_TextImpl*', +'ThumbCreator*' => 'kde_ThumbCreator*', +'TickSetting' => 'int', +'Ticket*' => 'kde_Ticket*', +'TimeNotify*' => 'kde_TimeNotify*', +'TimeWatcher*' => 'kde_TimeWatcher*', +'TimeZone&' => 'kde_TimeZone*', +'TimeZone*' => 'kde_TimeZone*', +'TmpGlobalComm&' => 'kde_TmpGlobalComm*', +'TmpGlobalComm' => 'kde_TmpGlobalComm*', +'TmpGlobalComm*' => 'kde_TmpGlobalComm*', +'TmpGlobalComm_base*' => 'kde_TmpGlobalComm_base*', +'TmpGlobalComm_skel*' => 'kde_TmpGlobalComm_skel*', +'TmpGlobalComm_stub*' => 'kde_TmpGlobalComm_stub*', +'ToolBarDock&' => 'int' , +'ToolBarDock' => 'int', +'TraderOffer&' => 'kde_TraderOffer*', +'TraderOffer' => 'kde_TraderOffer*', +'TraderOffer*' => 'kde_TraderOffer*', +'TraderOffer_base*' => 'kde_TraderOffer_base*', +'TraderOffer_skel*' => 'kde_TraderOffer_skel*', +'TraderOffer_stub*' => 'kde_TraderOffer_stub*', +'TraderQuery&' => 'kde_TraderQuery*', +'TraderQuery' => 'kde_TraderQuery*', +'TraderQuery*' => 'kde_TraderQuery*', +'TraderQuery_base*' => 'kde_TraderQuery_base*', +'TraderQuery_skel*' => 'kde_TraderQuery_skel*', +'TraderQuery_stub*' => 'kde_TraderQuery_stub*', +'TransferJob*' => 'kde_TransferJob*', +'TreeWalker&' => 'kde_TreeWalker*', +'TreeWalker' => 'kde_TreeWalker*', +'TreeWalker*' => 'kde_TreeWalker*', +'TreeWalkerImpl*' => 'kde_TreeWalkerImpl*', +'True' => '1', +'Type&' => 'kde_Type*', +'Type' => 'int', +'Type*' => 'kde_Type*', +'TypeComponent&' => 'kde_TypeComponent*', +'TypeComponent*' => 'kde_TypeComponent*', +'TypeDef&' => 'kde_TypeDef*', +'TypeDef' => 'kde_TypeDef*', +'TypeDef*' => 'kde_TypeDef*', +'TypeEntry*' => 'kde_TypeEntry*', +'TypeInfo*' => 'kde_TypeInfo*', +'UChar&' => 'kde_UChar*', +'UChar' => 'kde_UChar*', +'UChar*' => 'kde_UChar*', +'UCharReference&' => 'kde_UCharReference*', +'UCharReference' => 'kde_UCharReference*', +'UCharReference*' => 'kde_UCharReference*', +'UDSAtom*' => 'kde_UDSAtom*', +'UDSEntry&' => 'kde_UDSEntry*', +'UDSEntryList&' => 'kde_UDSEntryList*', +'UIServer*' => 'kde_UIServer*', +'UIServer_stub*' => 'kde_UIServer_stub*', +'ULONG_MAX' => 'ULONG_MAX', +'URLArgs&' => 'kde_URLArgs*', +'URLArgs' => 'kde_URLArgs*', +'URLArgs*' => 'kde_URLArgs*', +'UString&' => 'kde_UString*', +'UString' => 'kde_UString*', +'UString*' => 'kde_UString*', +'Undefined*' => 'kde_Undefined*', +'UndoInterface*' => 'kde_UndoInterface*', +'UndoRedoInfo*' => 'int*', +'UnixConnection*' => 'kde_UnixConnection*', +'UnixServer*' => 'kde_UnixServer*', +'VCardFormat*' => 'kde_VCardFormat*', +'VPort*' => 'kde_VPort*', +'Value&' => 'kde_Value*', +'Value' => 'kde_Value*', +'Value*' => 'kde_Value*', +'VerticalAlignment*' => 'int*', +'View*' => 'kde_View*' , +'ViewCursorInterface*' => 'kde_ViewCursorInterface*', +'VoiceManager*' => 'kde_VoiceManager*', +'WFlags' => 'int', +'WId' => 'unsigned int', +'WState' => 'int', +'WavPlayObject&' => 'kde_WavPlayObject*', +'WavPlayObject' => 'kde_WavPlayObject*', +'WavPlayObject*' => 'kde_WavPlayObject*', +'WavPlayObject_base*' => 'kde_WavPlayObject_base*', +'WavPlayObject_skel*' => 'kde_WavPlayObject_skel*', +'WavPlayObject_stub*' => 'kde_WavPlayObject_stub*', +'WeakReference*' => 'kde_WeakReference*', +'WeakReferenceBase*' => 'kde_WeakReferenceBase*', +'Widget' => 'int' , +'WidgetClass' => 'int' , +'WidthMode' => 'int', +'Window' => 'kde_Window*', +'Window*' => 'kde_Window*', +'WindowArgs&' => 'kde_WindowArgs*', +'WindowArgs*' => 'kde_WindowArgs*', +'WindowsVersion' => 'int' , +'XrmOptionDescRec*' => 'XrmOptionDescRec*' , +'array_data*' => 'void*' , +'bitarr_data*' => 'void*', +'bool&' => 'int' , +'bool' => 'int', +'bool*' => 'int*', +'char *' => 'char *', +'char&' => 'char' , +'char' => 'char', +'char* bugsEmailAddress @bugs.kde.org"' => 'String', +'char*&' => 'char*', +'char*' => 'char*', +'char**' => 'char**', +'char*xpm[]' => 'char**' , +'classConnection*' => 'kde_classConnection*', +'classDeviceManager*' => 'kde_classDeviceManager*', +'classExtensionLoader*' => 'kde_classExtensionLoader*', +'classMidiStatus*' => 'kde_classMidiStatus*', +'classObjectReference' => 'kde_classObjectReference*', +'classQPainter*' => 'kde_classQPainter*', +'classStartupClass*' => 'kde_classStartupClass*', +'double d .0' => 'double', +'double nDefault .0' => 'double', +'double pri .0' => 'double', +'double&' => 'double' , +'double' => 'double', +'double*' => 'double*' , +'false' => '0', +'float desat .3' => 'float', +'float&' => 'float' , +'float' => 'float', +'float*' => 'float*', +'image_io_handler' => 'int' , +'int a |' => 'int', +'int buttonMask|Apply|Cancel' => 'int', +'int buttonMask|No|Cancel' => 'int', +'int desktop' => 'int', +'int&' => 'int', +'int' => 'int', +'int*' => 'int*', +'kdbgstream&' => 'kde_Kdbgstream*' , +'kdbgstream*' => 'kde_kdbgstream*', +'khtml*' => 'kde_khtml*', +'khtml::ChildFrame*' => 'kde_khtml_ChildFrame*' , +'khtml::DrawContentsEvent*' => 'kde_khtml_DrawContentsEvent*' , +'khtml::MouseDoubleClickEvent*' => 'kde_khtml_MouseDoubleClickEvent*' , +'khtml::MouseMoveEvent*' => 'kde_khtml_MouseMoveEvent*' , +'khtml::MousePressEvent*' => 'kde_khtml_MousePressEvent*' , +'khtml::MouseReleaseEvent*' => 'kde_khtml_MouseReleaseEvent*' , +'khtml::RenderObject*' => 'kde_khtml_RenderObject*' , +'khtml::RenderStyle*' => 'kde_khtml_RenderStyle*' , +'khtml__DrawContentsEvent*' => 'kde_khtml__DrawContentsEvent*', +'khtml__MouseDoubleClickEvent*' => 'kde_khtml__MouseDoubleClickEvent*', +'khtml__MouseEvent*' => 'kde_khtml__MouseEvent*', +'khtml__MouseMoveEvent*' => 'kde_khtml__MouseMoveEvent*', +'khtml__MousePressEvent*' => 'kde_khtml__MousePressEvent*', +'khtml__MouseReleaseEvent*' => 'kde_khtml__MouseReleaseEvent*', +'kndbgstream&' => 'void**' , +'kndbgstream*' => 'kde_kndbgstream*', +'ksockaddr_in*' => 'void*' , +'long _blockSize *' => 'long *', +'long int' => 'long', +'long unsigned int' => 'long', +'long&' => 'long' , +'long' => 'long', +'long_blockSize*' => 'long_blockSize*' , +'longint' => 'long', +'longunsigned int' => 'unsigned long', +'lt_dlhandle' => 'void *' , +'lt_user_dlloader*' => 'kde_lt_user_dlloader*', +'mcopbyte&' => 'void *', +'mcopbyte' => 'unsigned char', +'mode_t _mode (mode_t) -1' => 'int', +'mode_t' => 'long' , +'noteCmd' => 'kde_noteCmd*', +'noteCmd*' => 'kde_noteCmd*', +'ostream&' => 'int', +'ostream*' => 'int', +'pid_t' => 'long' , +'poTime&' => 'kde_poTime*', +'poTime*' => 'kde_poTime*', +'short unsigned' => 'short', +'short' => 'short', +'short*' => 'short*', +'shortunsigned' => 'unsigned short', +'signed int&' => 'signed int' , +'signed long&' => 'signed long' , +'signed short&' => 'signed short' , +'signed' => 'signed' , +'size_t' => 'int' , +'size_t*' => 'int*', +'size_type' => 'int' , +'snd_seq_event_t*' => 'int*', +'ssize_t' => 'int', +'std*' => 'kde_std*', +'std::string&' => 'char *' , +'std::string' => 'char *' , +'time_t' => 'long' , +'timeval&' => 'int', +'true' => '1', +'type&' => 'int' , +'type*' => 'int*' , +'type**' => 'int**' , +'uchar&' => 'unsigned char' , +'uchar' => 'unsigned char' , +'uchar*' => 'unsigned char*', +'uchar**' => 'unsigned char**', +'uint&' => 'unsigned int', +'uint' => 'unsigned int', +'uint*' => 'unsigned int*' , +'uintf~0' => 'unsigned int' , +'ulong' => 'unsigned long', +'unsigned char&' => 'unsigned char', +'unsigned char' => 'unsigned char' , +'unsigned char*' => 'unsigned char*' , +'unsigned int&' => 'unsigned int' , +'unsigned int' => 'unsigned int' , +'unsigned int*' => 'int*' , +'unsigned long int' => 'long', +'unsigned long&' => 'unsigned long' , +'unsigned long' => 'unsigned long' , +'unsigned short int' => 'unsigned short' , +'unsigned short&' => 'unsigned short' , +'unsigned short' => 'unsigned short' , +'unsigned short*' => 'short*' , +'unsigned shortint' => 'unsigned short' , +'unsigned' => 'unsigned int' , +'ushort' => 'unsigned short', +'ushort*' => 'short*' , +'voice*' => 'int', +'void' => 'void', +'void(*)()' => 'void(*)()' , +'void*' => 'void*', +'~' => '~', +'QValueList<int>' => 'qt_QIntValueList*', +'QValueList<int>&' => 'qt_QIntValueList*', +'QValueList<QIconDragItem>' => 'qt_QIconDragItemValueList*', +'QValueList<QIconDragItem>&' => 'qt_QIconDragItemValueList*', +'QValueList<QPixmap>' => 'qt_QPixmapValueList*', +'QValueList<QString>&' => 'qt_QStringValueList*', +'QValueList<QVariant>&' => 'qt_QVariantValueList*', +'QValueList<QUrlInfo>*' => 'qt_QUrlInfoValueList*', +'QValueList<KDataToolInfo>&' => 'kde_KDataToolInfoValueList*', +'QPtrList<KAction>&' => 'kde_KActionPtrList*', +'QPtrList<KSSLCertificate>&' => 'kde_KSSLCertificatePtrList*', +'QPtrList<KXMLGUIClient>*' => 'kde_KXMLGUIClientPtrList*', +'QPtrList<QDockWindow>*' => 'qt_QDockWindowPtrList*', +'QPtrList<QPixmap>' => 'qt_QPixmapPtrList*', +'QPtrList<QPoint>' => 'qt_QPointPtrList*', +'KService::Ptr&' => 'kde_KServicePtr*', +'ClassContext*' => 'kde_ClassContext*', +'ClassStoreIface*' => 'kde_ClassStoreIface*', +'ClipboardDocumentIface*' => 'kde_ClipboardDocumentIface*', +'CodeCompletionDocumentIface*' => 'kde_CodeCompletionDocumentIface*', +'CursorDocumentIface*' => 'kde_CursorDocumentIface*', +'DebugDocumentIface*' => 'kde_DebugDocumentIface*', +'DocumentInterface*' => 'kde_DocumentInterface*', +'EditDocumentIface*' => 'kde_EditDocumentIface*', +'EditorInterface*' => 'kde_EditorInterface*', +'FileContext*' => 'kde_FileContext*', +'KDevAppFrontendIface*' => 'kde_KDevAppFrontendIface*', +'KDevCoreIface*' => 'kde_KDevCoreIface*', +'KDevMakeFrontendIface*' => 'kde_KDevMakeFrontendIface*', +'KEditor*' => 'kde_KEditor*', +'KEditor::Document*' => 'kde_Document*', +'ParsedClassContainer&' => 'kde_ParsedClassContainer*', +'ParsedContainer&' => 'kde_ParsedContainer*', +'ParsedScopeContainer&' => 'kde_ParsedScopeContainer*', +'QValueList<ParsedMethod>*' => 'kde_ParsedMethodList*', +'QValueList<CompletionEntry>' => 'kde_CompletionEntryValueList*', +'StatusDocumentIface*' => 'kde_StatusDocumentIface*', +'UndoDocumentIface*' => 'kde_UndoDocumentIface*', +'KShortcut&' => 'kde_KShortcut*', +'KShortcut' => 'kde_KShortcut*', +'KShortcut*' => 'kde_KShortcut*', +'KKey&' => 'kde_KKey*', +'KKey*' => 'kde_KKey*', +'KKeyNative&' => 'kde_KKeyNative*', +'KKeyNative*' => 'kde_KKeyNative*', +'KKeyVariations&' => 'kde_KKeyVariations*', +'KKeyVariations*' => 'kde_KKeyVariations*', +'KKeyX11&' => 'kde_KKeyX11*', +'KKeyX11' => 'kde_KKeyX11*', +'KKeyX11*' => 'kde_KKeyX11*', +'KAccelActions' => 'kde_KAccelActions*', +'KRandomSequence&' => 'kde_KRandomSequence*', +'KIcon::Context' => 'int', +'KIcon::Group' => 'int', +); + + + # Initialize %builtins, used by resolveType + my @noreflist = qw( const int char long double template + unsigned signed float void bool true false uint + uint32 uint64 extern static inline virtual operator ); + foreach my $r ( @noreflist ) { + $builtins{ $r } = $r; + } + +} + +sub interfacemap +{ + my ( $interfaceType ) = @_; + return $interfacemap{$interfaceType}; +} + +sub ctypemap +{ + my ( $cType ) = @_; + return $ctypemap{$cType}; +} + +sub setctypemap +{ + my ( $cType, $cValue ) = @_; + + $ctypemap{$cType} = $cValue; + return; +} + +sub addNamespace +{ + my ( $className ) = @_; + + if ( $className =~ /Bridge$/ ) { + return $className; + } + + if ( $className =~ /^(AbstractView|Attr|CDATASection|CSSCharsetRule|CSSException|CSSFontFaceRule|CSSImportRule|CSSMediaRule|CSSPageRule|CSSPrimitiveValue|CSSRule|CSSRuleList|CSSStyleDeclaration|CSSStyleRule|CSSStyleSheet|CSSUnknownRule|CSSValue|CSSValueList|CharacterData|Comment|Counter|CustomNodeFilter|DOMException|DOMImplementation|DOMString|Document|DocumentFragment|DocumentStyle|DocumentType|DomShared|Element|Entity|EntityReference|EventException|EventListener|LinkStyle|MediaList|MutationEvent|NamedNodeMap|Node|NodeFilter|NodeIterator|NodeList|Notation|ProcessingInstruction|RGBColor|Range|RangeException|Rect|StyleSheet|StyleSheetList|Text|TreeWalker|UIEvent|HTML.*)/ ) + { + return "DOM::".$className; + } + + if ( $className =~ /^(BrowserExtension|BrowserHostExtensionBrowserInterface|ComponentFactory|DockMainWindow|Event|Factory|GUIActivateEvent|HistoryProvider|MainWindow|OpenURLEvent|Part|PartActivateEvent|PartBase|PartManager|PartSelectEvent|Plugin|PluginInfo|ReadOnlyPart|ReadWritePart|URLArgs|WindowArgs)/ ) + { + return "KParts::".$className; + } + + if ( $className =~ /^(AuthInfo|AutoLogin|CacheInfo|ChmodJob|Connection|CopyInfo|CopyJob|DefaultProgress|DeleteJob|FileCopyJob|Job|ListJob|MetaData|MimetypeJob|MultiGetJob|NetAccess|NetRC|PasswordDialog|PreviewJob|ProgressBase|RenameDlg|Scheduler|SessionData|SimpleJob|SkipDlg|Slave|SlaveBase|SlaveConfig|SlaveInterface|StatJob|StatusbarProgress|TCPSlaveBase|Task|TransferJob|UDSAtom)/ ) + { + return "KIO::".$className; + } + + if ( $className =~ /^(DrawContentsEvent|MouseDoubleClickEvent|MouseEvent|MouseMoveEvent|MousePressEvent|MouseReleaseEvent)/ ) + { + return "khtml::".$className; + } + + if ( $className =~ /^(OfferList)/ ) + { + return "KTrader::".$className; + } + + if ( $className =~ /^(BlockSelectionInterface|ClipboardInterface|CodeCompletionInterface|CompletionEntry|ConfigInterface|Cursor|CursorInterface|Document|EditInterface|Editor|HighlightingInterface|Mark|MarkInterface|PopupMenuInterface|PrintInterface|SearchInterface|SelectionInterface|UndoInterface|View|ViewCursorInterface)/ ) + { + return "KTextEditor::".$className; + } + + + return $className; +} + + +# Helper for resolveType. This one is recursive and returns undef if not found. +sub resolveTypeInternal($$$) +{ + my ( $argType, $contextClass, $rootnode ) = @_; + + #print "resolveTypeInternal type:'$argType' context:'$contextClass->{astNodeName}' ($contextClass)\n"; + + my $contextClassName = join( "::", kdocAstUtil::heritage($contextClass) ); + + # 'A' resolves to 'A' in context 'A' ;) (i.e. classname itself) + return $contextClassName if ( $argType eq $contextClass->{astNodeName} ); + + # Try as an identifier of contextClass + #print "Trying as ".$contextClassName."::".$argType."\n"; + + my $node = kdocAstUtil::findRef( $rootnode, $contextClassName."::".$argType ); + + #print "Found as $node->{NodeType}\n" if $node; + + return $contextClassName."::".$argType if ( $node + && $node->{NodeType} ne 'method' + && $node->{NodeType} ne 'deleted' + && $node->{NodeType} ne 'var' ); + + my $found; + + # Then look at ancestors, and try for each one + Iter::Ancestors( $contextClass, $rootnode, undef, undef, + sub { + my ( $ances, $name, $type, $template ) = @_; + unless ($found) { + $found = resolveTypeInternal( $argType, $ances, $rootnode ); + } + }, + undef + ); + + return $found; +} + +=head2 + + Look up a type, following the class hierarchy. + e.g. "Mode", if ContextClassName is A, will be looked as A::Mode, + then as B::Mode (if B is a parent class of A), then as Qt::Mode, + then as just Mode. + +=cut + +sub resolveType($$$) +{ + my ( $argType, $contextClass, $rootnode ) = @_; + $argType =~ s/\s*(\*)\s*$/$1/g; # remove space before * + #print "resolveType: '$argType'\n"; + + # Look for builtin words (int etc.) + return $builtins{ $argType } if exists $builtins{ $argType }; + + # Parse 'const' in front of it, and '*' or '&' after it + my $prefix = $argType =~ s/^const\s+// ? 'const ' : ''; + my $suffix = $argType =~ s/\s*([\&\*]+)$// ? $1 : ''; + #print "resolveType: prefix:$prefix, '$argType', suffix:$suffix\n"; + + # Launch the (possibly recursive) resolveTypeInternal + my $result = resolveTypeInternal( $argType, $contextClass, $rootnode ); + return $prefix.$result.$suffix if $result; + + # Not found, so look as a toplevel class + #print "Checking that ".$argType." exists.\n"; + return $prefix.$argType.$suffix if ( kdocAstUtil::findRef( $rootnode, $argType ) ); + + #print "resolveType: $argType not found (context $contextClass->{astNodeName})\n\n"; + + return $prefix.$argType.$suffix; +} + +1; diff --git a/kalyptus/kdocAstUtil.pm b/kalyptus/kdocAstUtil.pm new file mode 100644 index 0000000..9c8c0dd --- /dev/null +++ b/kalyptus/kdocAstUtil.pm @@ -0,0 +1,762 @@ +=head1 kdocAstUtil + + Utilities for syntax trees. + +=cut + + +package kdocAstUtil; + +use Ast; +use Carp; +use File::Basename; +use kdocUtil; +use Iter; +use strict; + +use vars qw/ $depth $refcalls $refiters @noreflist %noref /; + +sub BEGIN { +# statistics for findRef + + $depth = 0; + $refcalls = 0; + $refiters = 0; + +# findRef will ignore these words + + @noreflist = qw( const int char long double template + unsigned signed float void bool true false uint + uint32 uint64 extern static inline virtual operator ); + + foreach my $r ( @noreflist ) { + $noref{ $r } = 1; + } +} + + +=head2 findNodes + + Parameters: outlist ref, full list ref, key, value + + Find all nodes in full list that have property "key=value". + All resulting nodes are stored in outlist. + +=cut + +sub findNodes +{ + my( $rOutList, $rInList, $key, $value ) = @_; + + my $node; + + foreach $node ( @{$rInList} ) { + next if !exists $node->{ $key }; + if ( $node->{ $key } eq $value ) { + push @$rOutList, $node; + } + } +} + +=head2 allTypes + + Parameters: node list ref + returns: list + + Returns a sorted list of all distinct "NodeType"s in the nodes + in the list. + +=cut + +sub allTypes +{ + my ( $lref ) = @_; + + my %types = (); + foreach my $node ( @{$lref} ) { + $types{ $node->{NodeType} } = 1; + } + + return sort keys %types; +} + + + + +=head2 findRef + + Parameters: root, ident, report-on-fail + Returns: node, or undef + + Given a root node and a fully qualified identifier (:: separated), + this function will try to find a child of the root node that matches + the identifier. + +=cut + +sub findRef +{ + my( $root, $name, $r ) = @_; + + confess "findRef: no name" if !defined $name || $name eq ""; + + $name =~ s/\s+//g; + return undef if exists $noref{ $name }; + + $name =~ s/^#//g; + + my ($iter, @tree) = split /(?:\:\:|#)/, $name; + my $kid; + + $refcalls++; + + # Upward search for the first token + return undef if !defined $iter; + + while ( !defined findIn( $root, $iter ) ) { + return undef if !defined $root->{Parent}; + $root = $root->{Parent}; + } + $root = $root->{KidHash}->{$iter}; + carp if !defined $root; + + # first token found, resolve the rest of the tree downwards + foreach $iter ( @tree ) { + confess "iter in $name is undefined\n" if !defined $iter; + next if $iter =~ /^\s*$/; + + unless ( defined findIn( $root, $iter ) ) { + confess "findRef: failed on '$name' at '$iter'\n" + if defined $r; + return undef; + } + + $root = $root->{KidHash}->{ $iter }; + carp if !defined $root; + } + + return $root; +} + +=head2 findIn + + node, name: search for a child + +=cut + +sub findIn +{ + return undef unless defined $_[0]->{KidHash}; + + my $ret = $_[0]->{KidHash}->{ $_[1] }; + + return $ret; +} + +=head2 linkReferences + + Parameters: root, node + + Recursively links references in the documentation for each node + to real nodes if they can be found. This should be called once + the entire parse tree is filled. + +=cut + +sub linkReferences +{ + my( $root, $node ) = @_; + + if ( exists $node->{DocNode} ) { + linkDocRefs( $root, $node, $node->{DocNode} ); + + if( exists $node->{Compound} ) { + linkSee( $root, $node, $node->{DocNode} ); + } + } + + my $kids = $node->{Kids}; + return unless defined $kids; + + foreach my $kid ( @$kids ) { + # only continue in a leaf node if it has documentation. + next if !exists $kid->{Kids} && !exists $kid->{DocNode}; + if( !exists $kid->{Compound} ) { + linkSee( $root, $node, $kid->{DocNode} ); + } + linkReferences( $root, $kid ); + } +} + +sub linkNamespaces +{ + my ( $node ) = @_; + + if ( defined $node->{ImpNames} ) { + foreach my $space ( @{$node->{ImpNames}} ) { + my $spnode = findRef( $node, $space ); + + if( defined $spnode ) { + $node->AddPropList( "ExtNames", $spnode ); + } + else { + warn "namespace not found: $space\n"; + } + } + } + + return unless defined $node->{Compound} || !defined $node->{Kids}; + + + foreach my $kid ( @{$node->{Kids}} ) { + next unless localComp( $kid ); + + linkNamespaces( $kid ); + } +} + +sub calcStats +{ + my ( $stats, $root, $node ) = @_; +# stats: +# num types +# num nested +# num global funcs +# num methods + + + my $type = $node->{NodeType}; + + if ( $node eq $root ) { + # global methods + if ( defined $node->{Kids} ) { + foreach my $kid ( @{$node->{Kids}} ) { + $stats->{Global}++ if $kid->{NodeType} eq "method"; + } + } + + $node->AddProp( "Stats", $stats ); + } + elsif ( kdocAstUtil::localComp( $node ) + || $type eq "enum" || $type eq "typedef" ) { + $stats->{Types}++; + $stats->{Nested}++ if $node->{Parent} ne $root; + } + elsif( $type eq "method" ) { + $stats->{Methods}++; + } + + return unless defined $node->{Compound} || !defined $node->{Kids}; + + foreach my $kid ( @{$node->{Kids}} ) { + next if defined $kid->{ExtSource}; + calcStats( $stats, $root, $kid ); + } +} + +=head2 linkDocRefs + + Parameters: root, node, docnode + + Link references in the docs if they can be found. This should + be called once the entire parse tree is filled. + +=cut + +sub linkDocRefs +{ + my ( $root, $node, $docNode ) = @_; + return unless exists $docNode->{Text}; + + my ($text, $ref, $item, $tosearch); + + foreach $item ( @{$docNode->{Text}} ) { + next if $item->{NodeType} ne 'Ref'; + + $text = $item->{astNodeName}; + + if ( $text =~ /^(?:#|::)/ ) { + $text = $'; + $tosearch = $node; + } + else { + $tosearch = $root; + } + + $ref = findRef( $tosearch, $text ); + $item->AddProp( 'Ref', $ref ) if defined $ref; + + confess "Ref failed for ", $item->{astNodeName}, + "\n" unless defined $ref; + } +} + +sub linkSee +{ + my ( $root, $node, $docNode ) = @_; + return unless exists $docNode->{See}; + + my ( $text, $tosearch, $ref ); + + foreach $text ( @{$docNode->{See}} ) { + if ( $text =~ /^\s*(?:#|::)/ ) { + $text = $'; + $tosearch = $node; + } + else { + $tosearch = $root; + } + + $ref = findRef( $tosearch, $text ); + $docNode->AddPropList( 'SeeRef', $ref ) + if defined $ref; + } +} + + + +# +# Inheritance utilities +# + +=head2 makeInherit + + Parameter: $rootnode, $parentnode + + Make an inheritance graph from the parse tree that begins + at rootnode. parentnode is the node that is the parent of + all base class nodes. + +=cut + +sub makeInherit +{ + my( $rnode, $parent ) = @_; + + foreach my $node ( @{ $rnode->{Kids} } ) { + next if !defined $node->{Compound}; + + # set parent to root if no inheritance + + if ( !exists $node->{InList} ) { + newInherit( $node, "Global", $parent ); + $parent->AddPropList( 'InBy', $node ); + + makeInherit( $node, $parent ); + next; + } + + # link each ancestor + my $acount = 0; +ANITER: + foreach my $in ( @{ $node->{InList} } ) { + unless ( defined $in ) { + Carp::cluck "warning: $node->{astNodeName} " + ." has undef in InList."; + next ANITER; + } + + my $ref = kdocAstUtil::findRef( $rnode, + $in->{astNodeName} ); + + if( !defined $ref ) { + # ancestor undefined + warn "warning: ", $node->{astNodeName}, + " inherits unknown class '", + $in->{astNodeName},"'\n"; + + $parent->AddPropList( 'InBy', $node ); + } + else { + # found ancestor + $in->AddProp( "Node", $ref ); + $ref->AddPropList( 'InBy', $node ); + $acount++; + } + } + + if ( $acount == 0 ) { + # inherits no known class: just parent it to global + newInherit( $node, "Global", $parent ); + $parent->AddPropList( 'InBy', $node ); + } + makeInherit( $node, $parent ); + } +} + +=head2 newInherit + + p: $node, $name, $lnode? + + Add a new ancestor to $node with raw name = $name and + node = lnode. +=cut + +sub newInherit +{ + my ( $node, $name, $link ) = @_; + + my $n = Ast::New( $name ); + $n->AddProp( "Node", $link ) unless !defined $link; + + $node->AddPropList( "InList", $n ); + return $n; +} + +=head2 inheritName + + pr: $inheritance node. + + Returns the name of the inherited node. This checks for existence + of a linked node and will use the "raw" name if it is not found. + +=cut + +sub inheritName +{ + my ( $innode ) = @_; + + return defined $innode->{Node} ? + $innode->{Node}->{astNodeName} + : $innode->{astNodeName}; +} + +=head2 inheritedBy + + Parameters: out listref, node + + Recursively searches for nodes that inherit from this one, returning + a list of inheriting nodes in the list ref. + +=cut + +sub inheritedBy +{ + my ( $list, $node ) = @_; + + return unless exists $node->{InBy}; + + foreach my $kid ( @{ $node->{InBy} } ) { + push @$list, $kid; + inheritedBy( $list, $kid ); + } +} + +=head2 hasLocalInheritor + + Parameter: node + Returns: 0 on fail + + Checks if the node has an inheritor that is defined within the + current library. This is useful for drawing the class hierarchy, + since you don't want to display classes that have no relationship + with classes within this library. + + NOTE: perhaps we should cache the value to reduce recursion on + subsequent calls. + +=cut + +sub hasLocalInheritor +{ + my $node = shift; + + return 0 if !exists $node->{InBy}; + + my $in; + foreach $in ( @{$node->{InBy}} ) { + return 1 if !exists $in->{ExtSource} + || hasLocalInheritor( $in ); + } + + return 0; +} + + + +=head2 allMembers + + Parameters: hashref outlist, node, $type + + Fills the outlist hashref with all the methods of outlist, + recursively traversing the inheritance tree. + + If type is not specified, it is assumed to be "method" + +=cut + +sub allMembers +{ + my ( $outlist, $n, $type ) = @_; + my $in; + $type = "method" if !defined $type; + + if ( exists $n->{InList} ) { + + foreach $in ( @{$n->{InList}} ) { + next if !defined $in->{Node}; + my $i = $in->{Node}; + + allMembers( $outlist, $i ) + unless $i == $main::rootNode; + } + } + + return unless exists $n->{Kids}; + + foreach $in ( @{$n->{Kids}} ) { + next if $in->{NodeType} ne $type; + + $outlist->{ $in->{astNodeName} } = $in; + } +} + +=head2 findOverride + + Parameters: root, node, name + + Looks for nodes of the same name as the parameter, in its parent + and the parent's ancestors. It returns a node if it finds one. + +=cut + +sub findOverride +{ + my ( $root, $node, $name ) = @_; + return undef if !exists $node->{InList}; + + foreach my $in ( @{$node->{InList}} ) { + my $n = $in->{Node}; + next unless defined $n && $n != $root && exists $n->{KidHash}; + + my $ref = $n->{KidHash}->{ $name }; + + return $n if defined $ref && $ref->{NodeType} eq "method"; + + if ( exists $n->{InList} ) { + $ref = findOverride( $root, $n, $name ); + return $ref if defined $ref; + } + } + + return undef; +} + +=head2 attachChild + + Parameters: parent, child + + Attaches child to the parent, setting Access, Kids + and KidHash of respective nodes. + +=cut + +sub attachChild +{ + my ( $parent, $child ) = @_; + confess "Attempt to attach ".$child->{astNodeName}." to an ". + "undefined parent\n" if !defined $parent; + + $child->AddProp( "Access", $parent->{KidAccess} ); + $child->AddProp( "Parent", $parent ); + + $parent->AddPropList( "Kids", $child ); + + if( !exists $parent->{KidHash} ) { + my $kh = Ast::New( "LookupTable" ); + $parent->AddProp( "KidHash", $kh ); + } + + $parent->{KidHash}->AddProp( $child->{astNodeName}, + $child ); +} + +=head2 makeClassList + + Parameters: node, outlist ref + + fills outlist with a sorted list of all direct, non-external + compound children of node. + +=cut + +sub makeClassList +{ + my ( $rootnode, $list ) = @_; + + @$list = (); + + Iter::LocalCompounds( $rootnode, + sub { + my $node = shift; + + my $her = join ( "::", heritage( $node ) ); + $node->AddProp( "FullName", $her ); + + if ( !exists $node->{DocNode}->{Internal} || + !$main::skipInternal ) { + push @$list, $node; + } + } ); + + @$list = sort { $a->{FullName} cmp $b->{FullName} } @$list; +} + +# +# Debugging utilities +# + +=head2 dumpAst + + Parameters: node, deep + Returns: none + + Does a recursive dump of the node and its children. + If deep is set, it is used as the recursion property, otherwise + "Kids" is used. + +=cut + +sub dumpAst +{ + my ( $node, $deep ) = @_; + + $deep = "Kids" if !defined $deep; + + print "\t" x $depth, $node->{astNodeName}, + " (", $node->{NodeType}, ")\n"; + + my $kid; + + foreach $kid ( $node->GetProps() ) { + print "\t" x $depth, " -\t", $kid, " -> ", $node->{$kid},"\n" + unless $kid =~ /^(astNodeName|NodeType|$deep)$/; + } + if ( exists $node->{InList} ) { + print "\t" x $depth, " -\tAncestors -> "; + foreach my $innode ( @{$node->{InList}} ) { + print $innode->{astNodeName} . ","; + } + print "\n"; + } + + print "\t" x $depth, " -\n" if (defined $node->{ $deep } && scalar(@{$node->{ $deep }}) != 0); + + $depth++; + foreach $kid ( @{$node->{ $deep }} ) { + dumpAst( $kid ); + } + + print "\t" x $depth, "Documentation nodes:\n" if defined + @{ $node->{Doc}->{ "Text" }}; + + foreach $kid ( @{ $node->{Doc}->{ "Text" }} ) { + dumpAst( $kid ); + } + + $depth--; +} + +=head2 testRef + + Parameters: rootnode + + Interactive testing of referencing system. Calling this + will use the readline library to allow interactive entering of + identifiers. If a matching node is found, its node name will be + printed. + +=cut + +sub testRef { + require Term::ReadLine; + + my $rootNode = $_[ 0 ]; + + my $term = new Term::ReadLine 'Testing findRef'; + + my $OUT = $term->OUT || *STDOUT{IO}; + my $prompt = "Identifier: "; + + while( defined ($_ = $term->readline($prompt)) ) { + + my $node = kdocAstUtil::findRef( $rootNode, $_ ); + + if( defined $node ) { + print $OUT "Reference: '", $node->{astNodeName}, + "', Type: '", $node->{NodeType},"'\n"; + } + else { + print $OUT "No reference found.\n"; + } + + $term->addhistory( $_ ) if /\S/; + } +} + +sub printDebugStats +{ + print "findRef: ", $refcalls, " calls, ", + $refiters, " iterations.\n"; +} + +sub External +{ + return defined $_[0]->{ExtSource}; +} + +sub Compound +{ + return defined $_[0]->{Compound}; +} + +sub localComp +{ + my ( $node ) = $_[0]; + return defined $node->{Compound} + && !defined $node->{ExtSource} + && $node->{NodeType} ne "Forward"; +} + +sub hasDoc +{ + return defined $_[0]->{DocNode}; +} + +### Warning: this returns the list of parents, e.g. the 3 words in KParts::ReadOnlyPart::SomeEnum +### It has nothing do to with inheritance. +sub heritage +{ + my $node = shift; + my @heritage; + + while( 1 ) { + push @heritage, $node->{astNodeName}; + + last unless defined $node->{Parent}; + $node = $node->{Parent}; + last unless defined $node->{Parent}; + } + + return reverse @heritage; +} + +sub refHeritage +{ + my $node = shift; + my @heritage; + + while( 1 ) { + push @heritage, $node; + + last unless defined $node->{Parent}; + $node = $node->{Parent}; + last unless defined $node->{Parent}; + } + + return reverse @heritage; + +} + + +1; diff --git a/kalyptus/kdocLib.pm b/kalyptus/kdocLib.pm new file mode 100644 index 0000000..6eac4df --- /dev/null +++ b/kalyptus/kdocLib.pm @@ -0,0 +1,245 @@ + +=head1 kdocLib + +Writes out a library file. + +NOTES ON THE NEW FORMAT + + Stores: class name, members, hierarchy + node types are not stored + + + File Format Spec + ---------------- + + header + zero or more members, each of + method + member + class, each of + inheritance + zero or more members + + + + Unrecognized lines ignored. + + Sample + ------ + + <! KDOC Library HTML Reference File> + <VERSION="2.0"> + <BASE URL="http://www.kde.org/API/kdecore/"> + + <C NAME="KApplication" REF="KApplication.html"> + <IN NAME="QObject"> + <ME NAME="getConfig" REF="KApplication.html#getConfig"> + <M NAME="" REF=""> + </C> + +=cut + +package kdocLib; +use strict; + +use Carp; +use File::Path; +use File::Basename; + +use Ast; +use kdocAstUtil; +use kdocUtil; + + +use vars qw/ $exe $lib $root $plang $outputdir $docpath $url $compress /; + +BEGIN { + $exe = basename $0; +} + +sub writeDoc +{ + ( $lib, $root, $plang, $outputdir, $docpath, $url, + $compress ) = @_; + my $outfile = "$outputdir/$lib.kalyptus"; + $url = $docpath unless defined $url; + + mkpath( $outputdir ) unless -f $outputdir; + + if( $compress ) { + open( LIB, "| gzip -9 > \"$outfile.gz\"" ) + || die "$exe: couldn't write to $outfile.gz\n"; + + } + else { + open( LIB, ">$outfile" ) + || die "$exe: couldn't write to $outfile\n"; + } + + my $libdesc = ""; + if ( defined $root->{LibDoc} ) { + $libdesc="<LIBDESC>".$root->{LibDoc}->{astNodeName}."</LIBDESC>"; + } + + print LIB<<LTEXT; +<! KDOC Library HTML Reference File> +<VERSION="$main::Version"> +<BASE URL="$url"> +<PLANG="$plang"> +<LIBNAME>$lib</LIBNAME> +$libdesc + +LTEXT + + writeNode( $root, "" ); + close LIB; +} + +sub writeNode +{ + my ( $n, $prefix ) = @_; + return if !exists $n->{Compound}; + return if exists $n->{Forward} && !exists $n->{KidAccess}; + + if( $n != $root ) { + $prefix .= $n->{astNodeName}; + print LIB "<C NAME=\"", $n->{astNodeName}, + "\" REF=\"$prefix.html\">\n"; + } + else { + print LIB "<STATS>\n"; + my $stats = $root->{Stats}; + foreach my $stat ( keys %$stats ) { + print LIB "<STAT NAME=\"$stat\">", + $stats->{$stat},"</STAT>\n"; + } + print LIB "</STATS>\n"; + } + + if( exists $n->{Ancestors} ) { + my $in; + foreach $in ( @{$n->{Ancestors}} ) { + $in =~ s/\s+//g; + print LIB "<IN NAME=\"",$in,"\">\n"; + } + } + + return if !exists $n->{Kids}; + my $kid; + my $type; + + foreach $kid ( @{$n->{Kids}} ) { + next if exists $kid->{ExtSource} + || $kid->{Access} eq "private"; + + if ( exists $kid->{Compound} ) { + if( $n != $root ) { + writeNode( $kid, $prefix."::" ); + } + else { + writeNode( $kid, "" ); + } + next; + } + + $type = $kid->{NodeType} eq "method" ? + "ME" : "M"; + + print LIB "<$type NAME=\"", $kid->{astNodeName}, + "\" REF=\"$prefix.html#", $kid->{astNodeName}, "\">\n"; + } + + if( $n != $root ) { + print LIB "</C>\n"; + } +} + +sub readLibrary +{ + my( $rootsub, $name, $path, $relurl ) = @_; + $path = "." unless defined $path; + my $real = $path."/".$name.".kalyptus"; + my $url = "."; + my @stack = (); + my $version = "2.0"; + my $new; + my $root = undef; + my $n = undef; + my $havecomp = -r "$real.gz"; + my $haveuncomp = -r "$real"; + + if ( $haveuncomp ) { + open( LIB, "$real" ) || die "Can't read lib $real\n"; + } + + if( $havecomp ) { + if ( $haveuncomp ) { + warn "$exe: two libs exist: $real and $real.gz. " + ."Using $real\n"; + } + else { + open( LIB, "gunzip < \"$real.gz\"|" ) + || die "Can't read pipe gunzip < \"$real.gz\": $?\n"; + } + } + + while( <LIB> ) { + next if /^\s*$/; + if ( !/^\s*</ ) { + close LIB; + #readOldLibrary( $root, $name, $path ); + return; + } + + if( /<VER\w+\s+([\d\.]+)>/ ) { + # TODO: what do we do with the version number? + $version = $1; + } + elsif ( /<BASE\s*URL\s*=\s*"(.*?)"/ ) { + $url = $1; + $url .= "/" unless $url =~ m:/$:; + + my $test = kdocUtil::makeRelativePath( $relurl, $url ); + $url = $test; + } + elsif( /<PLANG\s*=\s*"(.*?)">/ ) { + $root = $rootsub->( $1 ); + $n = $root; + } + elsif ( /<C\s*NAME="(.*?)"\s*REF="(.*?)"\s*>/ ) { + # class + $new = Ast::New( $1 ); + $new->AddProp( "NodeType", "class" ); + $new->AddProp( "Compound", 1 ); + $new->AddProp( "ExtSource", $name ); + + # already escaped at this point! + $new->AddProp( "Ref", $url.$2 ); + + $root = $n = $rootsub->( "CXX" ) unless defined $root; + kdocAstUtil::attachChild( $n, $new ); + push @stack, $n; + $n = $new; + } + elsif ( m#<IN\s*NAME\s*=\s*"(.*?)"\s*># ) { + # ancestor + kdocAstUtil::newInherit( $n, $1 ); + } + elsif ( m#</C># ) { + # end class + $n = pop @stack; + } + elsif ( m#<(M\w*)\s+NAME="(.*?)"\s+REF="(.*?)"\s*># ) { + # member + $new = Ast::New( $2 ); + $new->AddProp( "NodeType", $1 eq "ME" ? "method" : "var" ); + $new->AddProp( "ExtSource", $name ); + $new->AddProp( "Flags", "" ); + $new->AddProp( "Ref", $url.$3 ); + + kdocAstUtil::attachChild( $n, $new ); + } + } +} + +1; diff --git a/kalyptus/kdocParseDoc.pm b/kalyptus/kdocParseDoc.pm new file mode 100644 index 0000000..e5f19d5 --- /dev/null +++ b/kalyptus/kdocParseDoc.pm @@ -0,0 +1,419 @@ +package kdocParseDoc; + +use Ast; +use strict; + +use vars qw/ $buffer $docNode %extraprops $currentProp $propType /; + +=head1 kdocParseDoc + + Routines for parsing of javadoc comments. + +=head2 newDocComment + + Parameters: begin (starting line of declaration) + + Reads a doc comment to the end and creates a new doc node. + + Read a line + check if it changes the current context + yes + flush old context + check if it is a non-text tag + (ie internal/deprecated etc) + yes + reset context to text + set associated property + no + set the new context + assign text to new buffer + no add to text buffer + continue + at end + flush anything pending. + +=cut + +sub newDocComment +{ + my( $text ) = @_; + return undef unless $text =~ m#/\*\*+#; + + setType( "DocText", 2 ); + $text =~ m#/\*#; # need to do the match again, otherwise /***/ doesn't parse + ### TODO update this method from kdoc + $buffer = $'; # everything after the first \* + $docNode = undef; + %extraprops = (); # used for textprops when flushing. + my $finished = 0; + my $inbounded = 0; + + if ( $buffer =~ m#\*/# ) { + $buffer = $`; + $finished = 1; + } + +PARSELOOP: + while ( defined $text && !$finished ) { + # read text and remove leading junk + $text = main::readSourceLine(); + next if !defined $text; + $text =~ s#^\s*\*(?!\/)##; + +# if ( $text =~ /^\s*<\/pre>/i ) { +# flushProp(); +# $inbounded = 0; +# } + if( $inbounded ) { + if ( $text =~ m#\*/# ) { + $finished = 1; + $text = $`; + } + $buffer .= $text; + next PARSELOOP; + } +# elsif ( $text =~ /^\s*<pre>/i ) { +# textProp( "Pre" ); +# $inbounded = 1; +# } + elsif ( $text =~ /^\s*$/ ) { + textProp( "ParaBreak", "\n" ); + } + elsif ( $text =~ /^\s*\@internal\s*/ ) { + codeProp( "Internal", 1 ); + } + elsif ( $text =~ /^\s*\@deprecated\s*/ ) { + codeProp( "Deprecated", 1 ); + } + elsif ( $text =~ /^\s*\@reimplemented\s*/ ) { + codeProp( "Reimplemented", 1 ); + } + elsif ( $text =~ /^\s*\@group\s*/ ) { + # logical group tag in which this node belongs + # multiples allowed + + my $groups = $'; + $groups =~ s/^\s*(.*?)\s*$/$1/; + + if ( $groups ne "" ) { + foreach my $g ( split( /[^_\w]+/, $groups) ) { + + codeProp( "InGroup", $g ); + } + } + } + elsif ( $text =~ /^\s*\@defgroup\s+(\w+)\s*/ ) { + # parse group tag and description + my $grptag = $1; + my $grpdesc = $' eq "" ? $grptag : $'; + + # create group node + my $grpnode = Ast::New( $grptag ); + $grpnode->AddProp( "Desc", $grpdesc ); + $grpnode->AddProp( "NodeType", "GroupDef" ); + + # attach + codeProp( "Groups", $grpnode ); + } + elsif ( $text =~ /^\s*\@see\s*/ ) { + docListProp( "See" ); + } + elsif( $text =~ /^\s*\@short\s*/ ) { + docProp( "ClassShort" ); + } + elsif( $text =~ /^\s*\@author\s*/ ) { + docProp( "Author" ); + + } + elsif( $text =~ /^\s*\@version\s*/ ) { + docProp( "Version" ); + } + elsif( $text =~ /^\s*\@id\s*/ ) { + + docProp( "Id" ); + } + elsif( $text =~ /^\s*\@since\s*/ ) { + docProp( "Since" ); + } + elsif( $text =~ /^\s*\@returns?\s*/ ) { + docProp( "Returns" ); + } + elsif( $text =~ /^\s*\@(?:throws|exception|raises)\s*/ ) { + docListProp( "Throws" ); + } + elsif( $text =~ /^\s*\@image\s+([^\s]+)\s*/ ) { + textProp( "Image" ); + $extraprops{ "Path" } = $1; + } + elsif( $text =~ /^\s*\@param\s+(\w+)\s*/ ) { + textProp( "Param" ); + $extraprops{ "Name" } = $1; + } + elsif( $text =~ /^\s*\@sect\s+/ ) { + + textProp( "DocSection" ); + } + elsif( $text =~ /^\s*\@li\s+/ ) { + + textProp( "ListItem" ); + } + elsif ( $text =~ /^\s*\@libdoc\s+/ ) { + # Defines the text for the entire library + docProp( "LibDoc" ); + } + else { + if ( $text =~ m#\*/# ) { + $finished = 1; + $text = $`; + } + $buffer .= $text; + } + } + + flushProp(); + + + return undef if !defined $docNode; + +# postprocess docnode + + # add a . to the end of the short if required. + my $short = $docNode->{ClassShort}; + + if ( defined $short ) { + if ( !($short =~ /\.\s*$/) ) { + $docNode->{ClassShort} =~ s/\s*$/./; + } + } + else { + # use first line of normal text as short name. + if ( defined $docNode->{Text} ) { + my $node; + foreach $node ( @{$docNode->{Text}} ) { + next if $node->{NodeType} ne "DocText"; + $short = $node->{astNodeName}; + $short = $`."." if $short =~ /\./; + $docNode->{ClassShort} = $short; + goto shortdone; + } + } + } +shortdone: + +# Join and break all word list props so that they are one string per list +# node, ie remove all commas and spaces. + + recombineOnWords( $docNode, "See" ); + recombineOnWords( $docNode, "Throws" ); + + return $docNode; +} + +=head3 setType + + Parameters: propname, proptype ( 0 = single, 1 = list, 2 = text ) + + Set the name and type of the pending property. + +=cut + +sub setType +{ + ( $currentProp, $propType ) = @_; +} + +=head3 flushProp + + Flush any pending item and reset the buffer. type is set to DocText. + +=cut + +sub flushProp +{ + return if $buffer eq ""; + initDocNode() unless defined $docNode; + + if( $propType == 1 ) { + # list prop + $docNode->AddPropList( $currentProp, $buffer ); + } + elsif ( $propType == 2 ) { + # text prop + my $textnode = Ast::New( $buffer ); + $textnode->AddProp( 'NodeType', $currentProp ); + $docNode->AddPropList( 'Text', $textnode ); + + foreach my $prop ( keys %extraprops ) { + $textnode->AddProp( $prop, + $extraprops{ $prop } ); + } + + %extraprops = (); + } + else { + # one-off prop + $docNode->AddProp( $currentProp, $buffer ); + } + + # reset buffer + $buffer = ""; + setType( "DocText", 2 ); +} + +=head3 codeProp + + Flush the last node, add a new property and reset type to DocText. + +=cut + +sub codeProp +{ + my( $prop, $val ) = @_; + + flushProp(); + + initDocNode() unless defined $docNode; + $docNode->AddPropList( $prop, $val ); + + setType( "DocText", 2 ); + +} + +=head3 docListProp + + The next item is a list property of docNode. + +=cut + +sub docListProp +{ + my( $prop ) = @_; + + flushProp(); + + $buffer = $'; + setType( $prop, 1 ); +} + +=head3 docProp + + The next item is a simple property of docNode. + +=cut + +sub docProp +{ + my( $prop ) = @_; + + flushProp(); + + $buffer = $'; + setType( $prop, 0 ); +} + +=head3 textProp + + Parameters: prop, val + + Set next item to be a 'Text' list node. if val is assigned, the + new node is assigned that text and flushed immediately. If this + is the case, the next item is given the 'DocText' text property. + +=cut + +sub textProp +{ + my( $prop, $val ) = @_; + + flushProp(); + + if ( defined $val ) { + $buffer = $val; + setType( $prop, 2 ); + flushProp(); + $prop = "DocText"; + } + + setType( $prop, 2 ); + $buffer = $'; +} + + +=head3 initDocNode + + Creates docNode if it is not defined. + +=cut + +sub initDocNode +{ + $docNode = Ast::New( "Doc" ); + $docNode->AddProp( "NodeType", "DocNode" ); +} + +sub recombineOnWords +{ + my ( $docNode, $prop ) = @_; + + if ( exists $docNode->{$prop} ) { + my @oldsee = @{$docNode->{$prop}}; + @{$docNode->{$prop}} = split (/[\s,]+/, join( " ", @oldsee )); + } +} + +############### + +=head2 attachDoc + +Connects a docnode to a code node, setting any other properties +if required, such as groups, internal/deprecated flags etc. + +=cut + +sub attachDoc +{ + my ( $node, $doc, $rootnode ) = @_; + + $node->AddProp( "DocNode", $doc ); + $node->AddProp( "Internal", 1 ) if defined $doc->{Internal}; + $node->AddProp( "Deprecated", 1 ) if defined $doc->{Deprecated}; + + # attach group definitions if they exist + if ( defined $doc->{Groups} ) { + my $groupdef = $rootnode->{Groups}; + if( !defined $groupdef ) { + $groupdef = Ast::New( "Groups" ); + $rootnode->AddProp( "Groups", $groupdef ); + } + + foreach my $grp ( @{$doc->{Groups}} ) { + if ( defined $groupdef->{ $grp->{astNodeName} } ) { + $groupdef->{ $grp->{ astNodeName} + }->AddProp( "Desc", $grp->{Desc} ); + } + else { + $groupdef->AddProp( $grp->{astNodeName}, $grp ); + } + } + } + + # attach node to group index(es) + # create groups if not found, they may be parsed later. + + if ( defined $doc->{InGroup} ) { + my $groupdef = $rootnode->{Groups}; + + foreach my $grp ( @{$doc->{InGroup}} ) { + if ( !exists $groupdef->{$grp} ) { + my $newgrp = Ast::New( $grp ); + $newgrp->AddProp( "Desc", $grp ); + $newgrp->AddProp( "NodeType", "GroupDef" ); + $groupdef->AddProp( $grp, $newgrp ); + } + + $groupdef->{$grp}->AddPropList( "Kids", $node ); + } + } +} + +1; diff --git a/kalyptus/kdocUtil.pm b/kalyptus/kdocUtil.pm new file mode 100644 index 0000000..629147a --- /dev/null +++ b/kalyptus/kdocUtil.pm @@ -0,0 +1,189 @@ + +package kdocUtil; + +use strict; + + +=head1 kdocUtil + + General utilities. + +=head2 countReg + + Parameters: string, regexp + + Returns the number of times of regexp occurs in string. + +=cut + +sub countReg +{ + my( $str, $regexp ) = @_; + my( $count ) = 0; + + while( $str =~ /$regexp/s ) { + $count++; + + $str =~ s/$regexp//s; + } + + return $count; +} + +=head2 findCommonPrefix + + Parameters: string, string + + Returns the prefix common to both strings. An empty string + is returned if the strings have no common prefix. + +=cut + +sub findCommonPrefix +{ + my @s1 = split( "/", $_[0] ); + my @s2 = split( "/", $_[1] ); + my $accum = ""; + my $len = ($#s2 > $#s1 ) ? $#s1 : $#s2; + + for my $i ( 0..$len ) { +# print "Compare: $i '$s1[$i]', '$s2[$i]'\n"; + last if $s1[ $i ] ne $s2[ $i ]; + $accum .= $s1[ $i ]."/"; + } + + return $accum; +} + +=head2 makeRelativePath + + Parameters: localpath, destpath + + Returns a relative path to the destination from the local path, + after removal of any common prefix. + +=cut + +sub makeRelativePath +{ + my ( $from, $to ) = @_; + + # remove prefix + $from .= '/' unless $from =~ m#/$#; + $to .= '/' unless $to =~ m#/$#; + + my $pfx = findCommonPrefix( $from, $to ); + + if ( $pfx ne "" ) { + $from =~ s/^$pfx//g; + $to =~ s/^$pfx//g; + } +# print "Prefix is '$pfx'\n"; + + $from =~ s#/+#/#g; + $to =~ s#/+#/#g; + $pfx = countReg( $from, '\/' ); + + my $rel = "../" x $pfx; + $rel .= $to; + + return $rel; +} + +sub hostName +{ + my $host = ""; + my @hostenvs = qw( HOST HOSTNAME COMPUTERNAME ); + + # Host name + foreach my $evar ( @hostenvs ) { + next unless defined $ENV{ $evar }; + + $host = $ENV{ $evar }; + last; + } + + if( $host eq "" ) { + $host = `uname -n`; + chop $host; + } + + return $host; +} + +sub userName +{ + my $who = ""; + my @userenvs = qw( USERNAME USER LOGNAME ); + + # User name + foreach my $evar ( @userenvs ) { + next unless defined $ENV{ $evar }; + + $who = $ENV{ $evar }; + last; + } + + if( $who eq "" ) { + if ( $who = `whoami` ) { + chop $who; + } + elsif ( $who - `who am i` ) { + $who = ( split (/ /, $who ) )[0]; + } + } + + return $who; +} + +=head2 splitUnnested + Helper to split a list using a delimiter, but looking for + nesting with (), {}, [] and <>. + Example: splitting int a, QPair<c,b> d, e="," + on ',' will give 3 items in the list. + + Parameter: delimiter, string + Returns: array, after splitting the string + + Thanks to Ashley Winters +=cut +sub splitUnnested($$) { + my $delim = shift; + my $string = shift; + my(%open) = ( + '[' => ']', + '(' => ')', + '<' => '>', + '{' => '}', + ); + my(%close) = reverse %open; + my @ret; + my $depth = 0; + my $start = 0; + my $indoublequotes = 0; + while($string =~ /($delim|<<|>>|[][}{)(><\"])/g) { + my $c = $1; + if(!$depth and !$indoublequotes and $c eq $delim) { + my $len = pos($string) - $start - 1; + push @ret, substr($string, $start, $len); + $start = pos($string); + } elsif($open{$c}) { + $depth++; + } elsif($close{$c}) { + $depth--; + } elsif($c eq '"') { + if ($indoublequotes) { + $indoublequotes = 0; + } else { + $indoublequotes = 1; + } + } + } + + my $subs = substr($string, $start); + push @ret, $subs if ($subs); + return @ret; +} + +1; + |