summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/src/tqmoc/tqmoc.y
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/src/tqmoc/tqmoc.y')
-rw-r--r--tqtinterface/qt4/src/tqmoc/tqmoc.y3636
1 files changed, 0 insertions, 3636 deletions
diff --git a/tqtinterface/qt4/src/tqmoc/tqmoc.y b/tqtinterface/qt4/src/tqmoc/tqmoc.y
deleted file mode 100644
index 927ec47..0000000
--- a/tqtinterface/qt4/src/tqmoc/tqmoc.y
+++ /dev/null
@@ -1,3636 +0,0 @@
-/****************************************************************************
-**
-** Parser and code generator for meta object compiler
-**
-** Created : 930417
-**
-** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA.
-**
-** This file is part of the TQt GUI Toolkit.
-**
-** This file may be used under the terms of the GNU General
-** Public License versions 2.0 or 3.0 as published by the Free
-** Software Foundation and appearing in the files LICENSE.GPL2
-** and LICENSE.GPL3 included in the packaging of this file.
-** Alternatively you may (at your option) use any later version
-** of the GNU General Public License if such license has been
-** publicly approved by Trolltech ASA (or its successors, if any)
-** and the KDE Free TQt Foundation.
-**
-** Please review the following information to ensure GNU General
-** Public Licensing requirements will be met:
-** http://trolltech.com/products/qt/licenses/licensing/opensource/.
-** If you are unsure which license is appropriate for your use, please
-** review the following information:
-** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
-** or contact the sales department at sales@trolltech.com.
-**
-** This file may be used under the terms of the TQ Public License as
-** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
-** included in the packaging of this file. Licensees holding valid TQt
-** Commercial licenses may use this file in accordance with the TQt
-** Commercial License Agreement provided with the Software.
-**
-** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
-** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
-** herein.
-**
-** --------------------------------------------------------------------------
-**
-** This compiler reads a C++ header file with class definitions and ouputs
-** C++ code to build a meta class. The meta data includes public methods
-** (not constructors, destructors or operator functions), tqsignals and slot
-** definitions. The output file should be compiled and linked into the
-** target application.
-**
-** C++ header files are assumed to have correct syntax, and we are therefore
-** doing less strict checking than C++ compilers.
-**
-** The C++ grammar has been adopted from the "The Annotated C++ Reference
-** Manual" (ARM), by Ellis and Stroustrup (Addison Wesley, 1992).
-**
-** Notice that this code is not possible to compile with GNU bison, instead
-** use standard AT&T yacc or Berkeley yacc.
-*****************************************************************************/
-
-%{
-#define TQMOC_YACC_CODE
-void yyerror( const char *msg );
-
-#include "tqplatformdefs.h"
-#include "tqasciidict.h"
-#include "tqdatetime.h"
-#include "tqdict.h"
-#include "tqfile.h"
-#include "tqdir.h"
-#include "tqptrlist.h"
-#include "tqregexp.h"
-#include "tqstrlist.h"
-#ifdef TQMOC_MWERKS_PLUGIN
-# ifdef TQ_OS_MACX
-# undef OLD_DEBUG
-# ifdef DEBUG
-# define OLD_DEBUG DEBUG
-# undef DEBUG
-# endif
-# define DEBUG 0
-# ifndef __IMAGECAPTURE__
-# define __IMAGECAPTURE__
-# endif
-# include <Carbon/Carbon.h>
-# endif
-# include "mwerks_mac.h"
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#if defined CONST
-#undef CONST
-#endif
-#if defined VOID
-#undef VOID
-#endif
-
-bool isEnumType( const char* type );
-int enumIndex( const char* type );
-bool isVariantType( const char* type );
-int qvariant_nameToType( const char* name );
-static void init(); // initialize
-static void initClass(); // prepare for new class
-static void generateClass(); // generate C++ code for class
-static void initExpression(); // prepare for new expression
-static void enterNameSpace( const char *name = 0 );
-static void leaveNameSpace();
-static void selectOutsideClassState();
-static void registerClassInNamespace();
-static bool suppress_func_warn = FALSE;
-static void func_warn( const char *msg );
-static void tqmoc_warn( const char *msg );
-static void tqmoc_err( const char *s );
-static void tqmoc_err( const char *s1, const char *s2 );
-static void operatorError();
-static void checkPropertyName( const char* ident );
-
-static const char* const utype_map[] =
-{
- "bool",
- "int",
- "double",
- "TQString",
- "TQVariant",
- 0
-};
-
-inline bool isIdentChar( char x )
-{ // Avoid bug in isalnum
- return x == '_' || (x >= '0' && x <= '9') ||
- (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z');
-}
-
-bool validUType( TQCString ctype )
-{
- if ( ctype.left(6) == "const " )
- ctype = ctype.mid( 6, ctype.length() - 6 );
- if ( ctype.right(1) == "&" )
- ctype = ctype.left( ctype.length() - 1 );
- else if ( ctype.right(1) == "*" )
- return TRUE;
-
- int i = -1;
- while ( utype_map[++i] )
- if ( ctype == utype_map[i] )
- return TRUE;
-
- return isEnumType( ctype );
-}
-
-TQCString castToUType( TQCString ctype )
-{
- if ( ctype.right(1) == "&" )
- ctype = ctype.left( ctype.length() - 1 );
- if( ctype.right(1) == "]") {
- int lb = ctype.findRev('[');
- if(lb != -1)
- ctype = ctype.left(lb) + "*";
- }
- return ctype;
-}
-
-TQCString rawUType( TQCString ctype )
-{
- ctype = castToUType( ctype );
- if ( ctype.left(6) == "const " )
- ctype = ctype.mid( 6, ctype.length() - 6 );
- return ctype;
-}
-
-TQCString uType( TQCString ctype )
-{
- if ( !validUType( ctype ) ) {
- if ( isVariantType( rawUType(ctype) ) )
- return "varptr";
- else
- return "ptr";
- }
- if ( ctype.left(6) == "const " )
- ctype = ctype.mid( 6, ctype.length() - 6 );
- if ( ctype.right(1) == "&" ) {
- ctype = ctype.left( ctype.length() - 1 );
- } else if ( ctype.right(1) == "*" ) {
- TQCString raw = ctype.left( ctype.length() - 1 );
- ctype = "ptr";
- if ( raw == "char" )
- ctype = "charstar";
- else if ( raw == "TQUnknownInterface" )
- ctype = "iface";
- else if ( raw == "TQDispatchInterface" )
- ctype = "idisp";
- else if ( isVariantType( raw ) )
- ctype = "varptr";
- }
- if ( isEnumType( ctype ) )
- ctype = "enum";
- return ctype;
-}
-
-bool isInOut( TQCString ctype )
-{
- if ( ctype.left(6) == "const " )
- return FALSE;
- if ( ctype.right(1) == "&" )
- return TRUE;
- if ( ctype.right(2) == "**" )
- return TRUE;
- return FALSE;
-}
-
-TQCString uTypeExtra( TQCString ctype )
-{
- TQCString typeExtra = "0";
- if ( !validUType( ctype ) ) {
- if ( isVariantType( rawUType(ctype) ) )
- typeExtra.sprintf("\"\\x%02x\"", qvariant_nameToType( rawUType(ctype) ) );
- else
- typeExtra.sprintf( "\"%s\"", rawUType(ctype).data() );
- return typeExtra;
- }
- if ( ctype.left(6) == "const " )
- ctype = ctype.mid( 6, ctype.length() - 6 );
- if ( ctype.right(1) == "&" )
- ctype = ctype.left( ctype.length() - 1 );
- if ( ctype.right(1) == "*" ) {
- TQCString raw = ctype.left( ctype.length() - 1 );
- ctype = "ptr";
- if ( raw == "char" )
- ;
- else if ( isVariantType( raw ) )
- typeExtra.sprintf("\"\\x%02x\"", qvariant_nameToType( raw ) );
- else
- typeExtra.sprintf( "\"%s\"", raw.stripWhiteSpace().data() );
-
- } else if ( isEnumType( ctype ) ) {
- int idx = enumIndex( ctype );
- if ( idx >= 0 ) {
- typeExtra.sprintf( "&enum_tbl[%d]", enumIndex( ctype ) );
- } else {
- typeExtra.sprintf( "parentObject->enumerator(\"%s\", TRUE )", ctype.data() );
- }
- typeExtra =
- "\n#ifndef TQT_NO_PROPERTIES\n\t " + typeExtra +
- "\n#else"
- "\n\t 0"
- "\n#endif // TQT_NO_PROPERTIES\n\t ";
- }
- return typeExtra;
-}
-
-/*
- Attention!
- This table is copied from qvariant.cpp. If you change
- one, change both.
-*/
-static const int ntypes = 35;
-static const char* const type_map[ntypes] =
-{
- 0,
- "TQMap<TQString,TQVariant>",
- "TQValueList<TQVariant>",
- "TQString",
- "TQStringList",
- "TQFont",
- "TQPixmap",
- "TQBrush",
- "TQRect",
- "TQSize",
- "TQColor",
- "TQPalette",
- "TQColorGroup",
- "TQIconSet",
- "TQPoint",
- "TQImage",
- "int",
- "uint",
- "bool",
- "double",
- "TQCString",
- "TQPointArray",
- "TQRegion",
- "TQBitmap",
- "TQCursor",
- "TQSizePolicy",
- "TQDate",
- "TQTime",
- "TQDateTime",
- "TQByteArray",
- "TQBitArray",
- "TQKeySequence",
- "TQPen",
- "TQ_LLONG",
- "TQ_ULLONG"
-};
-
-int qvariant_nameToType( const char* name )
-{
- for ( int i = 0; i < ntypes; i++ ) {
- if ( !qstrcmp( type_map[i], name ) )
- return i;
- }
- return 0;
-}
-
-/*
- Returns TRUE if the type is a TQVariant types.
-*/
-bool isVariantType( const char* type )
-{
- return qvariant_nameToType( type ) != 0;
-}
-
-/*
- Replaces '>>' with '> >' (as in 'TQValueList<TQValueList<double> >').
- This function must be called to produce valid C++ code. However,
- the string representation still uses '>>'.
-*/
-void fixRightAngles( TQCString *str )
-{
- str->replace( TQRegExp(">>"), "> >" );
-}
-
-static TQCString rmWS( const char * );
-
-enum Access { Private, Protected, Public };
-
-
-class Argument // single arg meta data
-{
-public:
- Argument( const char *left, const char *right, const char* argName = 0, bool isDefaultArgument = FALSE )
- {
- leftType = rmWS( left );
- rightType = rmWS( right );
- if ( leftType == "void" && rightType.isEmpty() )
- leftType = "";
-
- int len = leftType.length();
-
- /*
- Convert 'char const *' into 'const char *'. Start at index 1,
- not 0, because 'const char *' is already OK.
- */
- for ( int i = 1; i < len; i++ ) {
- if ( leftType[i] == 'c' &&
- strncmp(leftType.data() + i + 1, "onst", 4) == 0
- && (i + 5 >= len || !isIdentChar(leftType[i + 5]))
- && !isIdentChar(i-1)
- ) {
- leftType.remove( i, 5 );
- if ( leftType[i - 1] == ' ' )
- leftType.remove( i - 1, 1 );
- leftType.prepend( "const " );
- break;
- }
-
- /*
- We musn't convert 'char * const *' into 'const char **'
- and we must beware of 'Bar<const Bla>'.
- */
- if ( leftType[i] == '&' || leftType[i] == '*' ||
- leftType[i] == '<' )
- break;
- }
-
- name = argName;
- isDefault = isDefaultArgument;
- }
-
- TQCString leftType;
- TQCString rightType;
- TQCString name;
- bool isDefault;
-};
-
-class ArgList : public TQPtrList<Argument> { // member function arg list
-public:
- ArgList() { setAutoDelete( TRUE ); }
- ~ArgList() { clear(); }
-
- /* the clone has one default argument less, the orignal has all default arguments removed */
- ArgList* magicClone() {
- ArgList* l = new ArgList;
- bool firstDefault = FALSE;
- for ( first(); current(); next() ) {
- bool isDefault = current()->isDefault;
- if ( !firstDefault && isDefault ) {
- isDefault = FALSE;
- firstDefault = TRUE;
- }
- l->append( new Argument( current()->leftType, current()->rightType, current()->name, isDefault ) );
- }
- for ( first(); current(); ) {
- if ( current()->isDefault )
- remove();
- else
- next();
- }
- return l;
- }
-
- bool hasDefaultArguments() {
- for ( Argument* a = first(); a; a = next() ) {
- if ( a->isDefault )
- return TRUE;
- }
- return FALSE;
- }
-
-};
-
-
-struct Function // member function meta data
-{
- Access access;
- TQCString qualifier; // const or volatile
- TQCString name;
- TQCString type;
- TQCString signature;
- int lineNo;
- ArgList *args;
- Function() { args=0;}
- ~Function() { delete args; }
- const char* accessAsString() {
- switch ( access ) {
- case Private: return "Private";
- case Protected: return "Protected";
- default: return "Public";
- }
- }
-};
-
-class FuncList : public TQPtrList<Function> { // list of member functions
-public:
- FuncList( bool autoDelete = FALSE ) { setAutoDelete( autoDelete ); }
-
- FuncList find( const char* name )
- {
- FuncList result;
- for ( TQPtrListIterator<Function> it(*this); it.current(); ++it ) {
- if ( it.current()->name == name )
- result.append( it.current() );
- }
- return result;
- }
-};
-
-class Enum : public TQStrList
-{
-public:
- TQCString name;
- bool set;
-};
-
-class EnumList : public TQPtrList<Enum> { // list of property enums
-public:
- EnumList() { setAutoDelete(TRUE); }
-};
-
-
-struct Property
-{
- Property( int l, const char* t, const char* n, const char* s, const char* g, const char* r,
- const TQCString& st, const TQCString& d, const TQCString& sc, bool ov )
- : lineNo(l), type(t), name(n), set(s), get(g), reset(r), setfunc(0), getfunc(0),
- sspec(Unspecified), gspec(Unspecified), stored( st ),
- designable( d ), scriptable( sc ), override( ov ), oredEnum( -1 )
- {
- /*
- The Q_PROPERTY construct cannot contain any commas, since
- commas separate macro arguments. We therefore expect users
- to type "TQMap" instead of "TQMap<TQString, TQVariant>". For
- coherence, we also expect the same for
- TQValueList<TQVariant>, the other template class supported by
- TQVariant.
- */
- if ( type == "TQMap" ) {
- type = "TQMap<TQString,TQVariant>";
- } else if ( type == "TQValueList" ) {
- type = "TQValueList<TQVariant>";
- } else if ( type == "LongLong" ) {
- type = "TQ_LLONG";
- } else if ( type == "ULongLong" ) {
- type = "TQ_ULLONG";
- }
- }
-
- int lineNo;
- TQCString type;
- TQCString name;
- TQCString set;
- TQCString get;
- TQCString reset;
- TQCString stored;
- TQCString designable;
- TQCString scriptable;
- bool override;
-
- Function* setfunc;
- Function* getfunc;
-
- int oredEnum; // If the enums item may be ored. That means the data type is int.
- // Allowed values are 1 (True), 0 (False), and -1 (Unset)
- TQCString enumsettype; // contains the set function type in case of oredEnum
- TQCString enumgettype; // contains the get function type in case of oredEnum
-
- enum Specification { Unspecified, Class, Reference, Pointer, ConstCharStar };
- Specification sspec;
- Specification gspec;
-
- bool stdSet() {
- TQCString s = "set";
- s += toupper( name[0] );
- s += name.mid( 1 );
- return s == set;
- }
-
- static const char* specToString( Specification s )
- {
- switch ( s ) {
- case Class:
- return "Class";
- case Reference:
- return "Reference";
- case Pointer:
- return "Pointer";
- case ConstCharStar:
- return "ConstCharStar";
- default:
- return "Unspecified";
- }
- }
-};
-
-class PropList : public TQPtrList<Property> { // list of properties
-public:
- PropList() { setAutoDelete( TRUE ); }
-};
-
-
-struct ClassInfo
-{
- ClassInfo( const char* n, const char* v )
- : name(n), value(v)
- {}
- TQCString name;
- TQCString value;
-};
-
-class ClassInfoList : public TQPtrList<ClassInfo> { // list of class infos
-public:
- ClassInfoList() { setAutoDelete( TRUE ); }
-};
-
-class parser_reg {
- public:
- parser_reg();
- ~parser_reg();
-
- // some temporary values
- TQCString tmpExpression; // Used to store the characters the lexer
- // is currently skipping (see addExpressionChar and friends)
- TQCString fileName; // file name
- TQCString outputFile; // output file name
- TQCString pchFile; // name of PCH file (used on Windows)
- TQStrList includeFiles; // name of #include files
- TQCString includePath; // #include file path
- TQCString qtPath; // #include qt file path
- int gen_count; //number of classes generated
- bool noInclude; // no #include <filename>
- bool generatedCode; // no code generated
- bool tqmocError; // tqmoc parsing error occurred
- bool hasVariantIncluded; //whether or not qvariant.h was included yet
- TQCString className; // name of parsed class
- TQCString superClassName; // name of first super class
- TQStrList multipleSuperClasses; // other superclasses
- FuncList tqsignals; // signal interface
- FuncList tqslots; // tqslots interface
- FuncList propfuncs; // all possible property access functions
- FuncList funcs; // all parsed functions, including tqsignals
- EnumList enums; // enums used in properties
- PropList props; // list of all properties
- ClassInfoList infos; // list of all class infos
-
-// Used to store the values in the Q_PROPERTY macro
- TQCString propWrite; // set function
- TQCString propRead; // get function
- TQCString propReset; // reset function
- TQCString propStored; //
- TQCString propDesignable; // "true", "false" or function or empty if not specified
- TQCString propScriptable; // "true", "false" or function or empty if not specified
- bool propOverride; // Wether OVERRIDE was detected
-
- TQStrList qtEnums; // Used to store the contents of TQ_ENUMS
- TQStrList qtSets; // Used to store the contents of TQ_SETS
-
-};
-
-static parser_reg *g = 0;
-
-ArgList *addArg( Argument * ); // add arg to tmpArgList
-
-enum Member { SignalMember,
- SlotMember,
- PropertyCandidateMember
- };
-
-void addMember( Member ); // add tmpFunc to current class
-void addEnum(); // add tmpEnum to current class
-
-char *stradd( const char *, const char * ); // add two strings
-char *stradd( const char *, const char *, // add three strings
- const char * );
-char *stradd( const char *, const char *, // adds 4 strings
- const char *, const char * );
-
-char *straddSpc( const char *, const char * );
-char *straddSpc( const char *, const char *,
- const char * );
-char *straddSpc( const char *, const char *,
- const char *, const char * );
-
-extern int yydebug;
-bool lexDebug = FALSE;
-int lineNo; // current line number
-bool errorControl = FALSE; // controled errors
-bool displayWarnings = TRUE;
-bool skipClass; // don't generate for class
-bool skipFunc; // don't generate for func
-bool templateClass; // class is a template
-bool templateClassOld; // previous class is a template
-
-ArgList *tmpArgList; // current argument list
-Function *tmpFunc; // current member function
-Enum *tmpEnum; // current enum
-Access tmpAccess; // current access permission
-Access subClassPerm; // current access permission
-
-bool TQ_OBJECTdetected; // TRUE if current class
- // contains the TQ_OBJECT macro
-bool Q_PROPERTYdetected; // TRUE if current class
- // contains at least one Q_PROPERTY,
- // TQ_OVERRIDE, TQ_SETS or TQ_ENUMS macro
-bool tmpPropOverride; // current property override setting
-
-int tmpYYStart; // Used to store the lexers current mode
-int tmpYYStart2; // Used to store the lexers current mode
- // (if tmpYYStart is already used)
-
-// if the format revision changes, you MUST change it in qmetaobject.h too
-const int formatRevision = 26; // tqmoc output format revision
-
-// if the flags change, you HAVE to change it in qmetaobject.h too
-enum Flags {
- Invalid = 0x00000000,
- Readable = 0x00000001,
- Writable = 0x00000002,
- EnumOrSet = 0x00000004,
- UnresolvedEnum = 0x00000008,
- StdSet = 0x00000100,
- Override = 0x00000200,
- NotDesignable = 0x00001000,
- DesignableOverride = 0x00002000,
- NotScriptable = 0x00004000,
- ScriptableOverride = 0x00008000,
- NotStored = 0x00010000,
- StoredOverride = 0x00020000
-};
-
-
-#ifdef YYBISON
-# if defined(TQ_OS_WIN32)
-# include <io.h>
-# undef isatty
-extern "C" int hack_isatty( int )
- {
- return 0;
- }
-# define isatty hack_isatty
-# else
-# include <unistd.h>
-# endif
-
-# define YYDEBUG 1
-# include "tqmoc_yacc.h"
-# include "tqmoc_lex.cpp"
-#endif //YYBISON
-%}
-
-
-
-
-%union {
- char char_val;
- int int_val;
- double double_val;
- char *string;
- Access access;
- Function *function;
- ArgList *arg_list;
- Argument *arg;
-}
-
-%start declaration_seq
-
-%token <char_val> CHAR_VAL /* value types */
-%token <int_val> INT_VAL
-%token <double_val> DOUBLE_VAL
-%token <string> STRING
-%token <string> IDENTIFIER /* identifier string */
-
-%token FRIEND /* declaration keywords */
-%token TYPEDEF
-%token AUTO
-%token REGISTER
-%token STATIC
-%token EXTERN
-%token INLINE
-%token VIRTUAL
-%token CONST
-%token VOLATILE
-%token CHAR
-%token SHORT
-%token INT
-%token LONG
-%token SIGNED
-%token UNSIGNED
-%token FLOAT
-%token DOUBLE
-%token VOID
-%token ENUM
-%token CLASS
-%token STRUCT
-%token UNION
-%token ASM
-%token PRIVATE
-%token PROTECTED
-%token PUBLIC
-%token OPERATOR
-%token DBL_COLON
-%token TRIPLE_DOT
-%token TEMPLATE
-%token NAMESPACE
-%token USING
-%token MUTABLE
-%token THROW
-
-%token SIGNALS
-%token SLOTS
-%token TQ_OBJECT
-%token Q_PROPERTY
-%token TQ_OVERRIDE
-%token TQ_CLASSINFO
-%token TQ_ENUMS
-%token TQ_SETS
-
-%token READ
-%token WRITE
-%token STORED
-%token DESIGNABLE
-%token SCRIPTABLE
-%token RESET
-
-%type <string> class_name
-%type <string> template_class_name
-%type <string> template_spec
-%type <string> opt_base_spec
-
-%type <string> base_spec
-%type <string> base_list
-%type <string> qt_macro_name
-%type <string> base_specifier
-%type <access> access_specifier
-%type <string> fct_name
-%type <string> type_name
-%type <string> simple_type_names
-%type <string> simple_type_name
-%type <string> class_key
-%type <string> complete_class_name
-%type <string> qualified_class_name
-%type <string> elaborated_type_specifier
-%type <string> whatever
-
-%type <arg_list> argument_declaration_list
-%type <arg_list> arg_declaration_list
-%type <arg_list> arg_declaration_list_opt
-%type <string> abstract_decl_opt
-%type <string> abstract_decl
-%type <arg> argument_declaration
-%type <arg> opt_exception_argument
-%type <string> cv_qualifier_list_opt
-%type <string> cv_qualifier_list
-%type <string> cv_qualifier
-%type <string> decl_specifiers
-%type <string> decl_specifier
-%type <string> decl_specs_opt
-%type <string> decl_specs
-%type <string> type_specifier
-%type <string> fct_specifier
-%type <string> declarator
-%type <string> ptr_operator
-%type <string> ptr_operators
-%type <string> ptr_operators_opt
-
-%type <string> dname
-
-%%
-declaration_seq: /* empty */
- | declaration_seq declaration
- ;
-
-declaration: class_def
-/* | template_declaration */
- | namespace_def
- | namespace_alias_def
- | using_declaration
- | using_directive
- ;
-
-namespace_def: named_namespace_def
- | unnamed_namespace_def
- ;
-
-named_namespace_def: NAMESPACE
- IDENTIFIER { enterNameSpace($2); }
- '{' { BEGIN IN_NAMESPACE; }
- namespace_body
- '}' { leaveNameSpace();
- selectOutsideClassState();
- }
- ;
-
-unnamed_namespace_def: NAMESPACE { enterNameSpace(); }
- '{' { BEGIN IN_NAMESPACE; }
- namespace_body
- '}' { leaveNameSpace();
- selectOutsideClassState();
- }
- ;
-
-namespace_body: declaration_seq
- ;
-
-namespace_alias_def: NAMESPACE IDENTIFIER '=' complete_class_name ';'
- { selectOutsideClassState(); }
- ;
-
-
-using_directive: USING NAMESPACE { selectOutsideClassState(); } /* Skip namespace */
- ;
-
-using_declaration: USING IDENTIFIER { selectOutsideClassState(); }
- | USING DBL_COLON { selectOutsideClassState(); }
- ;
-
-class_def: { initClass(); }
- class_specifier ';' { generateClass();
- registerClassInNamespace();
- selectOutsideClassState(); }
- ;
-
-
-/***** r.17.1 (ARM p.387 ): Keywords *****/
-
-class_name: IDENTIFIER { $$ = $1; }
- | template_class_name { $$ = $1; }
- ;
-
-template_class_name: IDENTIFIER '<' template_args '>'
- { g->tmpExpression = rmWS( g->tmpExpression );
- $$ = stradd( $1, "<",
- g->tmpExpression, ">" ); }
- ;
-
-/*
- template_args skips all characters until it encounters a ">" (it
- handles and discards sublevels of parentheses). Since the rule is
- empty it must be used with care!
-*/
-
-template_args: /* empty */ { initExpression();
- templLevel = 1;
- BEGIN IN_TEMPL_ARGS; }
- ;
-
-/***** r.17.2 (ARM p.388): Expressions *****/
-
-
-/* const_expression skips all characters until it encounters either one
- of "]", ")" or "," (it handles and discards sublevels of parentheses).
- Since the rule is empty it must be used with care!
-*/
-
-const_expression: /* empty */ { initExpression();
- BEGIN IN_EXPR; }
- ;
-
-/* def_argument is just like const expression but handles the ","
- slightly differently. It was added for 3.0 as quick solution. TODO:
- merge with const_expression.
- */
-
-def_argument: /* empty */ { BEGIN IN_DEF_ARG; }
- ;
-
-enumerator_expression: /* empty */ { initExpression();
- BEGIN IN_ENUM; }
- ;
-
-/***** r.17.3 (ARM p.391): Declarations *****/
-
-decl_specifier: storage_class_specifier { $$ = ""; }
- | type_specifier { $$ = $1; }
- | fct_specifier { $$ = ""; }
- | FRIEND { skipFunc = TRUE; $$ = ""; }
- | TYPEDEF { skipFunc = TRUE; $$ = ""; }
- ;
-
-decl_specifiers: decl_specs_opt type_name decl_specs_opt
- { $$ = straddSpc($1,$2,$3); }
- ;
-decl_specs_opt: /* empty */ { $$ = ""; }
- | decl_specs { $$ = $1; }
- ;
-
-decl_specs: decl_specifier { $$ = $1; }
- | decl_specs decl_specifier { $$ = straddSpc($1,$2); }
- ;
-
-storage_class_specifier: AUTO
- | REGISTER
- | STATIC { skipFunc = TRUE; }
- | EXTERN
- ;
-
-fct_specifier: INLINE { }
- | VIRTUAL { }
- ;
-
-type_specifier: CONST { $$ = "const"; }
- | VOLATILE { $$ = "volatile"; }
- ;
-
-type_name: elaborated_type_specifier { $$ = $1; }
- | complete_class_name { $$ = $1; }
- | simple_type_names { $$ = $1; }
- ;
-
-simple_type_names: simple_type_names simple_type_name
- { $$ = straddSpc($1,$2); }
- | simple_type_name { $$ = $1; }
- ;
-
-simple_type_name: CHAR { $$ = "char"; }
- | SHORT { $$ = "short"; }
- | INT { $$ = "int"; }
- | LONG { $$ = "long"; }
- | SIGNED { $$ = "signed"; }
- | UNSIGNED { $$ = "unsigned"; }
- | FLOAT { $$ = "float"; }
- | DOUBLE { $$ = "double"; }
- | VOID { $$ = "void"; }
- ;
-
-template_spec: TEMPLATE '<' template_args '>'
- { g->tmpExpression = rmWS( g->tmpExpression );
- $$ = stradd( "template<",
- g->tmpExpression, ">" ); }
- ;
-
-opt_template_spec: /* empty */
- | template_spec { templateClassOld = templateClass;
- templateClass = TRUE;
- }
- ;
-
-
-class_key: opt_template_spec CLASS { $$ = "class"; }
- | opt_template_spec STRUCT { $$ = "struct"; }
- ;
-
-complete_class_name: qualified_class_name { $$ = $1; }
- | DBL_COLON qualified_class_name
- { $$ = stradd( "::", $2 ); }
- ;
-
-qualified_class_name: qualified_class_name DBL_COLON class_name
- { $$ = stradd( $1, "::", $3 );}
- | class_name { $$ = $1; }
- ;
-
-elaborated_type_specifier:
- class_key IDENTIFIER { $$ = straddSpc($1,$2); }
- | ENUM IDENTIFIER { $$ = stradd("enum ",$2); }
- | UNION IDENTIFIER { $$ = stradd("union ",$2); }
- ;
-
-/***** r.17.4 (ARM p.393): Declarators *****/
-
-argument_declaration_list: arg_declaration_list_opt triple_dot_opt { $$ = $1;}
- | arg_declaration_list ',' TRIPLE_DOT { $$ = $1;
- func_warn("Ellipsis not supported"
- " in tqsignals and tqslots.\n"
- "Ellipsis argument ignored."); }
- ;
-
-arg_declaration_list_opt: /* empty */ { $$ = tmpArgList; }
- | arg_declaration_list { $$ = $1; }
- ;
-
-opt_exception_argument: /* empty */ { $$ = 0; }
- | argument_declaration
- ;
-
-triple_dot_opt: /* empty */
- | TRIPLE_DOT { func_warn("Ellipsis not supported"
- " in tqsignals and tqslots.\n"
- "Ellipsis argument ignored."); }
-
- ;
-
-arg_declaration_list: arg_declaration_list
- ','
- argument_declaration { $$ = addArg($3); }
- | argument_declaration { $$ = addArg($1); }
- ;
-
-argument_declaration: decl_specifiers abstract_decl_opt
- { $$ = new Argument(straddSpc($1,$2),""); }
- | decl_specifiers abstract_decl_opt
- '=' { expLevel = 1; }
- def_argument
- { $$ = new Argument(straddSpc($1,$2),"", 0, TRUE ); }
- | decl_specifiers abstract_decl_opt dname
- abstract_decl_opt
- { $$ = new Argument(straddSpc($1,$2),$4, $3); }
- | decl_specifiers abstract_decl_opt dname
- abstract_decl_opt
- '=' { expLevel = 1; }
- def_argument
- { $$ = new Argument(straddSpc($1,$2),$4, $3, TRUE); }
- ;
-
-
-abstract_decl_opt: /* empty */ { $$ = ""; }
- | abstract_decl { $$ = $1; }
- ;
-
-abstract_decl: abstract_decl ptr_operator
- { $$ = straddSpc($1,$2); }
- | '[' { expLevel = 1; }
- const_expression ']'
- { $$ = stradd( "[",
- g->tmpExpression =
- g->tmpExpression.stripWhiteSpace(), "]" ); }
- | abstract_decl '[' { expLevel = 1; }
- const_expression ']'
- { $$ = stradd( $1,"[",
- g->tmpExpression =
- g->tmpExpression.stripWhiteSpace(),"]" ); }
- | ptr_operator { $$ = $1; }
- | '(' abstract_decl ')' { $$ = $2; }
- ;
-
-declarator: dname { $$ = ""; }
- | declarator ptr_operator
- { $$ = straddSpc($1,$2);}
- | declarator '[' { expLevel = 1; }
- const_expression ']'
- { $$ = stradd( $1,"[",
- g->tmpExpression =
- g->tmpExpression.stripWhiteSpace(),"]" ); }
- | '(' declarator ')' { $$ = $2; }
- ;
-
-dname: IDENTIFIER
- ;
-
-fct_decl: '('
- argument_declaration_list
- ')'
- cv_qualifier_list_opt
- ctor_initializer_opt
- exception_spec_opt
- opt_identifier
- fct_body_or_semicolon
- { tmpFunc->args = $2;
- tmpFunc->qualifier = $4; }
- ;
-
-fct_name: IDENTIFIER /* NOTE: simplified! */
- | IDENTIFIER array_decls
- { func_warn("Variable as signal or slot."); }
- | IDENTIFIER '=' { expLevel=0; }
- const_expression /* probably const member */
- { skipFunc = TRUE; }
- | IDENTIFIER array_decls '=' { expLevel=0; }
- const_expression /* probably const member */
- { skipFunc = TRUE; }
- ;
-
-
-array_decls: '[' { expLevel = 1; }
- const_expression ']'
- | array_decls '[' { expLevel = 1; }
- const_expression ']'
-
- ;
-
-ptr_operators_opt: /* empty */ { $$ = ""; }
- | ptr_operators { $$ = $1; }
- ;
-
-ptr_operators: ptr_operator { $$ = $1; }
- | ptr_operators ptr_operator { $$ = straddSpc($1,$2);}
- ;
-
-ptr_operator: '*' cv_qualifier_list_opt { $$ = straddSpc("*",$2);}
- | '&' cv_qualifier_list_opt { $$ = stradd("&",$2);}
-/*! | complete_class_name
- DBL_COLON
- '*'
- cv_qualifier_list_opt { $$ = stradd($1,"::*",$4); }*/
- ;
-
-cv_qualifier_list_opt: /* empty */ { $$ = ""; }
- | cv_qualifier_list { $$ = $1; }
- ;
-
-cv_qualifier_list: cv_qualifier { $$ = $1; }
- | cv_qualifier_list cv_qualifier
- { $$ = straddSpc($1,$2); }
- ;
-
-cv_qualifier: CONST { $$ = "const"; }
- | VOLATILE { $$ = "volatile"; }
- ;
-
-fct_body_or_semicolon: ';'
- | fct_body
- | '=' INT_VAL ';' /* abstract func, INT_VAL = 0 */
- ;
-
-fct_body: '{' { BEGIN IN_FCT; fctLevel = 1;}
- '}' { BEGIN TQT_DEF; }
- ;
-
-
-/***** r.17.5 (ARM p.395): Class Declarations *****/
-
-class_specifier: full_class_head
- '{' { BEGIN IN_CLASS;
- classPLevel = 1;
- }
- opt_obj_member_list
- '}' { BEGIN TQT_DEF; } /*catch ';'*/
- | class_head { BEGIN TQT_DEF; /* -- " -- */
- skipClass = TRUE; }
- | class_head '*' IDENTIFIER { BEGIN TQT_DEF; /* -- " -- */
- skipClass = TRUE; }
- | class_head '&' IDENTIFIER { BEGIN TQT_DEF; /* -- " -- */
- skipClass = TRUE; }
- | class_head
- '(' IDENTIFIER ')' /* TQt macro name */
- { BEGIN TQT_DEF; /* catch ';' */
- skipClass = TRUE; }
- | template_spec whatever { skipClass = TRUE;
- BEGIN GIMME_SEMICOLON; }
- ;
-
-whatever: IDENTIFIER
- | simple_type_name
- | type_specifier
- | storage_class_specifier { $$ = ""; }
- | fct_specifier
- ;
-
-
-class_head: class_key
- qualified_class_name { g->className = $2;
- fprintf( stderr, "FOUND CLASS [1]: %s\n", (const char*)g->className );
- if ( g->className == "TQObject" )
- TQ_OBJECTdetected = TRUE;
- }
- | class_key
- IDENTIFIER /* possible DLL EXPORT macro */
- class_name { g->className = $3;
- fprintf( stderr, "FOUND CLASS [2]: %s\n", (const char*)g->className );
- if ( g->className == "TQObject" )
- TQ_OBJECTdetected = TRUE;
- }
- ;
-
-full_class_head: class_head
- opt_base_spec { g->superClassName = $2; }
- ;
-
-nested_class_head: class_key
- qualified_class_name
- opt_base_spec { templateClass = templateClassOld; }
- ;
-
-exception_spec_opt: /* empty */
- | exception_spec
- ;
-
-/* looser than the real thing */
-exception_spec: THROW '(' opt_exception_argument ')'
- ;
-
-ctor_initializer_opt: /* empty */
- | ctor_initializer
- ;
-
-ctor_initializer: ':' mem_initializer_list
- ;
-
-mem_initializer_list: mem_initializer
- | mem_initializer ',' mem_initializer_list
- ;
-
-/* complete_class_name also represents IDENTIFIER */
-mem_initializer: complete_class_name '(' { expLevel = 1; }
- const_expression ')'
- ;
-
-
-opt_base_spec: /* empty */ { $$ = 0; }
- | base_spec { $$ = $1; }
- ;
-
-opt_obj_member_list: /* empty */
- | obj_member_list
- ;
-
-obj_member_list: obj_member_list obj_member_area
- | obj_member_area
- ;
-
-
-qt_access_specifier: access_specifier { tmpAccess = $1; }
- | SLOTS { tqmoc_err( "Missing access specifier"
- " before \"tqslots:\"." ); }
- ;
-
-obj_member_area: qt_access_specifier { BEGIN TQT_DEF; }
- slot_area
- | SIGNALS { BEGIN TQT_DEF; }
- ':' opt_signal_declarations
- | TQ_OBJECT {
- if ( tmpAccess )
- tqmoc_warn("TQ_OBJECT is not in the private"
- " section of the class.\n"
- "TQ_OBJECT is a macro that resets"
- " access permission to \"private\".");
- TQ_OBJECTdetected = TRUE;
- }
- | Q_PROPERTY { tmpYYStart = YY_START;
- tmpPropOverride = FALSE;
- BEGIN IN_PROPERTY; }
- '(' property ')' {
- BEGIN tmpYYStart;
- }
- opt_property_candidates
- | TQ_OVERRIDE { tmpYYStart = YY_START;
- tmpPropOverride = TRUE;
- BEGIN IN_PROPERTY; }
- '(' property ')' {
- BEGIN tmpYYStart;
- }
- opt_property_candidates
- | TQ_CLASSINFO { tmpYYStart = YY_START; BEGIN IN_CLASSINFO; }
- '(' STRING ',' STRING ')'
- {
- g->infos.append( new ClassInfo( $4, $6 ) );
- BEGIN tmpYYStart;
- }
- opt_property_candidates
- | TQ_ENUMS { tmpYYStart = YY_START; BEGIN IN_PROPERTY; }
- '(' qt_enums ')' {
- Q_PROPERTYdetected = TRUE;
- BEGIN tmpYYStart;
- }
- opt_property_candidates
- | TQ_SETS { tmpYYStart = YY_START; BEGIN IN_PROPERTY; }
- '(' qt_sets ')' {
- Q_PROPERTYdetected = TRUE;
- BEGIN tmpYYStart;
- }
- opt_property_candidates
- ;
-
-slot_area: SIGNALS ':' { tqmoc_err( "Signals cannot "
- "have access specifiers" ); }
- | SLOTS ':' opt_slot_declarations
- | ':' { if ( tmpAccess == Public && Q_PROPERTYdetected )
- BEGIN TQT_DEF;
- else
- BEGIN IN_CLASS;
- suppress_func_warn = TRUE;
- }
- opt_property_candidates
- {
- suppress_func_warn = FALSE;
- }
- | IDENTIFIER { BEGIN IN_CLASS;
- if ( classPLevel != 1 )
- tqmoc_warn( "unexpected access"
- "specifier" );
- }
- ;
-
-opt_property_candidates: /*empty*/
- | property_candidate_declarations
- ;
-
-property_candidate_declarations: property_candidate_declarations property_candidate_declaration
- | property_candidate_declaration
- ;
-
-property_candidate_declaration: signal_or_slot { addMember( PropertyCandidateMember ); }
- ;
-
-opt_signal_declarations: /* empty */
- | signal_declarations
- ;
-
-signal_declarations: signal_declarations signal_declaration
- | signal_declaration
- ;
-
-
-signal_declaration: signal_or_slot { addMember( SignalMember ); }
- ;
-
-opt_slot_declarations: /* empty */
- | slot_declarations
- ;
-
-slot_declarations: slot_declarations slot_declaration
- | slot_declaration
- ;
-
-slot_declaration: signal_or_slot { addMember( SlotMember ); }
- ;
-
-opt_semicolons: /* empty */
- | opt_semicolons ';'
- ;
-
-base_spec: ':' base_list { $$=$2; }
- ;
-
-base_list : base_list ',' base_specifier { g->multipleSuperClasses.append( $3 ); }
- | base_specifier
- ;
-
-qt_macro_name: IDENTIFIER '(' IDENTIFIER ')'
- { $$ = stradd( $1, "(", $3, ")" ); }
- | IDENTIFIER '(' simple_type_name ')'
- { $$ = stradd( $1, "(", $3, ")" ); }
- ;
-
-base_specifier: complete_class_name {$$=$1;}
- | VIRTUAL access_specifier complete_class_name {$$=$3;}
- | VIRTUAL complete_class_name {$$=$2;}
- | access_specifier VIRTUAL complete_class_name {$$=$3;}
- | access_specifier complete_class_name {$$=$2;}
- | qt_macro_name {$$=$1;}
- | VIRTUAL access_specifier qt_macro_name {$$=$3;}
- | VIRTUAL qt_macro_name {$$=$2;}
- | access_specifier VIRTUAL qt_macro_name {$$=$3;}
- | access_specifier qt_macro_name {$$=$2;}
- ;
-
-access_specifier: PRIVATE { $$=Private; }
- | PROTECTED { $$=Protected; }
- | PUBLIC { $$=Public; }
- ;
-
-operator_name: decl_specs_opt IDENTIFIER ptr_operators_opt { }
- | decl_specs_opt simple_type_name ptr_operators_opt { }
- | '+'
- | '-'
- | '*'
- | '/'
- | '%'
- | '^'
- | '&'
- | '|'
- | '~'
- | '!'
- | '='
- | '<'
- | '>'
- | '+' '='
- | '-' '='
- | '*' '='
- | '/' '='
- | '%' '='
- | '^' '='
- | '&' '='
- | '|' '='
- | '~' '='
- | '!' '='
- | '=' '='
- | '<' '='
- | '>' '='
- | '<' '<'
- | '>' '>'
- | '<' '<' '='
- | '>' '>' '='
- | '&' '&'
- | '|' '|'
- | '+' '+'
- | '-' '-'
- | ','
- | '-' '>' '*'
- | '-' '>'
- | '(' ')'
- | '[' ']'
- ;
-
-
-opt_virtual: /* empty */
- | VIRTUAL
- ;
-
-type_and_name: type_name fct_name
- { tmpFunc->type = $1;
- tmpFunc->name = $2; }
- | fct_name
- { tmpFunc->type = "int";
- tmpFunc->name = $1;
- if ( tmpFunc->name == g->className )
- func_warn( "Constructors cannot be"
- " tqsignals or tqslots.");
- }
- | opt_virtual '~' fct_name
- { tmpFunc->type = "void";
- tmpFunc->name = "~";
- tmpFunc->name += $3;
- func_warn( "Destructors cannot be"
- " tqsignals or tqslots.");
- }
- | decl_specs type_name decl_specs_opt
- ptr_operators_opt fct_name
- {
- char *tmp =
- straddSpc($1,$2,$3,$4);
- tmpFunc->type = rmWS(tmp);
- delete [] tmp;
- tmpFunc->name = $5; }
- | decl_specs type_name /* probably friend decl */
- { skipFunc = TRUE; }
- | type_name ptr_operators fct_name
- { tmpFunc->type =
- straddSpc($1,$2);
- tmpFunc->name = $3; }
- | type_name decl_specs ptr_operators_opt
- fct_name
- { tmpFunc->type =
- straddSpc($1,$2,$3);
- tmpFunc->name = $4; }
- | type_name OPERATOR operator_name
- { operatorError(); }
- | OPERATOR operator_name
- { operatorError(); }
- | decl_specs type_name decl_specs_opt
- ptr_operators_opt OPERATOR operator_name
- { operatorError(); }
- | type_name ptr_operators OPERATOR operator_name
- { operatorError(); }
- | type_name decl_specs ptr_operators_opt
- OPERATOR operator_name
- { operatorError(); }
- ;
-
-
-signal_or_slot: type_and_name fct_decl opt_semicolons
- | type_and_name opt_bitfield ';' opt_semicolons
- { func_warn("Unexpected variable declaration."); }
- | type_and_name opt_bitfield ','member_declarator_list
- ';' opt_semicolons
- { func_warn("Unexpected variable declaration."); }
- | enum_specifier opt_identifier ';' opt_semicolons
- { func_warn("Unexpected enum declaration."); }
- | USING complete_class_name ';' opt_semicolons
- { func_warn("Unexpected using declaration."); }
- | USING NAMESPACE complete_class_name ';' opt_semicolons
- { func_warn("Unexpected using declaration."); }
- | NAMESPACE IDENTIFIER '{'
- { classPLevel++;
- tqmoc_err("Unexpected namespace declaration."); }
- | nested_class_head ';' opt_semicolons
- { func_warn("Unexpected class declaration.");}
- | nested_class_head
- '{' { func_warn("Unexpected class declaration.");
- BEGIN IN_FCT; fctLevel=1;
- }
- '}' { BEGIN TQT_DEF; }
- ';' opt_semicolons
- ;
-
-
-member_declarator_list: member_declarator
- | member_declarator_list ',' member_declarator
- ;
-
-member_declarator: declarator { }
- | IDENTIFIER ':' { expLevel = 0; }
- const_expression
- | ':' { expLevel = 0; }
- const_expression
- ;
-
-opt_bitfield: /* empty */
- | ':' { expLevel = 0; }
- const_expression
- ;
-
-
-enum_specifier: ENUM enum_tail
- ;
-
-/* optional final comma at the end of an enum list. Not really C++ but
-some people still use it */
-opt_komma: /*empty*/
- | ','
- ;
-
-enum_tail: IDENTIFIER '{' enum_list opt_komma
- '}' { BEGIN TQT_DEF;
- if ( tmpAccess == Public) {
- tmpEnum->name = $1;
- addEnum();
- }
- }
- | '{' enum_list opt_komma
- '}' { tmpEnum->clear();}
- ;
-
-opt_identifier: /* empty */
- | IDENTIFIER { }
- ;
-
-enum_list: /* empty */
- | enumerator
- | enum_list ',' enumerator
- ;
-
-enumerator: IDENTIFIER { if ( tmpAccess == Public) tmpEnum->append( $1 ); }
- | IDENTIFIER '=' { enumLevel=0; }
- enumerator_expression { if ( tmpAccess == Public) tmpEnum->append( $1 ); }
- ;
-
-property: IDENTIFIER IDENTIFIER
- {
- g->propWrite = "";
- g->propRead = "";
- g->propOverride = tmpPropOverride;
- g->propReset = "";
- if ( g->propOverride ) {
- g->propStored = "";
- g->propDesignable = "";
- g->propScriptable = "";
- } else {
- g->propStored = "true";
- g->propDesignable = "true";
- g->propScriptable = "true";
- }
- }
- prop_statements
- {
- if ( g->propRead.isEmpty() && !g->propOverride )
- tqmoc_err( "A property must at least feature a read method." );
- checkPropertyName( $2 );
- Q_PROPERTYdetected = TRUE;
- // Avoid duplicates
- for( TQPtrListIterator<Property> lit( g->props ); lit.current(); ++lit ) {
- if ( lit.current()->name == $2 ) {
- if ( displayWarnings )
- tqmoc_err( "Property '%s' defined twice.",
- (const char*)lit.current()->name );
- }
- }
- g->props.append( new Property( lineNo, $1, $2,
- g->propWrite, g->propRead, g->propReset,
- g->propStored, g->propDesignable,
- g->propScriptable, g->propOverride ) );
- }
- ;
-
-prop_statements: /* empty */
- | READ IDENTIFIER prop_statements { g->propRead = $2; }
- | WRITE IDENTIFIER prop_statements { g->propWrite = $2; }
- | RESET IDENTIFIER prop_statements { g->propReset = $2; }
- | STORED IDENTIFIER prop_statements { g->propStored = $2; }
- | DESIGNABLE IDENTIFIER prop_statements { g->propDesignable = $2; }
- | SCRIPTABLE IDENTIFIER prop_statements { g->propScriptable = $2; }
- ;
-
-qt_enums: /* empty */ { }
- | IDENTIFIER qt_enums { g->qtEnums.append( $1 ); }
- ;
-
-qt_sets: /* empty */ { }
- | IDENTIFIER qt_sets { g->qtSets.append( $1 ); }
- ;
-
-%%
-
-#ifndef YYBISON
-# if defined(TQ_OS_WIN32)
-# include <io.h>
-# undef isatty
-extern "C" int hack_isatty( int )
-{
- return 0;
-}
-# define isatty hack_isatty
-# else
-# include <unistd.h>
-# endif
-# include "tqmoc_lex.cpp"
-#endif //YYBISON
-
-void cleanup();
-TQCString combinePath( const char *, const char * );
-
-FILE *out; // output file
-
-parser_reg::parser_reg() : funcs(TRUE)
-{
- gen_count = 0;
- noInclude = FALSE; // no #include <filename>
- generatedCode = FALSE; // no code generated
- tqmocError = FALSE; // tqmoc parsing error occurred
- hasVariantIncluded = FALSE;
-}
-
-
-parser_reg::~parser_reg()
-{
- tqslots.clear();
- tqsignals.clear();
- propfuncs.clear();
- funcs.clear();
- infos.clear();
- props.clear();
- infos.clear();
-}
-
-int yyparse();
-
-void replace( char *s, char c1, char c2 );
-
-void setDefaultIncludeFile()
-{
- if ( g->includeFiles.isEmpty() ) {
- if ( g->includePath.isEmpty() ) {
- if ( !g->fileName.isEmpty() && !g->outputFile.isEmpty() ) {
- g->includeFiles.append( combinePath(g->fileName, g->outputFile) );
- } else {
- g->includeFiles.append( g->fileName );
- }
- } else {
- g->includeFiles.append( combinePath(g->fileName, g->fileName) );
- }
- }
-}
-
-#ifdef TQ_CC_MSVC
-#define ErrorFormatString "%s(%d):"
-#else
-#define ErrorFormatString "%s:%d:"
-#endif
-
-#ifndef TQMOC_MWERKS_PLUGIN
-int main( int argc, char **argv )
-{
- init();
-
- bool autoInclude = TRUE;
- const char *error = 0;
- g->qtPath = "";
- for ( int n=1; n<argc && error==0; n++ ) {
- TQCString arg = argv[n];
- if ( arg[0] == '-' ) { // option
- TQCString opt = arg.tqstringFromPos(1);
- if ( opt[0] == 'o' ) { // output redirection
- if ( opt[1] == '\0' ) {
- if ( !(n < argc-1) ) {
- error = "Missing output file name";
- break;
- }
- g->outputFile = argv[++n];
- } else
- g->outputFile = opt.tqstringFromPos(1);
- } else if ( opt == "i" ) { // no #include statement
- g->noInclude = TRUE;
- autoInclude = FALSE;
- } else if ( opt[0] == 'f' ) { // produce #include statement
- g->noInclude = FALSE;
- autoInclude = FALSE;
- if ( opt[1] ) // -fsomething.h
- g->includeFiles.append( opt.tqstringFromPos(1) );
- } else if ( opt == "pch" ) { // produce #include statement for PCH
- if ( !(n < argc-1) ) {
- error = "Missing name of PCH file";
- break;
- }
- g->pchFile = argv[++n];
- } else if ( opt[0] == 'p' ) { // include file path
- if ( opt[1] == '\0' ) {
- if ( !(n < argc-1) ) {
- error = "Missing path name for the -p option.";
- break;
- }
- g->includePath = argv[++n];
- } else {
- g->includePath = opt.tqstringFromPos(1);
- }
- } else if ( opt[0] == 'q' ) { // qt include file path
- if ( opt[1] == '\0' ) {
- if ( !(n < argc-1) ) {
- error = "Missing path name for the -q option.";
- break;
- }
- g->qtPath = argv[++n];
- } else {
- g->qtPath = opt.tqstringFromPos(1);
- }
- replace(g->qtPath.data(),'\\','/');
- if ( g->qtPath.right(1) != "/" )
- g->qtPath += '/';
- } else if ( opt == "v" ) { // version number
- fprintf( stderr, "TQt Meta Object Compiler version %d"
- " (TQt %s)\n", formatRevision,
- TQT_VERSION_STR );
- cleanup();
- return 1;
- } else if ( opt == "k" ) { // stop on errors
- errorControl = TRUE;
- } else if ( opt == "nw" ) { // don't display warnings
- displayWarnings = FALSE;
- } else if ( opt == "ldbg" ) { // lex debug output
- lexDebug = TRUE;
- } else if ( opt == "ydbg" ) { // yacc debug output
- yydebug = TRUE;
- } else {
- error = "Invalid argument";
- }
- } else {
- if ( !g->fileName.isNull() ) // can handle only one file
- error = "Too many input files specified";
- else
- g->fileName = arg.copy();
- }
- }
-
- if ( autoInclude ) {
- int ppos = g->fileName.findRev('.');
- if ( ppos != -1 && tolower( g->fileName[ppos + 1] ) == 'h' )
- g->noInclude = FALSE;
- else
- g->noInclude = TRUE;
- }
- setDefaultIncludeFile();
-
- if ( g->fileName.isNull() && !error ) {
- g->fileName = "standard input";
- yyin = stdin;
- } else if ( argc < 2 || error ) { // incomplete/wrong args
- fprintf( stderr, "TQt meta object compiler\n" );
- if ( error )
- fprintf( stderr, "tqmoc: %s\n", error );
- fprintf( stderr, "Usage: tqmoc [options] <header-file>\n"
- "\t-o file Write output to file rather than stdout\n"
- "\t-f[file] Force #include, optional file name\n"
- "\t-p path Path prefix for included file\n"
- "\t-i Do not generate an #include statement\n"
- "\t-k Do not stop on errors\n"
- "\t-nw Do not display warnings\n"
- "\t-v Display version of tqmoc\n" );
- cleanup();
- return 1;
- } else {
- yyin = fopen( (const char *)g->fileName, "r" );
- if ( !yyin ) {
- fprintf( stderr, "tqmoc: %s: No such file\n", (const char*)g->fileName);
- cleanup();
- return 1;
- }
- }
- if ( !g->outputFile.isEmpty() ) { // output file specified
- out = fopen( (const char *)g->outputFile, "w" ); // create output file
- if ( !out ) {
- fprintf( stderr, "tqmoc: Cannot create %s\n",
- (const char*)g->outputFile );
- cleanup();
- return 1;
- }
- } else { // use stdout
- out = stdout;
- }
- yyparse();
- fclose( yyin );
- if ( !g->outputFile.isNull() )
- fclose( out );
-
- if ( !g->generatedCode && displayWarnings && !g->tqmocError ) {
- fprintf( stderr, ErrorFormatString" Warning: %s\n", g->fileName.data(), 0,
- "No relevant classes found. No output generated." );
- }
-
- int ret = g->tqmocError ? 1 : 0;
- cleanup();
- return ret;
-}
-#else
-bool qt_is_gui_used = FALSE;
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#ifdef TQ_OS_MAC9
-# include <Files.h>
-# include <Strings.h>
-# include <Errors.h>
-# include "Aliases.h"
-#endif
-#include "CWPluginErrors.h"
-#include <CWPlugins.h>
-#include "DropInCompilerLinker.h"
-#include <stat.h>
-
-const unsigned char *p_str(const char *, int =-1);
-
-CWPluginContext g_ctx;
-
-tqmoc_status do_tqmoc( CWPluginContext ctx, const TQCString &fin, const TQCString &fout, CWFileSpec *dspec, bool i)
-{
- init();
-
- g_ctx = ctx;
- g->noInclude = i;
- g->fileName = fin;
- g->outputFile = fout;
-
- setDefaultIncludeFile();
-
- CWFileInfo fi;
- memset(&fi, 0, sizeof(fi));
- fi.fullsearch = TRUE;
- fi.dependencyType = cwNormalDependency;
- fi.isdependentoffile = kCurrentCompiledFile;
- if(CWFindAndLoadFile( ctx, fin.data(), &fi) != cwNoErr) {
- cleanup();
- return tqmoc_no_source;
- }
-
- if(dspec) {
- memcpy(dspec, &fi.filespec, sizeof(fi.filespec));
- const unsigned char *f = p_str(fout.data());
- memcpy(dspec->name, f, f[0]+1);
- free(f);
- }
- buf_size_total = fi.filedatalength;
- buf_buffer = fi.filedata;
-
- TQCString path("");
- AliasHandle alias;
- Str63 str;
- AliasInfoType x = 1;
- char tmp[sizeof(Str63)+2];
- if(NewAlias( NULL, &fi.filespec, &alias) != noErr) {
- cleanup();
- return tqmoc_general_error;
- }
- for(;;) {
- GetAliasInfo(alias, x++, str);
- if(!str[0])
- break;
- strncpy((char *)tmp, (const char *)str+1, str[0]);
- tmp[str[0]] = '\0';
- path.prepend(":");
- path.prepend((char *)tmp);
- }
- path.prepend("MacOS 9:"); //FIXME
-
- TQString inpath = path + fin, outpath = path + fout;
- struct stat istat, ostat;
- if(stat(inpath, &istat) == -1) {
- cleanup();
- return tqmoc_no_source;
- }
- if(stat(outpath, &ostat) == 0 && istat.st_mtime < ostat.st_mtime) {
- cleanup();
- return tqmoc_not_time;
- }
-
- unlink(outpath.data());
- out = fopen(outpath.data(), "w+");
- if(!out) {
- cleanup();
- return tqmoc_general_error;
- }
-
- yyparse();
- if(out != stdout)
- fclose(out);
-
- if(g->tqmocError || !g->generatedCode) {
- unlink(outpath.data());
- tqmoc_status ret = !g->generatedCode ? tqmoc_no_qobject : tqmoc_parse_error;
- cleanup();
- return ret;
- }
-
- cleanup();
- return tqmoc_success;
-}
-#endif
-void replace( char *s, char c1, char c2 )
-{
- if ( !s )
- return;
- while ( *s ) {
- if ( *s == c1 )
- *s = c2;
- s++;
- }
-}
-
-/*
- This function looks at two file names and returns the name of the
- infile with a path relative to outfile.
-
- Examples:
-
- /tmp/abc, /tmp/bcd -> abc
- xyz/a/bc, xyz/b/ac -> ../a/bc
- /tmp/abc, xyz/klm -> /tmp/abc
- */
-
-TQCString combinePath( const char *infile, const char *outfile )
-{
- TQFileInfo inFileInfo( TQDir::current(), TQFile::decodeName(infile) );
- TQFileInfo outFileInfo( TQDir::current(), TQFile::decodeName(outfile) );
- int numCommonComponents = 0;
-
- TQStringList inSplitted =
- TQStringList::split( '/', inFileInfo.dir().canonicalPath(), TRUE );
- TQStringList outSplitted =
- TQStringList::split( '/', outFileInfo.dir().canonicalPath(), TRUE );
-
- while ( !inSplitted.isEmpty() && !outSplitted.isEmpty() &&
- inSplitted.first() == outSplitted.first() ) {
- inSplitted.remove( inSplitted.begin() );
- outSplitted.remove( outSplitted.begin() );
- numCommonComponents++;
- }
-
- if ( numCommonComponents < 2 ) {
- /*
- The paths don't have the same drive, or they don't have the
- same root directory. Use an absolute path.
- */
- return TQFile::encodeName( inFileInfo.absFilePath() );
- } else {
- /*
- The paths have something in common. Use a path relative to
- the output file.
- */
- while ( !outSplitted.isEmpty() ) {
- outSplitted.remove( outSplitted.begin() );
- inSplitted.prepend( ".." );
- }
- inSplitted.append( inFileInfo.fileName() );
- return TQFile::encodeName( inSplitted.join("/") );
- }
-}
-
-
-#define getenv hack_getenv // workaround for byacc
-char *getenv() { return 0; }
-char *getenv( const char * ) { return 0; }
-
-void init() // initialize
-{
- BEGIN OUTSIDE;
- if(g)
- delete g;
- g = new parser_reg;
- lineNo = 1;
- skipClass = FALSE;
- skipFunc = FALSE;
- tmpArgList = new ArgList;
- tmpFunc = new Function;
- tmpEnum = new Enum;
-
-#ifdef TQMOC_MWERKS_PLUGIN
- buf_buffer = NULL;
- buf_index = 0;
- buf_size_total = 0;
-#endif
-}
-
-void cleanup()
-{
- delete g;
- g = NULL;
-
-#ifdef TQMOC_MWERKS_PLUGIN
- if(buf_buffer && g_ctx)
- CWReleaseFileText(g_ctx, buf_buffer);
-#endif
-}
-
-void initClass() // prepare for new class
-{
- tmpAccess = Private;
- subClassPerm = Private;
- TQ_OBJECTdetected = FALSE;
- Q_PROPERTYdetected = FALSE;
- skipClass = FALSE;
- templateClass = FALSE;
- g->tqslots.clear();
- g->tqsignals.clear();
- g->propfuncs.clear();
- g->enums.clear();
- g->funcs.clear();
- g->props.clear();
- g->infos.clear();
- g->qtSets.clear();
- g->qtEnums.clear();
- g->multipleSuperClasses.clear();
-}
-
-struct NamespaceInfo
-{
- TQCString name;
- int pLevelOnEntering; // Parenthesis level on entering the namespace
- TQDict<char> definedClasses; // Classes defined in the namespace
-};
-
-TQPtrList<NamespaceInfo> namespaces;
-
-void enterNameSpace( const char *name ) // prepare for new class
-{
- static bool first = TRUE;
- if ( first ) {
- namespaces.setAutoDelete( TRUE );
- first = FALSE;
- }
-
- NamespaceInfo *tmp = new NamespaceInfo;
- if ( name )
- tmp->name = name;
- tmp->pLevelOnEntering = namespacePLevel;
- namespaces.append( tmp );
-}
-
-void leaveNameSpace() // prepare for new class
-{
- NamespaceInfo *tmp = namespaces.last();
- namespacePLevel = tmp->pLevelOnEntering;
- namespaces.remove();
-}
-
-TQCString nameTQualifier()
-{
- TQPtrListIterator<NamespaceInfo> iter( namespaces );
- NamespaceInfo *tmp;
- TQCString qualifier = "";
- for( ; (tmp = iter.current()) ; ++iter ) {
- if ( !tmp->name.isNull() ) { // If not unnamed namespace
- qualifier += tmp->name;
- qualifier += "::";
- }
- }
- return qualifier;
-}
-
-int openNameSpaceForMetaObject( FILE *out )
-{
- int levels = 0;
- TQPtrListIterator<NamespaceInfo> iter( namespaces );
- NamespaceInfo *tmp;
- TQCString indent = "";
- for( ; (tmp = iter.current()) ; ++iter ) {
- if ( !tmp->name.isNull() ) { // If not unnamed namespace
- fprintf( out, "%snamespace %s {\n", (const char *)indent,
- (const char *) tmp->name );
- indent += " ";
- levels++;
- }
- }
- TQCString nm = g->className;
- int pos;
- while( (pos = nm.find( "::" )) != -1 ) {
- TQCString spaceName = nm.left( pos );
- nm = nm.right( nm.length() - pos - 2 );
- if ( !spaceName.isEmpty() ) {
- fprintf( out, "%snamespace %s {\n", (const char *)indent,
- (const char *) spaceName );
- indent += " ";
- levels++;
- }
- }
- return levels;
-}
-
-void closeNameSpaceForMetaObject( FILE *out, int levels )
-{
- int i;
- for( i = 0 ; i < levels ; i++ )
- fprintf( out, "}" );
- if ( levels )
- fprintf( out, "\n" );
-
-}
-
-void selectOutsideClassState()
-{
- if ( namespaces.count() == 0 )
- BEGIN OUTSIDE;
- else
- BEGIN IN_NAMESPACE;
-}
-
-void registerClassInNamespace()
-{
- if ( namespaces.count() == 0 )
- return;
- namespaces.last()->definedClasses.insert((const char *)g->className,(char*)1);
-}
-
-//
-// Remove white space from SIGNAL and SLOT names.
-// This function has been copied from qobject.cpp.
-//
-
-inline bool isSpace( char x )
-{
-#if defined(TQ_CC_BOR)
- /*
- Borland C++ 4.5 has a weird isspace() bug.
- isspace() usually works, but not here.
- This implementation is sufficient for our internal use: rmWS()
- */
- return (uchar) x <= 32;
-#else
- return isspace( (uchar) x );
-#endif
-}
-
-static TQCString rmWS( const char *src )
-{
- TQCString result( tqstrlen(src)+1 );
- char *d = result.data();
- char *s = (char *)src;
- char last = 0;
- while( *s && isSpace(*s) ) // skip leading space
- s++;
- while ( *s ) {
- while ( *s && !isSpace(*s) )
- last = *d++ = *s++;
- while ( *s && isSpace(*s) )
- s++;
- if ( *s && isIdentChar(*s) && isIdentChar(last) )
- last = *d++ = ' ';
- }
- result.truncate( (int)(d - result.data()) );
- return result;
-}
-
-
-void initExpression()
-{
- g->tmpExpression = "";
-}
-
-void addExpressionString( const char *s )
-{
- g->tmpExpression += s;
-}
-
-void addExpressionChar( const char c )
-{
- g->tmpExpression += c;
-}
-
-void yyerror( const char *msg ) // print yacc error message
-{
- g->tqmocError = TRUE;
-#ifndef TQMOC_MWERKS_PLUGIN
- fprintf( stderr, ErrorFormatString" Error: %s\n", g->fileName.data(), lineNo, msg );
-#else
- char msg2[200];
- sprintf(msg2, ErrorFormatString" Error: %s", g->fileName.data(), lineNo, msg);
- CWReportMessage(g_ctx, NULL, msg2, NULL, messagetypeError, 0);
-#endif
- if ( errorControl ) {
- if ( !g->outputFile.isEmpty() && yyin && fclose(yyin) == 0 )
- remove( g->outputFile );
- exit( -1 );
- }
-}
-
-void tqmoc_err( const char *s )
-{
- yyerror( s );
-}
-
-void tqmoc_err( const char *s1, const char *s2 )
-{
- static char tmp[1024];
- sprintf( tmp, s1, s2 );
- yyerror( tmp );
-}
-
-void tqmoc_warn( const char *msg )
-{
- if ( displayWarnings )
- fprintf( stderr, ErrorFormatString" Warning: %s\n", g->fileName.data(), lineNo, msg);
-}
-
-void tqmoc_warn( char *s1, char *s2 )
-{
- static char tmp[1024];
- sprintf( tmp, s1, s2 );
- if ( displayWarnings )
- fprintf( stderr, ErrorFormatString" Warning: %s\n", g->fileName.data(), lineNo, tmp);
-}
-
-void func_warn( const char *msg )
-{
- if ( !suppress_func_warn )
- tqmoc_warn( msg );
- skipFunc = TRUE;
-}
-
-void operatorError()
-{
- if ( !suppress_func_warn )
- tqmoc_warn("Operator functions cannot be tqsignals or tqslots.");
- skipFunc = TRUE;
-}
-
-#ifndef yywrap
-int yywrap() // more files?
-{
- return 1; // end of file
-}
-#endif
-
-char *stradd( const char *s1, const char *s2 ) // adds two strings
-{
- char *n = new char[tqstrlen(s1)+tqstrlen(s2)+1];
- qstrcpy( n, s1 );
- strcat( n, s2 );
- return n;
-}
-
-char *stradd( const char *s1, const char *s2, const char *s3 )// adds 3 strings
-{
- char *n = new char[tqstrlen(s1)+tqstrlen(s2)+tqstrlen(s3)+1];
- qstrcpy( n, s1 );
- strcat( n, s2 );
- strcat( n, s3 );
- return n;
-}
-
-char *stradd( const char *s1, const char *s2,
- const char *s3, const char *s4 )// adds 4 strings
-{
- char *n = new char[tqstrlen(s1)+tqstrlen(s2)+tqstrlen(s3)+tqstrlen(s4)+1];
- qstrcpy( n, s1 );
- strcat( n, s2 );
- strcat( n, s3 );
- strcat( n, s4 );
- return n;
-}
-
-
-char *straddSpc( const char *s1, const char *s2 )
-{
- char *n = new char[tqstrlen(s1)+tqstrlen(s2)+2];
- qstrcpy( n, s1 );
- strcat( n, " " );
- strcat( n, s2 );
- return n;
-}
-
-char *straddSpc( const char *s1, const char *s2, const char *s3 )
-{
- char *n = new char[tqstrlen(s1)+tqstrlen(s2)+tqstrlen(s3)+3];
- qstrcpy( n, s1 );
- strcat( n, " " );
- strcat( n, s2 );
- strcat( n, " " );
- strcat( n, s3 );
- return n;
-}
-
-char *straddSpc( const char *s1, const char *s2,
- const char *s3, const char *s4 )
-{
- char *n = new char[tqstrlen(s1)+tqstrlen(s2)+tqstrlen(s3)+tqstrlen(s4)+4];
- qstrcpy( n, s1 );
- strcat( n, " " );
- strcat( n, s2 );
- strcat( n, " " );
- strcat( n, s3 );
- strcat( n, " " );
- strcat( n, s4 );
- return n;
-}
-
-// Generate C++ code for building member function table
-
-
-/*
- We call B::qt_invoke() rather than A::B::qt_invoke() to
- work around a bug in MSVC 6. The bug occurs if the
- super-class is in a namespace and the sub-class isn't.
-
- Exception: If the superclass has the same name as the subclass, we
- want non-MSVC users to have a working generated files.
-*/
-TQCString purestSuperClassName()
-{
- TQCString sc = g->superClassName;
- TQCString c = g->className;
- /*
- Make sure qualified template arguments (e.g., foo<bar::baz>)
- don't interfere.
- */
- int pos = sc.findRev( "::", sc.find( '<' ) );
- if ( pos != -1 ) {
- sc = sc.right( sc.length() - pos - 2 );
- pos = c.findRev( "::" );
- if ( pos != -1 )
- c = c.right( c.length() - pos - 2 );
- if ( sc == c )
- sc = g->superClassName;
- }
- return sc;
-}
-
-TQCString callablePurestSuperClassName()
-{
- TQCString sc = purestSuperClassName();
-// if (sc.find("TQ") != 0) {
- return TQCString("static_cast<TQObject*>(static_cast<TQT_BASE_OBJECT_NAME*>(this))->");
-// }
-// else {
-// return TQCString(sc + "::");
-// }
-}
-
-TQCString qualifiedClassName()
-{
- return nameTQualifier() + g->className;
-}
-
-TQCString callableQualifiedClassName()
-{
- TQCString sc = qualifiedClassName();
-// if (sc.find("TQ") != 0) {
- return TQCString("static_cast<TQObject*>(static_cast<TQT_BASE_OBJECT_NAME*>(this))->");
-// }
-// else {
-// return TQCString(sc + "::");
-// }
-}
-
-const int Slot_Num = 1;
-const int Signal_Num = 2;
-const int Prop_Num = 3;
-
-void generateFuncs( FuncList *list, const char *functype, int num )
-{
- Function *f;
- for ( f=list->first(); f; f=list->next() ) {
- bool hasReturnValue = f->type != "void" && (validUType( f->type ) || isVariantType( f->type) );
-
- if ( hasReturnValue || !f->args->isEmpty() ) {
- fprintf( out, " static const TQUParameter param_%s_%d[] = {\n", functype, list->at() );
- if ( hasReturnValue ) {
- if ( validUType( f->type ) )
- fprintf( out, "\t{ 0, &static_TQUType_%s, %s, TQUParameter::Out }", uType(f->type).data(), uTypeExtra(f->type).data() );
- else
- fprintf( out, "\t{ 0, &static_TQUType_TQVariant, %s, TQUParameter::Out }", uTypeExtra(f->type).data() );
- if ( !f->args->isEmpty() )
- fprintf( out, ",\n" );
- }
- Argument* a = f->args->first();
- while ( a ) {
- TQCString type = a->leftType + ' ' + a->rightType;
- type = type.simplifyWhiteSpace();
- if( a->name.isEmpty() )
- fprintf( out, "\t{ 0, &static_TQUType_%s, %s, TQUParameter::%s }",
- uType( type ).data(), uTypeExtra( type ).data(),
- isInOut( type ) ? "InOut" : "In" );
- else
- fprintf( out, "\t{ \"%s\", &static_TQUType_%s, %s, TQUParameter::%s }",
- a->name.data(), uType( type ).data(), uTypeExtra( type ).data(),
- isInOut( type ) ? "InOut" : "In" );
- a = f->args->next();
- if ( a )
- fprintf( out, ",\n" );
- }
- fprintf( out, "\n };\n");
- }
-
- fprintf( out, " static const TQUMethod %s_%d = {", functype, list->at() );
- int n = f->args->count();
- if ( hasReturnValue )
- n++;
- fprintf( out, "\"%s\", %d,", f->name.data(), n );
- if ( n )
- fprintf( out, " param_%s_%d };\n", functype, list->at() );
- else
- fprintf( out, " 0 };\n" );
-
- TQCString typstr = "";
- int count = 0;
- Argument *a = f->args->first();
- while ( a ) {
- if ( !a->leftType.isEmpty() || ! a->rightType.isEmpty() ) {
- if ( count++ )
- typstr += ",";
- typstr += a->leftType;
- typstr += a->rightType;
- }
- a = f->args->next();
- }
- f->signature = f->name;
- f->signature += "(";
- f->signature += typstr;
- f->signature += ")";
- }
- if ( list->count() ) {
- fprintf(out," static const TQMetaData %s_tbl[] = {\n", functype );
- f = list->first();
- while ( f ) {
- fprintf( out, "\t{ \"%s\",", f->signature.data() );
- fprintf( out, " &%s_%d,", functype, list->at() );
- fprintf( out, " TQMetaData::%s }", f->accessAsString() );
- f = list->next();
- if ( f )
- fprintf( out, ",\n");
- }
- fprintf( out, "\n };\n" );
- }
-}
-
-
-int enumIndex( const char* type )
-{
- int index = 0;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit ) {
- if ( lit.current()->name == type )
- return index;
- index++;
- }
- return -1;
-}
-
-bool isEnumType( const char* type )
-{
- return enumIndex( type ) >= 0 || ( g->qtEnums.contains( type ) || g->qtSets.contains( type ) );
-}
-
-bool isPropertyType( const char* type )
-{
- if ( isVariantType( type ) )
- return TRUE;
-
- return isEnumType( type );
-}
-
-int generateEnums()
-{
- if ( g->enums.count() == 0 )
- return 0;
-
- fprintf( out, "#ifndef TQT_NO_PROPERTIES\n" );
- int i = 0;
- for ( TQPtrListIterator<Enum> it( g->enums ); it.current(); ++it, ++i ) {
- fprintf( out, " static const TQMetaEnum::Item enum_%i[] = {\n", i );
- int k = 0;
- for( TQStrListIterator eit( *it.current() ); eit.current(); ++eit, ++k ) {
- if ( k )
- fprintf( out, ",\n" );
- fprintf( out, "\t{ \"%s\", (int) %s::%s }", eit.current(), (const char*) g->className, eit.current() );
- }
- fprintf( out, "\n };\n" );
- }
- fprintf( out, " static const TQMetaEnum enum_tbl[] = {\n" );
- i = 0;
- for ( TQPtrListIterator<Enum> it2( g->enums ); it2.current(); ++it2, ++i ) {
- if ( i )
- fprintf( out, ",\n" );
- fprintf( out, "\t{ \"%s\", %u, enum_%i, %s }",
- (const char*)it2.current()->name,
- it2.current()->count(),
- i,
- it2.current()->set ? "TRUE" : "FALSE" );
- }
- fprintf( out, "\n };\n" );
- fprintf( out, "#endif // TQT_NO_PROPERTIES\n" );
-
- return g->enums.count();
-}
-
-int generateProps()
-{
- //
- // Resolve and verify property access functions
- //
- for( TQPtrListIterator<Property> it( g->props ); it.current(); ) {
- Property* p = it.current();
- ++it;
-
- // verify get function
- if ( !p->get.isEmpty() ) {
- FuncList candidates = g->propfuncs.find( p->get );
- for ( Function* f = candidates.first(); f; f = candidates.next() ) {
- if ( f->qualifier != "const" ) // get functions must be const
- continue;
- if ( f->args && !f->args->isEmpty() ) // and must not take any arguments
- continue;
- TQCString tmp = f->type;
- Property::Specification spec = Property::Unspecified;
- if ( p->type == "TQCString" && (tmp == "const char*" || tmp == "const char *" ) ) {
- tmp = "TQCString";
- spec = Property::ConstCharStar;
- } else if ( tmp.right(1) == "&" ) {
- tmp = tmp.left( tmp.length() - 1 );
- spec = Property::Reference;
- } else if ( tmp.right(1) == "*" ) {
- tmp = tmp.left( tmp.length() - 1 );
- spec = Property::Pointer;
- } else {
- spec = Property::Class;
- }
- if ( tmp.left(6) == "const " )
- tmp = tmp.mid( 6, tmp.length() - 6 );
- tmp = tmp.simplifyWhiteSpace();
- if ( p->type == tmp ) {
- // If it is an enum then it may not be a set
- bool ok = TRUE;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit )
- if ( lit.current()->name == p->type && lit.current()->set )
- ok = FALSE;
- if ( !ok ) continue;
- p->gspec = spec;
- p->getfunc = f;
- p->oredEnum = 0;
- break;
- }
- else if ( !isVariantType( p->type ) ) {
- if ( tmp == "int" || tmp == "uint" || tmp == "unsigned int" ) {
- // Test whether the enum is really a set (unfortunately we don't know enums of super classes)
- bool ok = TRUE;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit )
- if ( lit.current()->name == p->type && !lit.current()->set )
- ok = FALSE;
- if ( !ok ) continue;
- p->gspec = spec;
- p->getfunc = f;
- p->oredEnum = 1;
- p->enumgettype = tmp;
- }
- }
- }
- if ( p->getfunc == 0 ) {
- if ( displayWarnings ) {
-
- // Is the type a set, that means, mentioned in TQ_SETS?
- bool set = FALSE;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit )
- if ( lit.current()->name == p->type && lit.current()->set )
- set = TRUE;
-
- fprintf( stderr, ErrorFormatString" Warning: Property '%s' not available.\n",
- g->fileName.data(), p->lineNo, (const char*) p->name );
- fprintf( stderr, " Have been looking for public get functions \n");
- if ( !set ) {
- fprintf( stderr,
- " %s %s() const\n"
- " %s& %s() const\n"
- " const %s& %s() const\n"
- " %s* %s() const\n",
- (const char*) p->type, (const char*) p->get,
- (const char*) p->type, (const char*) p->get,
- (const char*) p->type, (const char*) p->get,
- (const char*) p->type, (const char*) p->get );
- }
- if ( set || !isPropertyType( p->type ) ) {
- fprintf( stderr,
- " int %s() const\n"
- " uint %s() const\n"
- " unsigned int %s() const\n",
- (const char*) p->get,
- (const char*) p->get,
- (const char*) p->get );
- }
- if ( p->type == "TQCString" )
- fprintf( stderr, " const char* %s() const\n",
- (const char*)p->get );
-
- if ( candidates.isEmpty() ) {
- fprintf( stderr, " but found nothing.\n");
- } else {
- fprintf( stderr, " but only found the mismatching candidate(s)\n");
- for ( Function* f = candidates.first(); f; f = candidates.next() ) {
- TQCString typstr = "";
- Argument *a = f->args->first();
- int count = 0;
- while ( a ) {
- if ( !a->leftType.isEmpty() || ! a->rightType.isEmpty() ) {
- if ( count++ )
- typstr += ",";
- typstr += a->leftType;
- typstr += a->rightType;
- }
- a = f->args->next();
- }
- fprintf( stderr, " %s:%d: %s %s(%s) %s\n", g->fileName.data(), f->lineNo,
- (const char*) f->type,(const char*) f->name, (const char*) typstr,
- f->qualifier.isNull()?"":(const char*) f->qualifier );
- }
- }
- }
- }
- }
-
- // verify set function
- if ( !p->set.isEmpty() ) {
- FuncList candidates = g->propfuncs.find( p->set );
- for ( Function* f = candidates.first(); f; f = candidates.next() ) {
- if ( !f->args || f->args->isEmpty() )
- continue;
- TQCString tmp = f->args->first()->leftType;
- tmp = tmp.simplifyWhiteSpace();
- Property::Specification spec = Property::Unspecified;
- if ( tmp.right(1) == "&" ) {
- tmp = tmp.left( tmp.length() - 1 );
- spec = Property::Reference;
- }
- else {
- spec = Property::Class;
- }
- if ( p->type == "TQCString" && (tmp == "const char*" || tmp == "const char *" ) ) {
- tmp = "TQCString";
- spec = Property::ConstCharStar;
- }
- if ( tmp.left(6) == "const " )
- tmp = tmp.mid( 6, tmp.length() - 6 );
- tmp = tmp.simplifyWhiteSpace();
-
- if ( p->type == tmp && f->args->count() == 1 ) {
- // If it is an enum then it may not be a set
- if ( p->oredEnum == 1 )
- continue;
- bool ok = TRUE;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit )
- if ( lit.current()->name == p->type && lit.current()->set )
- ok = FALSE;
- if ( !ok ) continue;
- p->sspec = spec;
- p->setfunc = f;
- p->oredEnum = 0;
- break;
- } else if ( !isVariantType( p->type ) && f->args->count() == 1 ) {
- if ( tmp == "int" || tmp == "uint" || tmp == "unsigned int" ) {
- if ( p->oredEnum == 0 )
- continue;
- // Test wether the enum is really a set (unfortunately we don't know enums of super classes)
- bool ok = TRUE;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit )
- if ( lit.current()->name == p->type && !lit.current()->set )
- ok = FALSE;
- if ( !ok ) continue;
- p->sspec = spec;
- p->setfunc = f;
- p->oredEnum = 1;
- p->enumsettype = tmp;
- }
- }
- }
- if ( p->setfunc == 0 ) {
- if ( displayWarnings ) {
-
- // Is the type a set, that means, mentioned in TQ_SETS ?
- bool set = FALSE;
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit )
- if ( lit.current()->name == p->type && lit.current()->set )
- set = TRUE;
-
- fprintf( stderr, ErrorFormatString" Warning: Property '%s' not writable.\n",
- g->fileName.data(), p->lineNo, (const char*) p->name );
- fprintf( stderr, " Have been looking for public set functions \n");
- if ( !set && p->oredEnum != 1 ) {
- fprintf( stderr,
- " void %s( %s )\n"
- " void %s( %s& )\n"
- " void %s( const %s& )\n",
- (const char*) p->set, (const char*) p->type,
- (const char*) p->set, (const char*) p->type,
- (const char*) p->set, (const char*) p->type );
- }
- if ( set || ( !isPropertyType( p->type ) && p->oredEnum != 0 ) ) {
- fprintf( stderr,
- " void %s( int )\n"
- " void %s( uint )\n"
- " void %s( unsigned int )\n",
- (const char*) p->set,
- (const char*) p->set,
- (const char*) p->set );
- }
-
- if ( p->type == "TQCString" )
- fprintf( stderr, " void %s( const char* ) const\n",
- (const char*) p->set );
-
- if ( !candidates.isEmpty() ) {
- fprintf( stderr, " but only found the mismatching candidate(s)\n");
- for ( Function* f = candidates.first(); f; f = candidates.next() ) {
- TQCString typstr = "";
- Argument *a = f->args->first();
- int count = 0;
- while ( a ) {
- if ( !a->leftType.isEmpty() || ! a->rightType.isEmpty() ) {
- if ( count++ )
- typstr += ",";
- typstr += a->leftType;
- typstr += a->rightType;
- }
- a = f->args->next();
- }
- fprintf( stderr, " %s:%d: %s %s(%s)\n", g->fileName.data(), f->lineNo,
- (const char*) f->type,(const char*) f->name, (const char*) typstr );
- }
- }
- }
- }
- }
- }
-
- //
- // Create meta data
- //
- if ( g->props.count() ) {
- if ( displayWarnings && !TQ_OBJECTdetected )
- tqmoc_err("The declaration of the class \"%s\" contains properties"
- " but no TQ_OBJECT macro.", g->className.data());
-
- fprintf( out, "#ifndef TQT_NO_PROPERTIES\n" );
-
- fprintf( out, " static const TQMetaProperty props_tbl[%d] = {\n ", g->props.count() );
- for( TQPtrListIterator<Property> it( g->props ); it.current(); ++it ) {
-
- fprintf( out, "\t{ \"%s\",\"%s\", ", it.current()->type.data(), it.current()->name.data() );
- int flags = Invalid;
- if ( !isVariantType( it.current()->type ) ) {
- flags |= EnumOrSet;
- if ( !isEnumType( it.current()->type ) )
- flags |= UnresolvedEnum;
- } else {
- flags |= qvariant_nameToType( it.current()->type ) << 24;
- }
- if ( it.current()->getfunc )
- flags |= Readable;
- if ( it.current()->setfunc ) {
- flags |= Writable;
- if ( it.current()->stdSet() )
- flags |= StdSet;
- }
- if ( it.current()->override )
- flags |= Override;
-
- if ( it.current()->designable.isEmpty() )
- flags |= DesignableOverride;
- else if ( it.current()->designable == "false" )
- flags |= NotDesignable;
-
- if ( it.current()->scriptable.isEmpty() )
- flags |= ScriptableOverride;
- else if ( it.current()->scriptable == "false" )
- flags |= NotScriptable;
-
- if ( it.current()->stored.isEmpty() )
- flags |= StoredOverride;
- else if ( it.current()->stored == "false" )
- flags |= NotStored;
-
-
- fprintf( out, "0x%.4x, ", flags );
- fprintf( out, "&%s::metaObj, ", (const char*) qualifiedClassName() );
- if ( !isVariantType( it.current()->type ) ) {
- int enumpos = -1;
- int k = 0;
- for( TQPtrListIterator<Enum> eit( g->enums ); eit.current(); ++eit, ++k ) {
- if ( eit.current()->name == it.current()->type )
- enumpos = k;
- }
-
- // Is it an enum of this class ?
- if ( enumpos != -1 )
- fprintf( out, "&enum_tbl[%i], ", enumpos );
- else
- fprintf( out, "0, ");
- } else {
- fprintf( out, "0, ");
- }
- fprintf( out, "-1 }" );
- if ( !it.atLast() )
- fprintf( out, ",\n" );
- else
- fprintf( out, "\n" );
- }
- fprintf( out, " };\n" );
- fprintf( out, "#endif // TQT_NO_PROPERTIES\n" );
- }
-
- return g->props.count();
-}
-
-
-
-int generateClassInfos()
-{
- if ( g->infos.isEmpty() )
- return 0;
-
- if ( displayWarnings && !TQ_OBJECTdetected )
- tqmoc_err("The declaration of the class \"%s\" contains class infos"
- " but no TQ_OBJECT macro.", g->className.data());
-
- fprintf( out, " static const TQClassInfo classinfo_tbl[] = {\n" );
- int i = 0;
- for( TQPtrListIterator<ClassInfo> it( g->infos ); it.current(); ++it, ++i ) {
- if ( i )
- fprintf( out, ",\n" );
- fprintf( out, "\t{ \"%s\", \"%s\" }", it.current()->name.data(),it.current()->value.data() );
- }
- fprintf( out, "\n };\n" );
- return i;
-}
-
-
-void generateClass() // generate C++ source code for a class
-{
- const char *hdr1 = "/****************************************************************************\n"
- "** %s meta object code from reading C++ file '%s'\n**\n";
- const char *hdr2 = "** Created: %s\n";
- const char *hdr3 = "** WARNING! All changes made in this file will be lost!\n";
- const char *hdr4 = "*****************************************************************************/\n\n";
- int i;
-
- if ( skipClass ) // don't generate for class
- return;
-
- if ( !TQ_OBJECTdetected ) {
- if ( g->tqsignals.count() == 0 && g->tqslots.count() == 0 && g->props.count() == 0 && g->infos.count() == 0 )
- return;
- if ( displayWarnings && (g->tqsignals.count() + g->tqslots.count()) != 0 )
- tqmoc_err("The declaration of the class \"%s\" contains tqsignals "
- "or tqslots\n\t but no TQ_OBJECT macro.", g->className.data());
- } else {
- if ( g->superClassName.isEmpty() )
- tqmoc_err("The declaration of the class \"%s\" contains the\n"
- "\tTQ_OBJECT macro but does not inherit from any class!\n"
- "\tInherit from TQObject or one of its descendants"
- " or remove TQ_OBJECT.", g->className.data() );
- }
- if ( templateClass ) { // don't generate for class
- tqmoc_err( "Sorry, TQt does not support templates that contain\n"
- "\ttqsignals, tqslots or TQ_OBJECT." );
- return;
- }
- g->generatedCode = TRUE;
- g->gen_count++;
-
- if ( g->gen_count == 1 ) { // first class to be generated
- TQDateTime dt = TQDateTime::tqcurrentDateTime();
- TQCString dstr = dt.toString().ascii();
- TQCString fn = g->fileName;
- i = g->fileName.length()-1;
- while ( i>0 && g->fileName[i-1] != '/' && g->fileName[i-1] != '\\' )
- i--; // skip path
- if ( i >= 0 )
- fn = g->fileName.tqstringFromPos(i);
- fprintf( out, hdr1, (const char*)qualifiedClassName(),(const char*)fn);
- fprintf( out, hdr2, (const char*)dstr );
- fprintf( out, hdr3 );
- fprintf( out, hdr4 );
-
- if ( !g->noInclude ) {
- /*
- The header file might be a TQt header file with
- TQT_NO_COMPAT macros around tqsignals, tqslots or
- properties. Without the #undef, we cannot compile the
- TQt library with TQT_NO_COMPAT defined.
-
- Header files of libraries build around TQt can also use
- TQT_NO_COMPAT, so this #undef might be beneficial to
- users of TQt, and not only to developers of TQt.
- */
- fprintf( out, "#undef TQT_NO_COMPAT\n" );
-
- if ( !g->pchFile.isEmpty() )
- fprintf( out, "#include \"%s\" // PCH include\n", (const char*)g->pchFile );
- if ( !g->includePath.isEmpty() && g->includePath.right(1) != "/" )
- g->includePath += "/";
-
- g->includeFiles.first();
- while ( g->includeFiles.current() ) {
- TQCString inc = g->includeFiles.current();
- if ( inc[0] != '<' && inc[0] != '"' ) {
- if ( !g->includePath.isEmpty() && g->includePath != "./" )
- inc.prepend( g->includePath );
- inc = "\"" + inc + "\"";
- }
- fprintf( out, "#include %s\n", (const char *)inc );
- g->includeFiles.next();
- }
- }
- fprintf( out, "#include <%stqmetaobject.h>\n", (const char*)g->qtPath );
- fprintf( out, "#include <%stqapplication.h>\n\n", (const char*)g->qtPath );
- fprintf( out, "#include <%sprivate/tqucomextra_p.h>\n", (const char*)g->qtPath );
- fprintf( out, "#if !defined(TQ_TQMOC_OUTPUT_REVISION) || (TQ_TQMOC_OUTPUT_REVISION != %d)\n", formatRevision );
- fprintf( out, "#error \"This file was generated using the tqmoc from %s."
- " It\"\n#error \"cannot be used with the include files from"
- " this version of TQt.\"\n#error \"(The tqmoc has changed too"
- " much.)\"\n", TQT_VERSION_STR );
- fprintf( out, "#endif\n\n" );
- } else {
- fprintf( out, "\n\n" );
- }
-
- if ( !g->hasVariantIncluded ) {
- bool needToIncludeVariant = !g->props.isEmpty();
- for ( Function* f =g->tqslots.first(); f && !needToIncludeVariant; f=g->tqslots.next() )
- needToIncludeVariant = ( f->type != "void" && !validUType( f->type ) && isVariantType( f->type) );
-
- if ( needToIncludeVariant ) {
- fprintf( out, "#include <%stqvariant.h>\n", (const char*)g->qtPath );
- g->hasVariantIncluded = TRUE;
- }
- }
-
- bool isTQObject = g->className == "TQObject" ;
-
-
-//
-// Generate virtual function className()
-//
- fprintf( out, "const char *%s::className() const\n{\n ",
- (const char*)qualifiedClassName() );
- fprintf( out, "return \"%s\";\n}\n\n", (const char*)qualifiedClassName() );
-
-//
-// Generate static metaObj variable
-//
- fprintf( out, "TQMetaObject *%s::metaObj = 0;\n", (const char*)qualifiedClassName());
-
-//
-// Generate static cleanup object variable
-//
- TQCString cleanup = qualifiedClassName().copy();
- for ( int cnpos = 0; cnpos < cleanup.length(); cnpos++ ) {
- if ( cleanup[cnpos] == ':' )
- cleanup[cnpos] = '_';
- }
-
- fprintf( out, "static TQMetaObjectCleanUp cleanUp_%s( \"%s\", &%s::staticMetaObject );\n\n", (const char*)cleanup, (const char*)qualifiedClassName(), (const char*)qualifiedClassName() );
-
-//
-// Generate tr and trUtf8 member functions
-//
- fprintf( out, "#ifndef TQT_NO_TRANSLATION\n" );
- fprintf( out, "TQString %s::tr( const char *s, const char *c )\n{\n",
- (const char*)qualifiedClassName() );
- fprintf( out, " if ( tqApp )\n" );
- fprintf( out, "\treturn tqApp->translate( \"%s\", s, c,"
- " TQApplication::DefaultCodec );\n",
- (const char*)qualifiedClassName() );
- fprintf( out, " else\n" );
- fprintf( out, "\treturn TQString::tqfromLatin1( s );\n");
- fprintf( out, "}\n" );
- fprintf( out, "#ifndef TQT_NO_TRANSLATION_UTF8\n" );
- fprintf( out, "TQString %s::trUtf8( const char *s, const char *c )\n{\n",
- (const char*)qualifiedClassName() );
- fprintf( out, " if ( tqApp )\n" );
- fprintf( out, "\treturn tqApp->translate( \"%s\", s, c,"
- " TQApplication::UnicodeUTF8 );\n",
- (const char*)qualifiedClassName() );
- fprintf( out, " else\n" );
- fprintf( out, "\treturn TQString::fromUtf8( s );\n" );
- fprintf( out, "}\n" );
- fprintf( out, "#endif // TQT_NO_TRANSLATION_UTF8\n\n" );
- fprintf( out, "#endif // TQT_NO_TRANSLATION\n\n" );
-
-//
-// Generate staticMetaObject member function
-//
- fprintf( out, "TQMetaObject* %s::staticMetaObject()\n{\n", (const char*)qualifiedClassName() );
- fprintf( out, " if ( metaObj )\n\treturn metaObj;\n" );
- if ( isTQObject )
- fprintf( out, " TQMetaObject* parentObject = staticTQtMetaObject();\n" );
- else if ( !g->superClassName.isEmpty() )
- if (g->superClassName.find("TQ") == 0) { // [FIXME] Verify that this will always be able to detect a TQt base class, even if intermediate classes do not start with TQ
- fprintf( out, " TQMetaObject* parentObject = %s::staticMetaObject();\n", (const char*)g->superClassName );
- }
- else {
- fprintf( out, " TQMetaObject* parentObject = 0;\n" );
- }
- else
- fprintf( out, " TQMetaObject* parentObject = 0;\n" );
-
-//
-// Build the classinfo array
-//
- int n_infos = generateClassInfos();
-
-// Build the enums array
-// Enums HAVE to be generated BEFORE the properties and tqslots
-//
- int n_enums = generateEnums();
-
-//
-// Build tqslots array in staticMetaObject()
-//
- generateFuncs( &g->tqslots, "slot", Slot_Num );
-
-//
-// Build tqsignals array in staticMetaObject()
-//
- generateFuncs( &g->tqsignals, "signal", Signal_Num );
-
-//
-// Build property array in staticMetaObject()
-//
- int n_props = generateProps();
-
-//
-// Finally code to create and return meta object
-//
- fprintf( out, " metaObj = TQMetaObject::new_metaobject(\n"
- "\t\"%s\", parentObject,\n", (const char*)qualifiedClassName() );
-
- if ( g->tqslots.count() )
- fprintf( out, "\tslot_tbl, %d,\n", g->tqslots.count() );
- else
- fprintf( out, "\t0, 0,\n" );
-
- if ( g->tqsignals.count() )
- fprintf( out, "\tsignal_tbl, %d,\n", g->tqsignals.count() );
- else
- fprintf( out, "\t0, 0,\n" );
-
- fprintf( out, "#ifndef TQT_NO_PROPERTIES\n" );
- if ( n_props )
- fprintf( out, "\tprops_tbl, %d,\n", n_props );
- else
- fprintf( out, "\t0, 0,\n" );
- if ( n_enums )
- fprintf( out, "\tenum_tbl, %d,\n", n_enums );
- else
- fprintf( out, "\t0, 0,\n" );
- fprintf( out, "#endif // TQT_NO_PROPERTIES\n" );
-
- if ( n_infos )
- fprintf( out, "\tclassinfo_tbl, %d );\n", n_infos );
- else
- fprintf( out, "\t0, 0 );\n" );
-
-
-//
-// Setup cleanup handler and return meta object
-//
- fprintf( out, " cleanUp_%s.setMetaObject( metaObj );\n", cleanup.data() );
- fprintf( out, " return metaObj;\n}\n" );
-
-//
-// End of function staticMetaObject()
-//
-
-//
-// Generate smart cast function
-//
- fprintf( out, "\nvoid* %s::qt_cast( const char* clname )\n{\n",
- (const char*)qualifiedClassName() );
- fprintf( out, " if ( !qstrcmp( clname, \"%s\" ) )\n"
- "\treturn this;\n",
- (const char*)qualifiedClassName() );
- for ( const char* cname = g->multipleSuperClasses.first(); cname; cname = g->multipleSuperClasses.next() ) {
- fprintf( out, " if ( !qstrcmp( clname, \"%s\" ) )\n", cname);
- TQCString fixed(cname);
- while (fixed.find(">>") != -1)
- fixed = fixed.replace(">>", "> >");
- fprintf( out, "\treturn (%s*)this;\n", fixed.data());
- }
- if ( !g->superClassName.isEmpty() && !isTQObject )
- fprintf( out, " return %sqt_cast( clname );\n",
- (const char*)callablePurestSuperClassName() );
- else
- fprintf( out, " return 0;\n" );
- fprintf( out, "}\n" );
-
-//
-// Generate internal signal functions
-//
- Function *f;
- f = g->tqsignals.first(); // make internal signal methods
- static bool included_list_headers = FALSE;
- int sigindex = 0;
- while ( f ) {
- TQCString argstr;
- char buf[12];
- Argument *a = f->args->first();
- int offset = 0;
- const char *predef_call_func = 0;
- bool hasReturnValue = f->type != "void" && (validUType( f->type ) || isVariantType( f->type) );
- if ( hasReturnValue ) {
- ; // no predefined function available
- } else if ( !a ) {
- predef_call_func = "activate_signal";
- } else if ( f->args->count() == 1 ) {
- TQCString ctype = (a->leftType + ' ' + a->rightType).simplifyWhiteSpace();
- if ( !isInOut( ctype ) ) {
- TQCString utype = uType( ctype );
- if ( utype == "bool" )
- predef_call_func = "activate_signal_bool";
- else if ( utype == "TQString" || utype == "int" || utype == "double" )
- predef_call_func = "activate_signal";
- }
- }
-
- if ( !predef_call_func && !included_list_headers ) {
- // yes we need it, because otherwise TQT_VERSION may not be defined
- fprintf( out, "\n#include <%stqobjectdefs.h>\n", (const char*)g->qtPath );
- fprintf( out, "#include <%stqsignalslotimp.h>\n", (const char*)g->qtPath );
- included_list_headers = TRUE;
- }
-
- while ( a ) { // argument list
- if ( !a->leftType.isEmpty() || !a->rightType.isEmpty() ) {
- argstr += a->leftType;
- argstr += " ";
- sprintf( buf, "t%d", offset++ );
- argstr += buf;
- argstr += a->rightType;
- a = f->args->next();
- if ( a )
- argstr += ", ";
- } else {
- a = f->args->next();
- }
- }
-
- fixRightAngles( &argstr );
-
- fprintf( out, "\n// SIGNAL %s\n", (const char*)f->name );
- fprintf( out, "%s %s::%s(", (const char*) f->type,
- (const char*)qualifiedClassName(),
- (const char*)f->name );
-
- if ( argstr.isEmpty() )
- fprintf( out, ")\n{\n" );
- else
- fprintf( out, " %s )\n{\n", (const char*)argstr );
-
- if ( predef_call_func ) {
- fprintf( out, " %s%s( staticMetaObject()->signalOffset() + %d", (const char *) callablePurestSuperClassName(), predef_call_func, sigindex );
- if ( !argstr.isEmpty() )
- fprintf( out, ", t0" );
- fprintf( out, " );\n}\n" );
- } else {
- if ( hasReturnValue )
- fprintf( out, " %s something;\n", f->type.data() );
- int nargs = f->args->count();
- fprintf( out, " if ( tqsignalsBlocked() )\n\treturn%s;\n", hasReturnValue ? " something" : "" );
- fprintf( out, " TQConnectionList *clist = tqreceivers( staticMetaObject()->signalOffset() + %d );\n",
- sigindex );
- fprintf( out, " if ( !clist )\n\treturn%s;\n", hasReturnValue ? " something" : "" );
- fprintf( out, " TQUObject o[%d];\n", f->args->count() + 1 );
-
- // initialize return value to something
- if ( hasReturnValue ) {
- if ( validUType( f->type ) ) {
- TQCString utype = uType( f->type );
- fprintf( out, " static_TQUType_%s.set(o,something);\n", utype.data() );
- } else if ( uType( f->type ) == "varptr" ) {
- fprintf( out, " static_TQUType_varptr.set(o,&something);\n" );
- } else {
- fprintf( out, " static_TQUType_ptr.set(o,&something);\n" );
- }
- }
-
- // initialize arguments
- if ( !f->args->isEmpty() ) {
- offset = 0;
- Argument* a = f->args->first();
- while ( a ) {
- TQCString type = a->leftType + ' ' + a->rightType;
- type = type.simplifyWhiteSpace();
- if ( validUType( type ) ) {
- TQCString utype = uType( type );
- fprintf( out, " static_TQUType_%s.set(o+%d,t%d);\n", utype.data(), offset+1, offset );
- } else if ( uType( type ) == "varptr" ) {
- fprintf( out, " static_TQUType_varptr.set(o+%d,&t%d);\n", offset+1, offset );
- } else {
- fprintf( out, " static_TQUType_ptr.set(o+%d,&t%d);\n", offset+1, offset );
- }
- a = f->args->next();
- offset++;
- }
- }
- fprintf( out, " activate_signal( clist, o );\n" );
-
- // get return values from inOut parameters
- if ( !f->args->isEmpty() ) {
- offset = 0;
- Argument* a = f->args->first();
- while ( a ) {
- TQCString type = a->leftType + ' ' + a->rightType;
- type = type.simplifyWhiteSpace();
- if ( validUType( type ) && isInOut( type ) ) {
- TQCString utype = uType( type );
- if ( utype == "enum" )
- fprintf( out, " t%d = (%s)static_TQUType_%s.get(o+%d);\n", offset, type.data(), utype.data(), offset+1 );
- else if ( utype == "ptr" && type.right(2) == "**" )
- fprintf( out, " if (t%d) *t%d = *(%s)static_TQUType_ptr.get(o+%d);\n", offset, offset, type.data(), offset+1 );
- else
- fprintf( out, " t%d = static_TQUType_%s.get(o+%d);\n", offset, utype.data(), offset+1 );
- }
- a = f->args->next();
- offset++;
- }
- }
-
- // get and return return value
- if ( hasReturnValue ) {
- TQCString utype = uType( f->type );
- if ( utype == "enum" || utype == "ptr" || utype == "varptr" ) // need cast
- fprintf( out, " return (%s)static_TQUType_%s.get(o);\n", f->type.data(), utype.data() );
- else
- fprintf( out, " return static_TQUType_%s.get(o);\n", utype.data() );
- }
-
- fprintf( out, "}\n" );
- }
-
- f = g->tqsignals.next();
- sigindex++;
- }
-
-
-//
-// Generate internal qt_invoke() function
-//
- fprintf( out, "\nbool %s::qt_invoke( int _id, TQUObject* _o )\n{\n", qualifiedClassName().data() );
-
- if( !g->tqslots.isEmpty() ) {
- fprintf( out, " switch ( _id - staticMetaObject()->slotOffset() ) {\n" );
- int slotindex = -1;
- for ( f = g->tqslots.first(); f; f = g->tqslots.next() ) {
- slotindex ++;
- if ( f->type == "void" && f->args->isEmpty() ) {
- fprintf( out, " case %d: %s(); break;\n", slotindex, f->name.data() );
- continue;
- }
-
- fprintf( out, " case %d: ", slotindex );
- bool hasReturnValue = FALSE;
- bool hasVariantReturn = FALSE;
- if ( f->type != "void" ) {
- if ( validUType( f->type )) {
- hasReturnValue = TRUE;
- fprintf( out, "static_TQUType_%s.set(_o,", uType(f->type).data() );
- } else if ( isVariantType( f->type ) ) {
- hasReturnValue = hasVariantReturn = TRUE;
- // do not need special handling for bool since this is handled as utype
- fprintf( out, "static_TQUType_TQVariant.set(_o,TQVariant(" );
- }
- }
- int offset = 0;
- fprintf( out, "%s(", f->name.data() );
- Argument* a = f->args->first();
- while ( a ) {
- TQCString type = a->leftType + ' ' + a->rightType;
- type = type.simplifyWhiteSpace();
- fixRightAngles( &type );
- if ( validUType( type ) ) {
- TQCString utype = uType( type );
- if ( utype == "ptr" || utype == "varptr" || utype == "enum" )
- fprintf( out, "(%s)static_TQUType_%s.get(_o+%d)", type.data(), utype.data(), offset+1 );
- else
- fprintf( out, "(%s)static_TQUType_%s.get(_o+%d)", type.data(), utype.data(), offset+1 );
- } else {
- TQCString castType = castToUType( type );
- if(castType == type)
- fprintf( out, "(%s)(*((%s*)static_TQUType_ptr.get(_o+%d)))", type.data(),
- castType.data(), offset+1 );
- else
- fprintf( out, "(%s)*((%s*)static_TQUType_ptr.get(_o+%d))", type.data(),
- castType.data(), offset+1 );
- }
- a = f->args->next();
- if ( a )
- fprintf( out, "," );
- offset++;
- }
- fprintf( out, ")" );
- if ( hasReturnValue )
- fprintf( out, ")" );
- if ( hasVariantReturn )
- fprintf( out, ")" );
- fprintf( out, "; break;\n" );
- }
- fprintf( out, " default:\n" );
-
- if ( !g->superClassName.isEmpty() && !isTQObject ) {
- fprintf( out, "\treturn %sqt_invoke( _id, _o );\n",
- (const char *) callablePurestSuperClassName() );
- } else {
- fprintf( out, "\treturn FALSE;\n" );
- }
- fprintf( out, " }\n" );
- fprintf( out, " return TRUE;\n}\n" );
- } else {
- if ( !g->superClassName.isEmpty() && !isTQObject )
- fprintf( out, " return %sqt_invoke(_id,_o);\n}\n",
- (const char *) callablePurestSuperClassName() );
- else
- fprintf( out, " return FALSE;\n}\n" );
- }
-
-
-//
-// Generate internal qt_emit() function
-//
- fprintf( out, "\nbool %s::qt_emit( int _id, TQUObject* _o )\n{\n", qualifiedClassName().data() );
-
- if ( !g->tqsignals.isEmpty() ) {
- fprintf( out, " switch ( _id - staticMetaObject()->signalOffset() ) {\n" );
- int signalindex = -1;
- for ( f = g->tqsignals.first(); f; f = g->tqsignals.next() ) {
- signalindex++;
- if ( f->type == "void" && f->args->isEmpty() ) {
- fprintf( out, " case %d: %s(); break;\n", signalindex, f->name.data() );
- continue;
- }
-
- fprintf( out, " case %d: ", signalindex );
- bool hasReturnValue = FALSE;
- if ( f->type != "void" && validUType( f->type )) {
- hasReturnValue = TRUE;
- fprintf( out, "static_TQUType_%s.set(_o,", uType(f->type).data() );
- }
- int offset = 0;
- fprintf( out, "%s(", f->name.data() );
- Argument* a = f->args->first();
- while ( a ) {
- TQCString type = a->leftType + ' ' + a->rightType;
- type = type.simplifyWhiteSpace();
- fixRightAngles( &type );
- if ( validUType( type ) ) {
- TQCString utype = uType( type );
- if ( utype == "ptr" || utype == "varptr" || utype == "enum" )
- fprintf( out, "(%s)static_TQUType_%s.get(_o+%d)", type.data(), utype.data(), offset+1 );
- else
- fprintf( out, "(%s)static_TQUType_%s.get(_o+%d)", type.data(), utype.data(), offset+1 );
- } else {
- TQCString castType = castToUType( type );
- if(castType == type)
- fprintf( out, "(%s)(*((%s*)static_TQUType_ptr.get(_o+%d)))", type.data(),
- castType.data(), offset+1 );
- else
- fprintf( out, "(%s)*((%s*)static_TQUType_ptr.get(_o+%d))", type.data(),
- castType.data(), offset+1 );
- }
- a = f->args->next();
- if ( a )
- fprintf( out, "," );
- offset++;
- }
- fprintf( out, ")" );
- if ( hasReturnValue )
- fprintf( out, ")" );
- fprintf( out, "; break;\n" );
- }
- fprintf( out, " default:\n" );
- if ( !g->superClassName.isEmpty() && !isTQObject )
- fprintf( out, "\treturn %sqt_emit(_id,_o);\n",
- (const char *) callablePurestSuperClassName() );
- else
- fprintf( out, "\treturn FALSE;\n" );
- fprintf( out, " }\n" );
- fprintf( out, " return TRUE;\n}\n" );
- } else {
- if ( !g->superClassName.isEmpty() && !isTQObject )
- fprintf( out, " return %sqt_emit(_id,_o);\n}\n",
- (const char *) callablePurestSuperClassName() );
- else
- fprintf( out, " return FALSE;\n}\n" );
- }
-
-
- fprintf( out, "#ifndef TQT_NO_PROPERTIES\n" );
-//
-// Generate internal qt_property() functions
-//
-
- fprintf( out, "\nbool %s::qt_property( int id, int f, TQVariant* v)\n{\n", qualifiedClassName().data() );
-
- if ( !g->props.isEmpty() ) {
- fprintf( out, " switch ( id - staticMetaObject()->propertyOffset() ) {\n" );
- int propindex = -1;
- bool need_resolve = FALSE;
-
- for( TQPtrListIterator<Property> it( g->props ); it.current(); ++it ){
- propindex ++;
- fprintf( out, " case %d: ", propindex );
- fprintf( out, "switch( f ) {\n" );
-
- uint flag_break = 0;
- uint flag_propagate = 0;
-
- if ( it.current()->setfunc ) {
- fprintf( out, "\tcase 0: %s(", it.current()->setfunc->name.data() );
- TQCString type = it.current()->type.copy(); // detach on purpose
- if ( it.current()->oredEnum )
- type = it.current()->enumsettype;
- if ( type == "uint" )
- fprintf( out, "v->asUInt()" );
- else if ( type == "unsigned int" )
- fprintf( out, "(uint)v->asUInt()" );
- else if ( type == "TQMap<TQString,TQVariant>" )
- fprintf( out, "v->asMap()" );
- else if ( type == "TQValueList<TQVariant>" )
- fprintf( out, "v->asList()" );
- else if ( type == "TQ_LLONG" )
- fprintf( out, "v->asLongLong()" );
- else if ( type == "TQ_ULLONG" )
- fprintf( out, "v->asULongLong()" );
- else if ( isVariantType( type ) ) {
- if (( type[0] == 'T' ) && ( type[1] == 'Q' ))
- type = type.mid(2);
- else
- type[0] = toupper( type[0] );
- fprintf( out, "v->as%s()", type.data() );
- } else {
- fprintf( out, "(%s&)v->asInt()", type.data() );
- }
- fprintf( out, "); break;\n" );
-
- } else if ( it.current()->override ) {
- flag_propagate |= 1 << (0+1);
- }
- if ( it.current()->getfunc ) {
- if ( it.current()->gspec == Property::Pointer )
- fprintf( out, "\tcase 1: if ( this->%s() ) *v = TQVariant( %s*%s()%s ); break;\n",
- it.current()->getfunc->name.data(),
- !isVariantType( it.current()->type ) ? "(int)" : "",
- it.current()->getfunc->name.data(),
- it.current()->type == "bool" ? ", 0" : "" );
- else
- fprintf( out, "\tcase 1: *v = TQVariant( %sthis->%s()%s ); break;\n",
- !isVariantType( it.current()->type ) ? "(int)" : "",
- it.current()->getfunc->name.data(),
- it.current()->type == "bool" ? ", 0" : "" );
- } else if ( it.current()->override ) {
- flag_propagate |= 1<< (1+1);
- }
-
- if ( !it.current()->reset.isEmpty() )
- fprintf( out, "\tcase 2: this->%s(); break;\n", it.current()->reset.data() );
-
- if ( it.current()->designable.isEmpty() )
- flag_propagate |= 1 << (3+1);
- else if ( it.current()->designable == "true" )
- flag_break |= 1 << (3+1);
- else if ( it.current()->designable != "false" )
- fprintf( out, "\tcase 3: return this->%s();\n", it.current()->designable.data() );
-
- if ( it.current()->scriptable.isEmpty() )
- flag_propagate |= 1 << (4+1);
- else if ( it.current()->scriptable == "true" )
- flag_break |= 1 << (4+1);
- else if ( it.current()->scriptable != "false" )
- fprintf( out, "\tcase 4: return this->%s();\n", it.current()->scriptable.data() );
-
- if ( it.current()->stored.isEmpty() )
- flag_propagate |= 1 << (5+1);
- else if ( it.current()->stored == "true" )
- flag_break |= 1 << (5+1);
- else if ( it.current()->stored != "false" )
- fprintf( out, "\tcase 5: return this->%s();\n", it.current()->stored.data() );
-
- int i = 0;
- if ( flag_propagate != 0 ) {
- fprintf( out, "\t" );
- for ( i = 0; i <= 5; i++ ) {
- if ( flag_propagate & (1 << (i+1) ) )
- fprintf( out, "case %d: ", i );
- }
- if (!g->superClassName.isEmpty() && !isTQObject ) {
- fprintf( out, "goto resolve;\n" );
- need_resolve = TRUE;
- } else {
- fprintf( out, " return FALSE;\n" );
- }
- }
- if ( flag_break != 0 ) {
- fprintf( out, "\t" );
- for ( i = 0; i <= 5; i++ ) {
- if ( flag_break & (1 << (i+1) ) )
- fprintf( out, "case %d: ", i );
- }
- fprintf( out, "break;\n");
- }
-
- fprintf( out, "\tdefault: return FALSE;\n } break;\n" );
- }
- fprintf( out, " default:\n" );
- if ( !g->superClassName.isEmpty() && !isTQObject )
- fprintf( out, "\treturn %sqt_property( id, f, v );\n",
- (const char *) callablePurestSuperClassName() );
- else
- fprintf( out, "\treturn FALSE;\n" );
- fprintf( out, " }\n" );
- fprintf( out, " return TRUE;\n" );
-
- if ( need_resolve )
- fprintf( out, "resolve:\n return %sqt_property( staticMetaObject()->resolveProperty(id), f, v );\n",
- (const char *) callablePurestSuperClassName() );
- fprintf( out, "}\n" );
- } else {
- if ( !g->superClassName.isEmpty() && !isTQObject )
- fprintf( out, " return %sqt_property( id, f, v);\n}\n",
- (const char *) callablePurestSuperClassName() );
- else
- fprintf( out, " return FALSE;\n}\n" );
- }
-
- fprintf( out, "\nbool %s::qt_static_property( TQObject* , int , int , TQVariant* ){ return FALSE; }\n", qualifiedClassName().data() );
- fprintf( out, "#endif // TQT_NO_PROPERTIES\n" );
-}
-
-
-ArgList *addArg( Argument *a ) // add argument to list
-{
- if ( (!a->leftType.isEmpty() || !a->rightType.isEmpty() ) ) //filter out truely void arguments
- tmpArgList->append( a );
- return tmpArgList;
-}
-
-void addEnum()
-{
- // Avoid duplicates
- for( TQPtrListIterator<Enum> lit( g->enums ); lit.current(); ++lit ) {
- if ( lit.current()->name == tmpEnum->name )
- {
- if ( displayWarnings )
- tqmoc_err( "Enum %s defined twice.", (const char*)tmpEnum->name );
- }
- }
-
- // Only look at types mentioned in TQ_ENUMS and TQ_SETS
- if ( g->qtEnums.contains( tmpEnum->name ) || g->qtSets.contains( tmpEnum->name ) )
- {
- g->enums.append( tmpEnum );
- if ( g->qtSets.contains( tmpEnum->name ) )
- tmpEnum->set = TRUE;
- else
- tmpEnum->set = FALSE;
- }
- else
- delete tmpEnum;
- tmpEnum = new Enum;
-}
-
-void addMember( Member m )
-{
- if ( skipFunc ) {
- tmpFunc->args = tmpArgList; // just to be sure
- delete tmpFunc;
- tmpArgList = new ArgList; // ugly but works
- tmpFunc = new Function;
- skipFunc = FALSE;
- return;
- }
-
- tmpFunc->type = tmpFunc->type.simplifyWhiteSpace();
- tmpFunc->access = tmpAccess;
- tmpFunc->args = tmpArgList;
- tmpFunc->lineNo = lineNo;
-
- for ( ;; ) {
- g->funcs.append( tmpFunc );
-
- if ( m == SignalMember ) {
- g->tqsignals.append( tmpFunc );
- break;
- } else {
- if ( m == SlotMember )
- g->tqslots.append( tmpFunc );
- // PropertyCandidateMember or SlotMember
- if ( !tmpFunc->name.isEmpty() && tmpFunc->access == Public )
- g->propfuncs.append( tmpFunc );
- if ( !tmpFunc->args || !tmpFunc->args->hasDefaultArguments() )
- break;
- tmpFunc = new Function( *tmpFunc );
- tmpFunc->args = tmpFunc->args->magicClone();
- }
- }
-
- skipFunc = FALSE;
- tmpFunc = new Function;
- tmpArgList = new ArgList;
-}
-
-void checkPropertyName( const char* ident )
-{
- if ( ident[0] == '_' ) {
- tqmoc_err( "Invalid property name '%s'.", ident );
- return;
- }
-}