Skip Menu |

This queue is for tickets about the QtCore CPAN distribution.

Report information
The Basics
Id: 50582
Status: open
Worked: 40 min
Priority: 0/
Queue: QtCore

People
Owner: Nobody in particular
Requestors: muenalan [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: Critical
Broken in: (no value)
Fixed in: (no value)



Subject: ubuntu 9.04 - fails build with qt deb packages qt4.5.0 (‘void XS_Qt__QAbstractFileEngine_extension(PerlInterpreter*, CV*)’)
Even when fixed known typo in Makefile.PL, still fails on qt4.5, see log below. Guess: Likely the autogenerated XS fails due to new symbols introduced into qt. Maintainer might update these. <STEPS> $ sudo cpan cpan $ install QtCore cpan $ look QtCore <THEN> As mentioned in the qt-apps.org forum root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# diff Makefile.PL Makefile.PL~ 31c31 < $QtCore_path = $args{-qc}; --- Show quoted text
> $QtCore_path = $arcs{-qc};
<THEN> $ perl Makefile.PL -i /usr/include/qt4/ -qc /usr/include/qt4/QtCore/ a) MANIFEST is not uptodate. [likely minor] [.. see below for details ] Checking if your kit is complete... Warning: the following files are missing in your kit: examples/App2/ lib/Qt/ b) Compilation fails: [.. see below for details ] QAbstractFileEngine.c QAbstractFileEngine.xs: In function ‘void XS_Qt__QAbstractFileEngine_extension(PerlInterpreter*, CV*)’: QAbstractFileEngine.xs:253: error: ‘ExtensionOption’ was not declared in this scope {COMMENTS} Likely new symbols in qt4.5 !? For instance, ExtensionOption seems new to be new class: http://doc.trolltech.com/4.5/qwebpluginfactory-extensionoption.html Cheers, muenalan [LOG] root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# perl Makefile.PL -i /usr/include/qt4/ -qc /usr/include/qt4/QtCore/ /usr/include/qt4/QtCore/ ===================================================================== found: 4 5 0 found Qt ver = 4 5 == QGlobal == ??? td: 'typedef QIntForType<void *>::Type qptrdiff;' = QSysInfo = enum ??? 'enum Sizes { WordSize = (sizeof(void *)<<3) };' = QBool = ???? 'operator void *()' ???? '{ return b ? static_cast<void *>(this) : static_cast<void *>(0); }' = QFlag = = QIncompatibleFlag = ??? td: 'typedef void **Zero;' ??? td: 'typedef Enum enum_type;' == QPoint == = QPoint = = QPointF = == QLine == = QLine = = QLineF = == QSize == = QSize = = QSizeF = == QRect == = QRect = = QRectF = == QMutex == = QMutex = = QMutexLocker = ???? '}' == QWaitCondition == = QWaitCondition = == QReadWriteLock == = QReadWriteLock = = QReadLocker = = QWriteLocker = == QSemaphore == = QSemaphore = == QBasicTimer == = QBasicTimer = == QChar == = QLatin1Char = = QChar = == QByteArray == = QByteArray = ??? td: 'typedef Data * DataPtr;' = QByteRef = == QBitArray == = QBitArray = ??? td: 'typedef QByteArray::DataPtr DataPtr;' !!! unknown output type 'DataPtr' = QBitRef = == QString == = QString = ???? ';' ???? ';' search type SectionFlags in QString search type SectionFlags in QString search type SectionFlags in QString search type SplitBehavior in QString search type SplitBehavior in QString search type SplitBehavior in QString search type NormalizationForm in QString search type NormalizationForm in QString ??? td: 'typedef Data * DataPtr;' = QLatin1String = = QCharRef = = QStringRef = == QStringList == = QStringList = == QLocale == = QSystemLocale = = QLocale = = QLocale::Data = ???? '}' ???? ';' ???? 'QT_END_NAMESPACE' ???? 'QT_END_HEADER' == QTextCodec == = QTextCodec = = QTextCodec::ConverterState = = QTextEncoder = = QTextDecoder = == QStringMatcher == = QStringMatcher = == QRegExp == = QRegExp = == QResource == = QResource = == QUrl == = QUrl = ??? td: 'typedef QUrlPrivate * DataPtr;' !!! unknown type '' !!! unknown output type 'QList<QPair<QString, QString> >' !!! unknown type '' !!! unknown output type 'QList<QPair<QByteArray, QByteArray> >' !!! unknown output type 'DataPtr' == QUuid == = QUuid = == QEvent == = QEvent = = QTimerEvent = = QChildEvent = = QDynamicPropertyChangeEvent = == QDateTime == = QDate = = QTime = = QDateTime = == QLibraryInfo == = QLibraryInfo = == QObject == = QObject = ??? 'QMetaObject staticQtMetaObject;' => 'QMetaObject' 'staticQtMetaObject', curr_class QObject, base QObject !!! unknown output type 'Q_INVOKABLE' = QObjectUserData = == QObjectCleanupHandler == = QObjectCleanupHandler = == QLibrary == = QLibrary = == QPluginLoader == = QPluginLoader = == QTimeLine == = QTimeLine = == QTimer == = QTimer = == QEventLoop == = QEventLoop = == QThread == = QThread = == QCoreApplication == = QCoreApplication = == QSignalMapper == = QSignalMapper = == QSocketNotifier == = QSocketNotifier = == QIODevice == = QIODevice = == QFile == = QFile = == QFileInfo == = QFileInfo = == QDir == = QDir = == QAbstractFileEngine == = QAbstractFileEngine = ??? 'class ExtensionOption;' => 'class' 'ExtensionOption', curr_class QAbstractFileEngine, base QAbstractFileEngine ??? 'class ExtensionReturn;' => 'class' 'ExtensionReturn', curr_class QAbstractFileEngine, base QAbstractFileEngine = QAbstractFileEngine::MapExtensionOption = = QAbstractFileEngine::MapExtensionReturn = = QAbstractFileEngine::UnMapExtensionOption = == QFSFileEngine == = QFSFileEngine = == QFileSystemWatcher == = QFileSystemWatcher = == QTemporaryFile == = QTemporaryFile = == QBuffer == = QBuffer = == QProcess == = QProcess = == QTextStream == = QTextStream = ??? td: 'typedef QTextStream & (*QTextStreamFunction)(QTextStream &);' = QTextStreamManipulator = == QDataStream == = QDataStream = == QMetaType == = QMetaType = == QTranslator == = QTranslator = == QVariant == = QVariant = = QVariant::PrivateShared = ??? 'QAtomicInt ref;' => 'QAtomicInt' 'ref', curr_class QVariant::PrivateShared, base QVariant = QVariant::Private = = QVariant::Handler = ??? 'Private d;' => 'Private' 'd', curr_class QVariant, base QVariant::Private ??? 'Handler *handler;' => 'Handler' '*handler', curr_class QVariant, base QVariant::Private ??? td: 'typedef Private DataPtr;' !!! unknown output type 'DataPtr' = QVariantComparisonHelper = == QAbstractItemModel == = QModelIndex = = QPersistentModelIndex = = QAbstractItemModel = = QAbstractTableModel = = QAbstractListModel = == QMimeData == = QMimeData = == QSettings == = QSettings = Checking if your kit is complete... Warning: the following files are missing in your kit: examples/App2/ lib/Qt/ Please inform the author. WARNING: Setting ABSTRACT via file 'lib/QtCore.pm' failed at /usr/local/share/perl/5.10.0/ExtUtils/MakeMaker.pm line 583 Writing Makefile for QtCore root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# make cp lib/Qt/QCoreApplication.pm blib/lib/Qt/QCoreApplication.pm cp lib/Qt/QGlobal.pm blib/lib/Qt/QGlobal.pm cp lib/Qt/QPluginLoader.pm blib/lib/Qt/QPluginLoader.pm cp lib/Qt/QMetaType.pm blib/lib/Qt/QMetaType.pm cp lib/Qt/QTextStream.pm blib/lib/Qt/QTextStream.pm cp lib/Qt/QSemaphore.pm blib/lib/Qt/QSemaphore.pm cp lib/Qt/QObject.pm blib/lib/Qt/QObject.pm cp lib/Qt/QObjectCleanupHandler.pm blib/lib/Qt/QObjectCleanupHandler.pm cp lib/Qt/QBasicTimer.pm blib/lib/Qt/QBasicTimer.pm cp lib/Qt/QUrl.pm blib/lib/Qt/QUrl.pm cp lib/Qt/QStringList.pm blib/lib/Qt/QStringList.pm cp lib/Qt/QFile.pm blib/lib/Qt/QFile.pm cp lib/Qt/QSocketNotifier.pm blib/lib/Qt/QSocketNotifier.pm cp lib/Qt/QReadWriteLock.pm blib/lib/Qt/QReadWriteLock.pm cp lib/Qt.pm blib/lib/Qt.pm cp lib/Qt/QEvent.pm blib/lib/Qt/QEvent.pm cp lib/Qt/QTimeLine.pm blib/lib/Qt/QTimeLine.pm cp lib/Qt/QDateTime.pm blib/lib/Qt/QDateTime.pm cp lib/Qt/QSettings.pm blib/lib/Qt/QSettings.pm cp lib/Qt/QFSFileEngine.pm blib/lib/Qt/QFSFileEngine.pm cp lib/Qt/QUuid.pm blib/lib/Qt/QUuid.pm cp lib/Qt/QDataStream.pm blib/lib/Qt/QDataStream.pm cp lib/Qt/QTimer.pm blib/lib/Qt/QTimer.pm cp lib/Qt/QMimeData.pm blib/lib/Qt/QMimeData.pm cp lib/Qt/QAbstractFileEngine.pm blib/lib/Qt/QAbstractFileEngine.pm cp lib/Qt/QIODevice.pm blib/lib/Qt/QIODevice.pm cp lib/Qt/QSignalMapper.pm blib/lib/Qt/QSignalMapper.pm cp lib/Qt/QProcess.pm blib/lib/Qt/QProcess.pm cp lib/Qt/QFileSystemWatcher.pm blib/lib/Qt/QFileSystemWatcher.pm cp lib/Qt/QRect.pm blib/lib/Qt/QRect.pm cp lib/Qt/QRegExp.pm blib/lib/Qt/QRegExp.pm cp lib/Qt/QFileInfo.pm blib/lib/Qt/QFileInfo.pm cp lib/Qt/QAbstractItemModel.pm blib/lib/Qt/QAbstractItemModel.pm cp lib/Qt/QTranslator.pm blib/lib/Qt/QTranslator.pm cp lib/QtCore.pm blib/lib/QtCore.pm cp lib/Qt/QLocale.pm blib/lib/Qt/QLocale.pm cp lib/Qt/QLine.pm blib/lib/Qt/QLine.pm cp lib/Qt/QDir.pm blib/lib/Qt/QDir.pm cp lib/Qt/QTextCodec.pm blib/lib/Qt/QTextCodec.pm cp lib/Qt/QTemporaryFile.pm blib/lib/Qt/QTemporaryFile.pm cp lib/Qt/QResource.pm blib/lib/Qt/QResource.pm cp lib/Qt/QPoint.pm blib/lib/Qt/QPoint.pm cp lib/Qt/QThread.pm blib/lib/Qt/QThread.pm cp lib/Qt/QStringMatcher.pm blib/lib/Qt/QStringMatcher.pm cp lib/Qt/QBuffer.pm blib/lib/Qt/QBuffer.pm cp lib/Qt/QByteArray.pm blib/lib/Qt/QByteArray.pm cp lib/Qt/QEventLoop.pm blib/lib/Qt/QEventLoop.pm cp lib/Qt/QVariant.pm blib/lib/Qt/QVariant.pm cp lib/Qt/QMutex.pm blib/lib/Qt/QMutex.pm cp lib/Qt/QChar.pm blib/lib/Qt/QChar.pm cp lib/Qt/QSize.pm blib/lib/Qt/QSize.pm cp lib/Qt/QWaitCondition.pm blib/lib/Qt/QWaitCondition.pm cp lib/Qt/QLibraryInfo.pm blib/lib/Qt/QLibraryInfo.pm cp lib/Qt/QString.pm blib/lib/Qt/QString.pm cp lib/Qt/QLibrary.pm blib/lib/Qt/QLibrary.pm cp lib/Qt/QBitArray.pm blib/lib/Qt/QBitArray.pm /usr/bin/perl /usr/share/perl/5.10/ExtUtils/xsubpp -C++ -typemap /usr/share/perl/5.10/ExtUtils/typemap -typemap perlobject.map -typemap typemap QAbstractFileEngine.xs > QAbstractFileEngine.xsc && mv QAbstractFileEngine.xsc QAbstractFileEngine.c g++ -c -I/usr/include/qt4/ -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g -DVERSION=\"4.004\" -DXS_VERSION=\"4.004\" -fPIC "-I/usr/lib/perl/5.10/CORE" QAbstractFileEngine.c QAbstractFileEngine.xs: In function ‘void XS_Qt__QAbstractFileEngine_extension(PerlInterpreter*, CV*)’: QAbstractFileEngine.xs:253: error: ‘ExtensionOption’ was not declared in this scope QAbstractFileEngine.xs:253: error: ‘option’ was not declared in this scope QAbstractFileEngine.xs:255: error: expected primary-expression before ‘)’ token QAbstractFileEngine.xs:264: error: ‘ExtensionOption’ was not declared in this scope QAbstractFileEngine.xs:264: error: ‘option’ was not declared in this scope QAbstractFileEngine.xs:265: error: ‘ExtensionReturn’ was not declared in this scope QAbstractFileEngine.xs:265: error: ‘output’ was not declared in this scope QAbstractFileEngine.xs:267: error: expected primary-expression before ‘)’ token QAbstractFileEngine.xs:270: error: expected primary-expression before ‘)’ token QAbstractFileEngine.c: In function ‘void boot_Qt__QAbstractFileEngine(PerlInterpreter*, CV*)’: QAbstractFileEngine.c:1209: warning: deprecated conversion from string constant to ‘char*’ make: *** [QAbstractFileEngine.o] Error 1
Subject: [WORKARROUND, DEFUNCT] Couple of api changes stripped; WAS: ubuntu 9.04 - fails build with qt deb packages qt4.5.0 (‘void XS_Qt__QAbstractFileEngine_extension(PerlInterpreter*, CV*)’)
Hey, Not really much to do. One can get this running: three issue's needed to be fixed. See below to get compiled, but without preserving its function for anything that uses somehow QMutex or QThread. Sorry, but just made dumb strip-off's to see how much would be needed): See: root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# ls *~ Makefile.PL~ QAbstractFileEngine.xs~ QFSFileEngine.xs~ QMutex.xs~ QThread.xs~ (1) Stripped functions using "ExtensionOption" class from QAbstractFileEngine.xs QFSFileEngine.xs (2) QMutex.xs: QMutexLocker() constructor no longer available, use QMutexLocker( Mutex *). Likely again an qt4.5 api change: See: http://doc.trolltech.com/4.5/qmutexlocker.html (3) QThread.xs: stripped complains about private methods. XS class decleration superficially looks right, but still subtle declaration flaws may be present. * XS's "THIS" macro repeatedly error'd as beeing unknown (likely secondary gcc complain because upstream code is not legible for compiler) Please review and fix: needs minor qt knowledge and minor XS knowledge. Anybody ? Lets go, muenalan <STEP> Stripped error'd function: *::extension(...) from files: QAbstractFileEngine.xs (see below) QFSFileEngine.xs <Example: After manual strip-off> root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# diff QAbstractFileEngine.xs QAbstractFileEngine.xs~ 240a241,280 Show quoted text
> bool > QAbstractFileEngine::extension(...) > CASE: items == 2 && SvIOK(ST(1)) > PREINIT: > QAbstractFileEngine::Extension extension =
(QAbstractFileEngine::Extension)SvIV(ST(1)); Show quoted text
> CODE: > RETVAL = THIS->extension( extension ); > OUTPUT: > RETVAL > CASE: items == 3 && SvIOK(ST(1)) &&
sv_derived_from(ST(2),"Qt::ExtensionOption") && (SvTYPE(SvRV(ST(2))) == SVt_PVHV) Show quoted text
> PREINIT: > QAbstractFileEngine::Extension extension =
(QAbstractFileEngine::Extension)SvIV(ST(1)); Show quoted text
> ExtensionOption *option /* = 0 */ ; > CODE: > option = INT2PTR(ExtensionOption*, pobj2class(ST(2),
"ExtensionOption", "Qt::QAbstractFileEngine::extension", "option")); Show quoted text
> if ( option == NULL ) > XSRETURN_UNDEF; > RETVAL = THIS->extension( extension, option ); > OUTPUT: > RETVAL > CASE: items == 4 && SvIOK(ST(1)) &&
sv_derived_from(ST(2),"Qt::ExtensionOption") && (SvTYPE(SvRV(ST(2))) == SVt_PVHV) && sv_derived_from(ST(3),"Qt::ExtensionReturn") && (SvTYPE(SvRV(ST(3))) == SVt_PVHV) Show quoted text
> PREINIT: > QAbstractFileEngine::Extension extension =
(QAbstractFileEngine::Extension)SvIV(ST(1)); Show quoted text
> ExtensionOption *option /* = 0 */ ; > ExtensionReturn *output /* = 0 */ ; > CODE: > option = INT2PTR(ExtensionOption*, pobj2class(ST(2),
"ExtensionOption", "Qt::QAbstractFileEngine::extension", "option")); Show quoted text
> if ( option == NULL ) > XSRETURN_UNDEF; > output = INT2PTR(ExtensionReturn*, pobj2class(ST(3),
"ExtensionReturn", "Qt::QAbstractFileEngine::extension", "output")); Show quoted text
> if ( output == NULL ) > XSRETURN_UNDEF; > RETVAL = THIS->extension( extension, option, output ); > OUTPUT: > RETVAL > CASE: > CODE: > warn( "Qt::QAbstractFileEngine::extension() -- Error in
parameters" ); Show quoted text
> XSRETURN_UNDEF; >
<THEN> Again, another likely qt4.5 api change: QMutex.xs:111: error: no matching function for call to ‘QMutexLocker::QMutexLocker()’ {Such as} Then compilation proceedes significantly up to new stop after a couple of files: /usr/bin/perl /usr/share/perl/5.10/ExtUtils/xsubpp -C++ -typemap /usr/share/perl/5.10/ExtUtils/typemap -typemap perlobject.map -typemap typemap QMutex.xs > QMutex.xsc && mv QMutex.xsc QMutex.c g++ -c -I/usr/include/qt4/ -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g -DVERSION=\"4.004\" -DXS_VERSION=\"4.004\" -fPIC "-I/usr/lib/perl/5.10/CORE" QMutex.c QMutex.xs: In function ‘void XS_Qt__QMutexLocker_relock(PerlInterpreter*, CV*)’: QMutex.xs:111: error: no matching function for call to ‘QMutexLocker::QMutexLocker()’ /usr/include/qt4/QtCore/qmutex.h:141: note: candidates are: QMutexLocker::QMutexLocker(const QMutexLocker&) /usr/include/qt4/QtCore/qmutex.h:97: note: QMutexLocker::QMutexLocker(QMutex*) QMutex.xs:117: error: ‘THIS’ was not declared in this scope QMutex.c: In function ‘void boot_Qt__QMutex(PerlInterpreter*, CV*)’: QMutex.c:364: warning: deprecated conversion from string constant to ‘char*’ <MODIFIED QMutex.xs> SV * relock(...) CASE: items == 0 CODE: QMutexLocker * out_data; #MUE: CHANGED "new QMutexLocker( )" to "new QMutexLocker( new QMutex )" out_data = new QMutexLocker( new QMutex ); RETVAL = class2pobj(PTR2IV(out_data), "Qt::QMutexLocker", 1); OUTPUT: RETVAL CASE: items == 1 CODE: #MUE: COMPLAINED ABOUT NON-DEFINED THIS, SO STRIPPED ;) //THIS->relock( ); XSRETURN_UNDEF; CASE: CODE: warn( "Qt::QMutexLocker::relock() -- Error in parameters" ); XSRETURN_UNDEF; <STEP> root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# diff QThread.xs QThread.xs~ 330c330 < //QThread::sleep( data0 ); --- Show quoted text
> QThread::sleep( data0 );
336c336 < //QThread::msleep( data0 ); --- Show quoted text
> QThread::msleep( data0 );
342c342 < //QThread::usleep( data0 ); --- Show quoted text
> QThread::usleep( data0 );
Subject: [TESTED] ok for QtCore pod synopsis.
"WORKING" Workarround: tested QtCore pod synopsis. Ok, muenalan root@quicksilver:~/.cpan/build/QtCore-4.004-TOJY4B# perl -Mblib=lib use Qt; use Qt::QTimer; use Qt::QCoreApplication; my $app = QCoreApplication(\@ARGV); my $timer = QTimer(); print "app = $app, timer = $timer\n"; $app->connect($timer, SIGNAL('timeout()'), $app, SLOT('quit()')); $timer->start(2000); print "start (wait 2 seconds) ...\n"; $app->exec(); print "quit -- OK\n"; print "\nok\n"; app = Qt::QCoreApplication=HASH(0x22de600), timer = Qt::QTimer=HASH(0x24dff50) start (wait 2 seconds) ... quit -- OK ok
Thank for Your letter. I not tested this module with Qt4.4 and Qt4.5. And I think do it then I have free time.
Subject: Re: [rt.cpan.org #50582] ubuntu 9.04 - fails build with qt deb packages qt4.5.0 (‘void XS_Qt__QAbstractFileEng"ine_extension(PerlInterpreter*, CV*)’)"
Date: Sun, 18 Oct 2009 15:01:33 +0200
To: bug-QtCore [...] rt.cpan.org
From: "M. Uenalan" <murat.uenalan [...] googlemail.com>
Cool, But did you ever thought of using: http://qt.gitorious.org/qt-labs/qtscriptgenerator/trees/master/generator instead of your modules approach ? You mentioned something in your TODO list about getting qtgl etc running, but with this it should be easier. It might be easy to get *all* qt packages binding for perl with this... PS: Why you made the QtCore etc ? You work with Qt often ? Just curious. Thx, Murat 2009/10/18 Vadim Likhota (Vadim Likhota) via RT <bug-QtCore@rt.cpan.org>: Show quoted text
> <URL: https://rt.cpan.org/Ticket/Display.html?id=50582 > > > Thank for Your letter. > > I not tested this module with Qt4.4 and Qt4.5. > > And I think do it then I have free time. >
Вск. Окт. 18 09:02:05 2009, murat.uenalan@googlemail.com писал: Show quoted text
> But did you ever thought of using: >
http://qt.gitorious.org/qt-labs/qtscriptgenerator/trees/master/generator Show quoted text
> instead of your modules approach ?
I want very small binding. Show quoted text
> You mentioned something in your TODO list about getting qtgl etc > running, but with this it should be easier. > It might be easy to get *all* qt packages binding for perl with
this... Show quoted text
> > PS: Why you made the QtCore etc ? You work with Qt often ? Just
curious. I writed program separately on C++ using Qt4 and separately on Perl. For internal corporative programs interpreter is better then compiler.
Subject: Re: [rt.cpan.org #50582] ubuntu 9.04 - fails build with qt deb packages qt4.5.0 (‘void XS_Qt__QAbstractFileEng"ine_extension(PerlInterpreter*, CV*)’)"
Date: Sun, 18 Oct 2009 22:01:47 +0200
To: bug-QtCore [...] rt.cpan.org
From: "M. Uenalan" <murat.uenalan [...] googlemail.com>
Show quoted text
> I want very small binding.
It is also small. The qtscript generator actually has solved this by selecting at runtime which plugins/shared objects/qt modules you want. Just say use qtcore.so, qtgui.so, qtweb.so and go etc. It is fast and modular. Just a suggestion. Consider: paid people maintain it at trolltech/nokia now because the qtscript/ecma interpreter depends on it. Show quoted text
> I writed program separately on C++ using Qt4 and separately on Perl. > For internal corporative programs interpreter is better then compiler.
Its really impressive how much more productive it is with perl ! I use it now and its just impressive (except the stupid workarround bugs). Thanks again for you great work ! Murat