From: <sv...@va...> - 2010-03-11 13:52:49
|
Author: cerion Date: 2010-03-11 13:52:33 +0000 (Thu, 11 Mar 2010) New Revision: 489 Log: reimplemented a bunch of internal tests: - option tests - file/dir tests Modified: branches/valkyrie_qt4port/mainwindow.cpp branches/valkyrie_qt4port/objects/memcheck_object.cpp branches/valkyrie_qt4port/options/vk_option.cpp branches/valkyrie_qt4port/options/vk_option.h branches/valkyrie_qt4port/toolview/memcheckview.cpp branches/valkyrie_qt4port/toolview/memcheckview.h branches/valkyrie_qt4port/utils/vk_utils.cpp branches/valkyrie_qt4port/utils/vk_utils.h Modified: branches/valkyrie_qt4port/mainwindow.cpp =================================================================== --- branches/valkyrie_qt4port/mainwindow.cpp 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/mainwindow.cpp 2010-03-11 13:52:33 UTC (rev 489) @@ -890,7 +890,7 @@ if ( runState == VkRunState::VALGRIND ) { int errval = PARSED_OK; QString bin = vkConfig->rdEntry( "binary", "valkyrie" ); - binaryCheck( &errval, bin ); + fileCheck( &errval, bin, false, false, true ); if ( errval != PARSED_OK ) { vkError( this, "Run Tool", "Invalid Binary: Please set a valid binary in Options::Valkyrie." ); Modified: branches/valkyrie_qt4port/objects/memcheck_object.cpp =================================================================== --- branches/valkyrie_qt4port/objects/memcheck_object.cpp 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/objects/memcheck_object.cpp 2010-03-11 13:52:33 UTC (rev 489) @@ -236,32 +236,32 @@ /* check argval for this option, updating if necessary. called by parseCmdArgs() and gui option pages -------------------- */ -int Memcheck::checkOptArg( int optid, QString& )//argval ) +int Memcheck::checkOptArg( int optid, QString& argval ) { vk_assert( optid >= 0 && optid < MEMCHECK::NUM_OPTS ); int errval = PARSED_OK; -#if 0 - Option* opt = findOption( optid ); + + VkOption* opt = getOption( optid ); - switch (( Memcheck::mcOpts )optid ) { - case PARTIAL: - case FREELIST: - case LEAK_RES: - case SHOW_REACH: - //case UNDEF_VAL: - case TRACK_ORI: - case GCC_296: - case ALIGNMENT: + switch ( (MEMCHECK::mcOptId)optid ) { + case MEMCHECK::PARTIAL: + case MEMCHECK::FREELIST: + case MEMCHECK::LEAK_RES: + case MEMCHECK::SHOW_REACH: + //case MEMCHECK::UNDEF_VAL: + case MEMCHECK::TRACK_ORI: + case MEMCHECK::GCC_296: + case MEMCHECK::ALIGNMENT: opt->isValidArg( &errval, argval ); break; - /* when using xml output from valgrind, this option is preset to - 'full' by valgrind, so this option should not be used. */ - case LEAK_CHECK: - /* Note: gui options disabled, so only reaches here from cmdline */ + // when using xml output from valgrind, this option is preset to + // 'full' by valgrind, so this option should not be used. + case MEMCHECK::LEAK_CHECK: + // Note: gui options disabled, so only reaches here from cmdline errval = PERROR_BADOPT; - vkPrintErr( "Option disabled '--%s'", opt->m_longFlag.latin1() ); + vkPrintErr( "Option disabled '--%s'", qPrintable( opt->longFlag ) ); vkPrintErr( " - Memcheck presets this option to 'full' when generating the required xml output." ); vkPrintErr( " - See valgrind/docs/internals/xml_output.txt." ); break; @@ -270,8 +270,6 @@ vk_assert_never_reached(); } -#endif - return errval; } @@ -474,21 +472,18 @@ QString log_file = vkConfig->value( "valkyrie/view-log" ).toString(); statusMsg( "Parsing '" + log_file + "'" ); - //TODO: file checks -#if 0 - // check this is a valid file, and has the right perms + // check this is a valid file, and has at least read perms int errval = PARSED_OK; - QString ret_file = fileCheck( &errval, log_file, true, false ); - + QString ret_file = fileCheck( &errval, log_file, true ); + if ( errval != PARSED_OK ) { vkError( getToolView(), "File Error", "%s: \n\"%s\"", parseErrString( errval ), - escapeEntities( log_file ).latin1() ); + qPrintable( escapeEntities( log_file ) ) ); return false; } log_file = ret_file; -#endif // fileSaved true, 'cos we're just parsing an existing file fileSaved = true; @@ -498,7 +493,7 @@ qApp->processEvents( QEventLoop::AllEvents, 1000/*max msecs*/ ); // Parse the log - VgLogReader vgLogFileReader( getToolView()->vgLogPtr() ); + VgLogReader vgLogFileReader( getToolView()->createVgLog() ); bool success = vgLogFileReader.parse( log_file ); if ( success ) { @@ -540,7 +535,7 @@ // new vgreader - view may have been recreated, so need up-to-date ptr vk_assert( vgreader == 0 ); - vgreader = new VgLogReader( getToolView()->vgLogPtr() ); + vgreader = new VgLogReader( getToolView()->createVgLog() ); // start a new process, listening on exit signal to call processDone(). // - once Vg is done, we can read the remainder of the log in one last go. Modified: branches/valkyrie_qt4port/options/vk_option.cpp =================================================================== --- branches/valkyrie_qt4port/options/vk_option.cpp 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/options/vk_option.cpp 2010-03-11 13:52:33 UTC (rev 489) @@ -19,6 +19,7 @@ #include "options/vk_option.h" #include "utils/vk_config.h" +#include "utils/vk_utils.h" /***************************************************************************/ @@ -175,156 +176,292 @@ class VkOption */ VkOption::VkOption( - int optid, - QString configGrp, QString longFlag, QChar shortFlag, - QString flagDesc, QString possVals, QVariant dfltValue, - QString shortHelp, QString longHelp, QString urlAddress, - VkOPT::ArgType argType, VkOPT::WidgType widgType ) + int _optid, + QString _configGrp, QString _longFlag, QChar _shortFlag, + QString _flagDescr, QString _possVals, QVariant _dfltValue, + QString _shortHelp, QString _longHelp, QString _urlAddress, + VkOPT::ArgType _argType, VkOPT::WidgType _widgType ) { - this->optid = optid; - this->configGrp = configGrp; - this->longFlag = longFlag; - this->shortFlag = shortFlag; - this->flagDescr = flagDesc; - this->possValues = possVals.split( '|', QString::SkipEmptyParts ); - this->dfltValue = dfltValue; - this->shortHelp = shortHelp; - this->longHelp = longHelp; - this->urlAddress = urlAddress; - this->argType = argType; - this->widgType = widgType; + optid = _optid; + configGrp = _configGrp; + longFlag = _longFlag; + shortFlag = _shortFlag; + flagDescr = _flagDescr; + possValues = _possVals.split( '|', QString::SkipEmptyParts ); + dfltValue = _dfltValue; + shortHelp = _shortHelp; + longHelp = _longHelp; + urlAddress = _urlAddress; + argType = _argType; + widgType = _widgType; - - // TODO -#ifdef VK_DEBUG - - /* augment m_longHelp if m_defaultValue not empty */ - if ( m_argType != VkOPTION::NOT_POPT && - !m_defaultValue.isEmpty() ) { - m_longHelp += " [" + m_defaultValue + "]"; + // augment longHelp if dfltValue not empty + if ( argType != VkOPT::NOT_POPT && + !dfltValue.toString().isEmpty() ) { + longHelp += " [" + dfltValue.toString() + "]"; } - /* Assert is valid option ---------------------------------------- */ + // Assert is valid option ---------------------------------------- if ( 0 ) { print(); } - /* we always expect the following fields */ - vk_assert( !m_configGroup.isEmpty() ); - vk_assert( !m_longFlag.isEmpty() ); - vk_assert( !m_longHelp.isEmpty() || !m_shortHelp.isEmpty() ); + // we always expect the following fields + vk_assert( !configGrp.isEmpty() ); + vk_assert( !longFlag.isEmpty() ); + + // no help for internal-config options: short|long help for others + if ( argType == VkOPT::NOT_POPT && + widgType == VkOPT::WDG_NONE ) { + vk_assert( longHelp.isEmpty() && shortHelp.isEmpty() ); + } else { + vk_assert( !longHelp.isEmpty() || !shortHelp.isEmpty() ); + } - /* if ARG_NONE, we don't expect any argument related stuff */ - if ( m_argType == VkOPTION::ARG_NONE ) { - vk_assert( m_flagDescrip.isEmpty() ); - vk_assert( m_possValues.isEmpty() ); + // if ARG_NONE, we don't expect any argument related stuff + if ( argType == VkOPT::ARG_NONE ) { + vk_assert( flagDescr.isEmpty() ); + vk_assert( possValues.isEmpty() ); } - /* NOT_POPT options: not for command-line processing */ - if ( m_argType == VkOPTION::NOT_POPT ) { - /* vk_popt option parsing relies on at least these being non-empty: */ - vk_assert( !m_shortFlag.isNull() || !m_longFlag.isEmpty() ); - /* only short help wanted: used for gui widget text */ - vk_assert( !m_shortHelp.isEmpty() ); - vk_assert( m_longHelp.isEmpty() ); + // NOT_POPT options: not for command-line processing + if ( argType == VkOPT::NOT_POPT ) { + + // vk_popt option parsing relies on at least these being non-empty: + vk_assert( !shortFlag.isNull() || !longFlag.isEmpty() ); + + // gui-only options + if ( widgType != VkOPT::WDG_NONE ) { + // only short help wanted: used for gui widget text + vk_assert( !shortHelp.isEmpty() ); + vk_assert( longHelp.isEmpty() ); + } + // else NOT_POPT && WDG_NONE => internal configure options only. } - /* ARG_PWR2 options */ - if ( m_argType == VkOPTION::ARG_PWR2 ) { - /* min|max */ - vk_assert( m_possValues.count() == 2 ); - /* m_defaultValue, m_possValues must all be powers of 2 */ - vk_assert( isPowerOfTwo( m_defaultValue ) ); - vk_assert( isPowerOfTwo( m_possValues[0] ) ); - vk_assert( isPowerOfTwo( m_possValues[1] ) ); - /* min <= default <= max */ + // ARG_PWR2 options + if ( argType == VkOPT::ARG_PWR2 ) { + // min|max + vk_assert( possValues.count() == 2 ); + // dfltValue, possValues must all be powers of 2 + vk_assert( isPowerOfTwo( dfltValue.toString() ) ); + vk_assert( isPowerOfTwo( possValues[0] ) ); + vk_assert( isPowerOfTwo( possValues[1] ) ); + // min <= default <= max bool ok; - unsigned long dflt = m_defaultValue.toULong( &ok ); + unsigned long dflt = dfltValue.toString().toULong( &ok ); vk_assert( ok ); - unsigned long min = m_possValues[0].toULong( &ok ); + unsigned long min = possValues[0].toULong( &ok ); vk_assert( ok ); - unsigned long max = m_possValues[1].toULong( &ok ); + unsigned long max = possValues[1].toULong( &ok ); vk_assert( ok ); vk_assert( min <= dflt ); vk_assert( dflt <= max ); } - /* ARG_UINT options */ - if ( m_argType == VkOPTION::ARG_UINT ) { - /* except don't test cachegrind's horrible cache options */ - bool dontTest = ( m_configGroup == "cachegrind" && - ( m_longFlag == "I1" || - m_longFlag == "D1" || - m_longFlag == "L2" ) ); + // ARG_UINT options + if ( argType == VkOPT::ARG_UINT ) { + // except don't test cachegrind's horrible cache options + bool dontTest = ( configGrp == "cachegrind" && + ( longFlag == "I1" || + longFlag == "D1" || + longFlag == "L2" ) ); - if ( !dontTest ) { - /* min|max */ - vk_assert( m_possValues.count() == 2 ); - /* min <= default <= max */ + if ( dontTest ) { + VK_DEBUG( "Warning: Not performing UInt value test for option: %s", + qPrintable( longFlag ) ); + } else { + // min|max + vk_assert( possValues.count() == 2 ); + // min <= default <= max bool ok; - unsigned long dflt = m_defaultValue.toULong( &ok ); + unsigned long dflt = dfltValue.toString().toULong( &ok ); vk_assert( ok ); - unsigned long min = m_possValues[0].toULong( &ok ); + unsigned long min = possValues[0].toULong( &ok ); vk_assert( ok ); - unsigned long max = m_possValues[1].toULong( &ok ); + unsigned long max = possValues[1].toULong( &ok ); vk_assert( ok ); vk_assert( min <= dflt ); vk_assert( dflt <= max ); } } - /* ARG_BOOL options */ - if ( m_argType == VkOPTION::ARG_BOOL ) { - /* true|false (in various guises) */ - vk_assert( m_possValues.count() == 2 ); - /* accepted bool forms: */ - QString t = m_possValues[0]; - QString f = m_possValues[1]; + // ARG_BOOL options + if ( argType == VkOPT::ARG_BOOL ) { + // true|false (in various guises) + vk_assert( possValues.count() == 2 ); + // accepted bool forms: + QString t = possValues[0]; + QString f = possValues[1]; vk_assert( t == "true" || t == "on" || t == "yes" || t == "1" || t == "T" ); vk_assert( f == "false" || f == "off" || f == "no" || f == "0" || f == "F" ); } - /* OptWidget relies on bool values being in order <true|false> */ - if ( m_widgType == VkOPTION::WDG_CHECK || - m_widgType == VkOPTION::WDG_RADIO ) { + // OptWidget relies on bool values being in order <true|false> + if ( widgType == VkOPT::WDG_CHECK || + widgType == VkOPT::WDG_RADIO ) { - vk_assert( m_possValues.count() == 2 ); + vk_assert( possValues.count() == 2 ); - QString yes = m_possValues[0]; - QString no = m_possValues[1]; + QString yes = possValues[0]; + QString no = possValues[1]; vk_assert( yes == "1" || yes == "on" || yes == "yes" || yes == "true" ); - vk_assert( no == "0" || no == "off" || no == "no" || no == "false" ); + vk_assert( no == "0" || no == "off" || no == "no" || no == "false" ); } - -#endif } - -#if 0 // TODO -/* for debugging */ -void Option::print() -{ - vkPrint( "m_key = %d", m_key ); - vkPrint( "m_widgType = %d", m_widgType ); - vkPrint( "m_argType = %d", m_argType ); - vkPrint( "m_shortFlag = %c", m_shortFlag.latin1() ); - vkPrint( "m_longFlag = %s", m_longFlag.latin1() ); - vkPrint( "m_flagDescrip = %s", m_flagDescrip.latin1() ); - vkPrint( "m_shortHelp = %s", m_shortHelp.latin1() ); - vkPrint( "m_longHelp = %s", m_longHelp.latin1() ); - vkPrint( "m_urlHelp = %s", m_urlHelp.latin1() ); - vkPrint( "m_defaultValue = %s", m_defaultValue.latin1() ); - vkPrint( "m_configGroup = %s", m_configGroup.latin1() ); - vkPrint( "m_possValues = |%s|", m_possValues.join( "|" ).latin1() ); - vkPrint( " " ); +/*! + configuration settings (QSettings) key for persistent storage: +*/ +QString VkOption::configKey() { + return configGrp + "/" + longFlag; } -#endif +/*! + update +*/ void VkOption::updateConfig( QVariant argVal ) { vkConfig->setValue( configKey(), argVal ); emit valueChanged(); } + + +/*! + tests for potential argument update +*/ +bool VkOption::isValidArg( int* err_val, QString argval ) +{ + *err_val = PARSED_OK; + switch ( argType ) { + + // eg. possValues == { 0, 4 }, ie. min=0, max=4 + case VkOPT::ARG_UINT: { + vk_assert( possValues.count() == 2 ); + // is this a number? + bool ok; + unsigned int val = argval.toUInt(&ok); + if (!ok) + *err_val = PERROR_BADNUMBER; + else { // looking good ... + unsigned int min = possValues[0].toUInt(&ok); + vk_assert(ok); + unsigned int max = possValues[1].toUInt(&ok); + vk_assert(ok); + if ( val < min || val > max ) { + *err_val = PERROR_OUTOFRANGE; + } + } + } + break; + + // eg. possValues == { 2, 16 }, ie. min=2, max=16 + case VkOPT::ARG_PWR2: { + vk_assert( possValues.count() == 2 ); + // is this a number? + bool ok; + unsigned long val = argval.toULong(&ok); + if (!ok) + *err_val = PERROR_BADNUMBER; + else { // looking good ... + // is this a power of 2? + if ( isPowerOfTwo( argval, err_val ) ) { // looking better ... + unsigned long min = possValues[0].toULong(); + unsigned long max = possValues[1].toULong(); + if ( val < min || val > max ) { + *err_val = PERROR_OUTOFRANGE; + } + } + } + } break; + + // possValues == { memcheck, addrcheck, ... } + case VkOPT::ARG_STRING: { + if ( ! possValues.contains( argval ) ) { + *err_val = PERROR_BADARG; + } + } break; + + // possValues == { yes|true, no|false } or whatever + case VkOPT::ARG_BOOL: { + vk_assert( possValues.count() == 2 ); + if ( argval != possValues[0] && + argval != possValues[1] ) { + *err_val = PERROR_BADARG; + } + } break; + + // this option is only ever called from within an options page via + // radio buttons etc., so the values can never be typed in. ergo, + // don't bother to check. + case VkOPT::NOT_POPT: + break; + + // this should never happen: only relevant to popt short help options. + case VkOPT::ARG_NONE: + vk_assert_never_reached(); + break; + + default: + vk_assert_never_reached(); + break; + } + + return ( *err_val == PARSED_OK ); +} + + +// static fn +bool VkOption::isPowerOfTwo( QString argval, int *err_val/*=0*/ ) +{ + bool ok; + unsigned long val = argval.toULong(&ok); + + if ( !ok ) { + if (err_val) + *err_val = PERROR_BADNUMBER; + return false; + } + + switch ( val ) { + case 1: case 2: case 4: case 8: + case 16: case 32: case 64: case 128: + case 256: case 512: case 1024: case 2048: + case 4096: case 8192: case 16384: case 32768: + case 65536: case 131072: case 262144: case 524288: + case 1048576: case 2097152: case 4194304: case 8388608: + break; + default: + if (err_val) + *err_val = PERROR_POWER_OF_TWO; + return false; + } + + if (err_val) + *err_val = PARSED_OK; + return true; +} + + +/*! + for debugging +*/ +void VkOption::print() +{ + vkPrint( "optid = %d", optid ); + vkPrint( "widgType = %d", widgType ); + vkPrint( "argType = %d", argType ); + vkPrint( "shortFlag = %c", shortFlag.toLatin1() ); + vkPrint( "longFlag = %s", qPrintable( longFlag ) ); + vkPrint( "flagDescr = %s", qPrintable( flagDescr ) ); + vkPrint( "shortHelp = %s", qPrintable( shortHelp ) ); + vkPrint( "longHelp = %s", qPrintable( longHelp ) ); + vkPrint( "urlAddress = %s", qPrintable( urlAddress ) ); + vkPrint( "dfltValue = %s", qPrintable( dfltValue.toString() ) ); + vkPrint( "configGrp = %s", qPrintable( configGrp ) ); + vkPrint( "possValues = |%s|", qPrintable( possValues.join( "|" ) ) ); + vkPrint( " " ); +} Modified: branches/valkyrie_qt4port/options/vk_option.h =================================================================== --- branches/valkyrie_qt4port/options/vk_option.h 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/options/vk_option.h 2010-03-11 13:52:33 UTC (rev 489) @@ -93,21 +93,9 @@ #define PERROR_POWER_OF_TWO -31 /* number not a power of two */ #define PERROR_BADVERSION -32 /* bad program version */ - -#if 0 -// ============================================================ -// helper functions -QString fileCheck( int* err_val, const QString fpath, - bool rd_perms, bool wr_perms ); -QString binaryCheck( int* err_val, const QString exe_name ); -QString dirCheck( int* err_val, const QString fpath, - bool rd_perms, bool wr_perms ); -#endif - const char* parseErrString( const int error ); - // ============================================================ class VkOptionHash { @@ -160,7 +148,10 @@ VkOPT::ArgType arg_type, VkOPT::WidgType w_type ); - + + bool isValidArg( int* err_val, QString argval ); + static bool isPowerOfTwo( QString argval, int* err_val=0 ); + signals: void valueChanged(); @@ -173,18 +164,20 @@ QString flagDescr; // eg. <file> QStringList possValues; // eg. low | med | high QVariant dfltValue; // eg. [low] + // - QVariant to support QSettings::setValue() + // See this->updateConfig() QString shortHelp; // txt for OptionsWindow QString longHelp; // txt for help --> stdout QString urlAddress; // context help url VkOPT::ArgType argType; // eg. ARG_UINT VkOPT::WidgType widgType; // eg. VkOPTION::WDG_LEDIT - // configuration settings key: - QString configKey() { - return configGrp + "/" + longFlag; - } + QString configKey(); void updateConfig( QVariant argVal ); + +private: + void print(); }; #endif // __VK_OPTION_H Modified: branches/valkyrie_qt4port/toolview/memcheckview.cpp =================================================================== --- branches/valkyrie_qt4port/toolview/memcheckview.cpp 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/toolview/memcheckview.cpp 2010-03-11 13:52:33 UTC (rev 489) @@ -55,7 +55,7 @@ Constructs a MemcheckView with the given \a parent. */ MemcheckView::MemcheckView( QWidget* parent ) - : ToolView( parent, VGTOOL::ID_MEMCHECK ) + : ToolView( parent, VGTOOL::ID_MEMCHECK ), logview(0) { setObjectName( QString::fromUtf8( "MemcheckView" ) ); @@ -78,9 +78,6 @@ // launch editor with src file loaded connect( treeView, SIGNAL( itemDoubleClicked( QTreeWidgetItem*, int ) ), this, SLOT( launchEditor( QTreeWidgetItem* ) ) ); - - - logview = new VgLogView( treeView ); } @@ -104,12 +101,12 @@ This should be called by the tool-object just before it intends to fill the log. */ -VgLog* MemcheckView::vgLogPtr() +VgLog* MemcheckView::createVgLog() { if ( logview != 0 ) { delete logview; - logview = new VgLogView( treeView ); } + logview = new VgLogView( treeView ); return ( VgLog* )logview; } Modified: branches/valkyrie_qt4port/toolview/memcheckview.h =================================================================== --- branches/valkyrie_qt4port/toolview/memcheckview.h 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/toolview/memcheckview.h 2010-03-11 13:52:33 UTC (rev 489) @@ -52,7 +52,7 @@ MemcheckView( QWidget* parent ); ~MemcheckView(); - VgLog* vgLogPtr(); + VgLog* createVgLog(); public slots: virtual void setState( bool run ); Modified: branches/valkyrie_qt4port/utils/vk_utils.cpp =================================================================== --- branches/valkyrie_qt4port/utils/vk_utils.cpp 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/utils/vk_utils.cpp 2010-03-11 13:52:33 UTC (rev 489) @@ -18,12 +18,14 @@ ****************************************************************************/ #include "vk_utils.h" +#include "options/vk_option.h" #include "utils/vk_config.h" // vkname() #include <cstdlib> // exit, mkstemp, free/malloc, etc #include <QDateTime> #include <QFile> +#include <QFileInfo> #include <QRegExp> #include <QString> @@ -80,7 +82,7 @@ /* prints debug msg -------------------------------------------------- */ void vkDebug( const char* msg, ... ) { -#ifdef DEBUG +#ifdef DEBUG_ON QByteArray ba = vkConfig->vkName.toLatin1(); const char* vkname = vkConfig ? ba.constData() : ""; va_list ap; @@ -312,3 +314,141 @@ } + + + + +//*************************************************************************** +// helper functions +//*************************************************************************** + +/*! + Local helper function to find file_name: either directly or via $PATH + Returns absolute path to file_name. +*/ +static QString getFileAbsPath( const QString file_name ) +{ + QString absPath = QString::null; + + if ( QFile::exists( file_name ) ) { + // file_name exists: get its absolute path. + absPath = QFileInfo( file_name ).absoluteFilePath(); + } + else if ( !file_name.contains('/') ) { + // no '/' in file_name -> try $PATH env variable + QString env = getenv( "PATH" ); + QStringList paths = env.split( ':' ); + + foreach ( QString candidate, paths ) { + candidate += "/" + file_name; + if ( QFile::exists( candidate ) ) { + // found it! set its absolute path. + absPath = QFileInfo( candidate ).absoluteFilePath(); + break; + } + } + } + + return absPath; +} + + +/*! + Checks file exists and has correct permissions. + Returns absolute path to file, if it exists: else QString::null +*/ +QString fileCheck( int* err_val, const QString fpath, + bool check_read/*=false*/, + bool check_write/*=false*/, + bool check_exe/*=false*/ ) +{ + *err_val = PARSED_OK; + QString absPath = QString::null; + QFileInfo fi( fpath ); + + // check exists: if so, return absolute path + if ( fpath.isEmpty() ) { + *err_val = PERROR_BADFILE; + goto bye; + } + + // try to find fpath: directly or via $PATH + absPath = getFileAbsPath( fpath ); + if ( absPath.isNull() ) { + // couldn't find fpath :-( + *err_val = PERROR_BADFILE; + goto bye; + } + + // check this is really a file + if ( !fi.isFile() ) { + *err_val = PERROR_BADFILE; + goto bye; + } + + // check for read permissions + if ( check_read && !fi.isReadable() ) { + *err_val = PERROR_BADFILERD; + goto bye; + } + + // check for write permissions + if ( check_write && !fi.isWritable() ) { + *err_val = PERROR_BADFILEWR; + goto bye; + } + + // check for executable permissions + if ( check_exe && !fi.isExecutable() ) { + *err_val = PERROR_BADEXEC; + goto bye; + } + +bye: + return absPath; +} + + +/*! + Checks dir exists and has correct permissions. + Returns absolute path to dir, if it exists: else QString::null +*/ +QString dirCheck( int* err_val, const QString dir, + bool check_read/*=false*/, + bool check_write/*=false*/, + bool check_exe/*=false*/ ) +{ + *err_val = PARSED_OK; + QString absPath = QString::null; + QFileInfo fi( dir ); + + // check exists: if so, return absolute path + if ( dir.isEmpty() || !fi.exists() || !fi.isDir() ) { + *err_val = PERROR_BADDIR; + goto bye; + } + + // dir exists: set its absolute path + absPath = fi.absolutePath(); + + // check for read permissions + if ( check_read && !fi.isReadable() ) { + *err_val = PERROR_BADFILERD; + goto bye; + } + + // check for write permissions + if ( check_write && !fi.isWritable() ) { + *err_val = PERROR_BADFILEWR; + goto bye; + } + + // check for executable permissions + if ( check_exe && !fi.isExecutable() ) { + *err_val = PERROR_BADEXEC; + goto bye; + } + +bye: + return absPath; +} Modified: branches/valkyrie_qt4port/utils/vk_utils.h =================================================================== --- branches/valkyrie_qt4port/utils/vk_utils.h 2010-03-10 00:44:20 UTC (rev 488) +++ branches/valkyrie_qt4port/utils/vk_utils.h 2010-03-11 13:52:33 UTC (rev 489) @@ -129,4 +129,18 @@ char* vk_strdup( const char* str ); + + + +// ============================================================ +// helper functions +QString fileCheck( int* err_val, const QString fpath, + bool check_read=false, bool check_write=false, + bool check_exe=false ); + +QString dirCheck( int* err_val, const QString fpath, + bool check_read=false, bool check_write=false, + bool check_exe=false ); + + #endif |