From 8c1103f19b8cbeae601dc51212c8053985e38b1b Mon Sep 17 00:00:00 2001 From: "SND\\air_max_cp" Date: Fri, 16 Dec 2011 16:03:39 +0000 Subject: [PATCH] added: boost build command line script [0.1.x] refactored: DbgPythonPath class [0.1.x] added: FileExists function [0.0.x] refactored: DbgPythonPath class [0.0.x] added: FileExists function git-svn-id: https://pykd.svn.codeplex.com/svn@72409 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 7 +-- pykd/dbgpath.cpp | 152 ++++++++++++----------------------------------- pykd/dbgpath.h | 18 +----- pykd/utils.h | 6 ++ 4 files changed, 50 insertions(+), 133 deletions(-) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index aad4161..dfdc885 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -896,11 +896,10 @@ py( PDEBUG_CLIENT4 client, PCSTR args ) delete[] pythonArgs; // найти путь к файлу - std::string scriptName; - std::string filePath; + std::string fullScriptName; DbgPythonPath dbgPythonPath; - if ( !dbgPythonPath.findPath( argsList[0], scriptName, filePath ) ) + if ( !dbgPythonPath.getFullFileName( argsList[0], fullScriptName ) ) { dbgClient->eprintln( L"script file not found" ); } @@ -909,7 +908,7 @@ py( PDEBUG_CLIENT4 client, PCSTR args ) python::object result; - result = python::exec_file( scriptName.c_str(), global, global ); + result = python::exec_file( fullScriptName.c_str(), global, global ); } catch( boost::python::error_already_set const & ) { diff --git a/pykd/dbgpath.cpp b/pykd/dbgpath.cpp index 10be731..f2094b7 100644 --- a/pykd/dbgpath.cpp +++ b/pykd/dbgpath.cpp @@ -1,147 +1,71 @@ #include "stdafx.h" #include "dbgpath.h" +#include "utils.h" #include /////////////////////////////////////////////////////////////////////////////// - - DbgPythonPath::DbgPythonPath() { - DWORD enviromentSize = 0; - - enviromentSize = GetEnvironmentVariableA( "PYTHONPATH", NULL, enviromentSize ); + boost::python::object sys = boost::python::import("sys"); - std::vector enviromentBuffer(enviromentSize); + boost::python::list pathList(sys.attr("path")); - if (!enviromentBuffer.empty()) - { - GetEnvironmentVariableA( "PYTHONPATH", &enviromentBuffer[0], enviromentSize ); - - typedef boost::escaped_list_separator char_separator_t; - typedef boost::tokenizer< char_separator_t > char_tokenizer_t; - - std::string pytonPath( &enviromentBuffer[0] ); - - char_tokenizer_t token( pytonPath, char_separator_t( "", "; \t", "\"" ) ); - - for ( char_tokenizer_t::iterator it = token.begin(); it != token.end(); ++it ) - { - if ( *it != "" ) - m_pathList.push_back( *it ); - } - } -} - -/////////////////////////////////////////////////////////////////////////////// - -std::string -DbgPythonPath::getStr() const -{ - std::string str; - std::vector::const_iterator it = m_pathList.begin(); - - for ( ; it != m_pathList.end(); ++it ) - { - str += *it; - str += ";"; - } - - return str; -} - -/////////////////////////////////////////////////////////////////////////////// - -bool -DbgPythonPath::findPath( - const std::string &fileName, - std::string &fullFileName, - std::string &filePath ) const -{ - std::vector< std::string > extPathList; - - boost::python::object sys = boost::python::import( "sys"); - - boost::python::list pathList( sys.attr("path") ); - boost::python::ssize_t n = boost::python::len(pathList); - for(boost::python::ssize_t i=0;i( pathList[i] ) ); - bool pyExt = fileName.rfind( ".py" ) == fileName.length() - 3; + for (boost::python::ssize_t i = 0; i < n ; i++) + m_extactedPathList.push_back(boost::python::extract(pathList[i])); +} - // 1. Ищем в рабочей директории - DWORD bufSize = - SearchPathA( - NULL, - fileName.c_str(), - pyExt ? NULL : ".py", - 0, - NULL, - NULL ); - - if ( bufSize > 0 ) - { - bufSize += 1; - std::vector fullFileNameCStr(bufSize); - char *partFileNameCStr = NULL; +/////////////////////////////////////////////////////////////////////////////// + +bool DbgPythonPath::getFullFileName(const std::string &fileName, std::string &fullFileName) const +{ + bool fileHasPyExt = fileName.rfind(".py") == fileName.length() - 3; + fullFileName = fileName; - SearchPathA( - NULL, - fileName.c_str(), - pyExt ? NULL : ".py", - bufSize, - &fullFileNameCStr[0], - &partFileNameCStr ); - - fullFileName = std::string( &fullFileNameCStr[0] ); - if ( !fullFileName.empty() ) - { - filePath = std::string( &fullFileNameCStr[0], partFileNameCStr ); - return true; - } - } - - // 2. Ищем во всех директориях, указанных в m_pathList + if (!fileHasPyExt) + fullFileName += ".py"; - std::vector::const_iterator it = extPathList.begin(); - - for ( ; it != extPathList.end(); ++it ) + if (FileExists(fullFileName.c_str())) + return true; + + std::vector::const_iterator it = m_extactedPathList.begin(); + for ( ; it != m_extactedPathList.end(); ++it) { - DWORD bufSize = - SearchPathA( - (*it).c_str(), - fileName.c_str(), - pyExt ? NULL : ".py", - 0, - NULL, - NULL ); + DWORD bufSize = SearchPathA( + (*it).c_str(), + fullFileName.c_str(), + NULL, + 0, + NULL, + NULL); - if ( bufSize > 0 ) + if (bufSize > 0) { bufSize += 1; std::vector fullFileNameCStr(bufSize); - char *partFileNameCStr = NULL; + char *partFileNameCStr = NULL; bufSize = SearchPathA( (*it).c_str(), - fileName.c_str(), - pyExt ? NULL : ".py", + fullFileName.c_str(), + NULL, bufSize, &fullFileNameCStr[0], - &partFileNameCStr ); - - fullFileName = std::string( &fullFileNameCStr[0] ); - if ( !fullFileName.empty() ) - { - filePath = std::string( &fullFileNameCStr[0], partFileNameCStr ); + &partFileNameCStr); + + if (bufSize > 0) + { + fullFileName = std::string(&fullFileNameCStr[0]); return true; - } + } } } - + + fullFileName = ""; return false; } diff --git a/pykd/dbgpath.h b/pykd/dbgpath.h index 6942fe6..56e4cbe 100644 --- a/pykd/dbgpath.h +++ b/pykd/dbgpath.h @@ -8,24 +8,12 @@ class DbgPythonPath { public: - DbgPythonPath(); - std::string - getStr() const; - - bool - findPath( - const std::string &fileName, - std::string &fullFileName, - std::string &filePath ) const; - - + bool getFullFileName(const std::string &fileName, std::string &fullFileName) const; + private: - - std::vector< std::string > m_pathList; - + std::vector m_extactedPathList; }; - /////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/pykd/utils.h b/pykd/utils.h index 1f2dbdd..f611c30 100644 --- a/pykd/utils.h +++ b/pykd/utils.h @@ -99,3 +99,9 @@ python::list toPyList(const std::list< TElem > &stdList) } //////////////////////////////////////////////////////////////////////////////// +inline +bool FileExists(LPCSTR lpFileName) +{ + return ::GetFileAttributesA(lpFileName) != DWORD(-1); +} +////////////////////////////////////////////////////////////////////////////////