aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MIUtilFileStd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MIUtilFileStd.cpp')
-rw-r--r--tools/lldb-mi/MIUtilFileStd.cpp290
1 files changed, 290 insertions, 0 deletions
diff --git a/tools/lldb-mi/MIUtilFileStd.cpp b/tools/lldb-mi/MIUtilFileStd.cpp
new file mode 100644
index 000000000000..853fd7455680
--- /dev/null
+++ b/tools/lldb-mi/MIUtilFileStd.cpp
@@ -0,0 +1,290 @@
+//===-- MIUtilFileStd.cpp ---------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+//++
+// File: MIUtilFileStd.cpp
+//
+// Overview: CMIUtilFileStd implementation.
+//
+// Environment: Compilers: Visual C++ 12.
+// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
+// Libraries: See MIReadmetxt.
+//
+// Copyright: None.
+//--
+
+// Third party headers
+#include <stdio.h>
+#include <assert.h>
+#include <string.h> // For strerror()
+#include <cerrno>
+
+// In-house headers:
+#include "MIUtilFileStd.h"
+#include "MICmnResources.h"
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMIUtilFileStd constructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMIUtilFileStd::CMIUtilFileStd( void )
+: m_fileNamePath( CMIUtilString() )
+, m_pFileHandle( nullptr )
+#if defined( _MSC_VER )
+, m_constCharNewLine( "\r\n" )
+#else
+, m_constCharNewLine( "\n" )
+#endif // #if defined( _MSC_VER )
+, m_bFileError( false )
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMIUtilFileStd destructor.
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+CMIUtilFileStd::~CMIUtilFileStd( void )
+{
+ Close();
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Open file for writing. On the first call to this function after *this object
+// is created the file is either created or replace, from then on open only opens
+// an existing file.
+// Type: Method.
+// Args: vFileNamePath - (R) File name path.
+// vwrbNewCreated - (W) True - file recreated, false - file appended too.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMIUtilFileStd::CreateWrite( const CMIUtilString & vFileNamePath, bool & vwrbNewCreated )
+{
+ // Reset
+ m_bFileError = false;
+ vwrbNewCreated = false;
+
+ if( vFileNamePath.empty() )
+ {
+ m_bFileError = true;
+ SetErrorDescription( MIRSRC( IDS_UTIL_FILE_ERR_INVALID_PATHNAME ) );
+ return MIstatus::failure;
+ }
+
+ // File is already open so exit
+ if( m_pFileHandle != nullptr )
+ return MIstatus::success;
+
+#if !defined( _MSC_VER )
+ // Open with 'write' and 'binary' mode
+ m_pFileHandle = ::fopen( vFileNamePath.c_str(), "wb" );
+#else
+ // Open a file with exclusive write and shared read permissions
+ m_pFileHandle = ::_fsopen( vFileNamePath.c_str(), "wb", _SH_DENYWR );
+#endif // !defined( _MSC_VER )
+
+ if( m_pFileHandle == nullptr )
+ {
+ m_bFileError = true;
+ SetErrorDescriptionn( MIRSRC( IDS_UTIL_FILE_ERR_OPENING_FILE ), strerror( errno ), vFileNamePath.c_str() );
+ return MIstatus::failure;
+ }
+
+ vwrbNewCreated = true;
+ m_fileNamePath = vFileNamePath;
+
+ return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Write data to existing opened file.
+// Type: Method.
+// Args: vData - (R) Text data.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMIUtilFileStd::Write( const CMIUtilString & vData )
+{
+ if( vData.size() == 0 )
+ return MIstatus::success;
+
+ if( m_bFileError )
+ return MIstatus::failure;
+
+ if( m_pFileHandle == nullptr )
+ {
+ m_bFileError = true;
+ SetErrorDescriptionn( MIRSRC( IDE_UTIL_FILE_ERR_WRITING_NOTOPEN ), m_fileNamePath.c_str() );
+ return MIstatus::failure;
+ }
+
+ // Get the string size
+ MIuint size = vData.size();
+ if( ::fwrite( vData.c_str(), 1, size, m_pFileHandle ) == size )
+ {
+ // Flush the data to the file
+ ::fflush( m_pFileHandle );
+ return MIstatus::success;
+ }
+
+ // Not all of the data has been transferred
+ m_bFileError = true;
+ SetErrorDescriptionn( MIRSRC( IDE_UTIL_FILE_ERR_WRITING_FILE ), m_fileNamePath.c_str() );
+ return MIstatus::failure;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Write data to existing opened file.
+// Type: Method.
+// Args: vData - (R) Text data.
+// vCharCnt - (R) Text data length.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+bool CMIUtilFileStd::Write( const MIchar * vpData, const MIuint vCharCnt )
+{
+ if( vCharCnt == 0 )
+ return MIstatus::success;
+
+ if( m_bFileError )
+ return MIstatus::failure;
+
+ if( m_pFileHandle == nullptr )
+ {
+ m_bFileError = true;
+ SetErrorDescriptionn( MIRSRC( IDE_UTIL_FILE_ERR_WRITING_NOTOPEN ), m_fileNamePath.c_str() );
+ return MIstatus::failure;
+ }
+
+ if( ::fwrite( vpData, 1, vCharCnt, m_pFileHandle ) == vCharCnt )
+ {
+ // Flush the data to the file
+ ::fflush( m_pFileHandle );
+ return MIstatus::success;
+ }
+
+ // Not all of the data has been transferred
+ m_bFileError = true;
+ SetErrorDescriptionn( MIRSRC( IDE_UTIL_FILE_ERR_WRITING_FILE ), m_fileNamePath.c_str() );
+ return MIstatus::failure;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Close existing opened file. Note Close() must must an open!
+// Type: Method.
+// Args: None.
+// Return: None.
+// Throws: None.
+//--
+void CMIUtilFileStd::Close( void )
+{
+ if( m_pFileHandle == nullptr )
+ return;
+
+ ::fclose( m_pFileHandle );
+ m_pFileHandle = nullptr;
+ //m_bFileError = false; Do not reset as want to remain until next attempt at open or create
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Retrieve state of whether the file is ok.
+// Type: Method.
+// Args: None.
+// Return: True - file ok.
+// False - file has a problem.
+// Throws: None.
+//--
+bool CMIUtilFileStd::IsOk( void ) const
+{
+ return !m_bFileError;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Status on a file existing already.
+// Type: Method.
+// Args: vFileNamePath.
+// Return: True - Exists.
+// False - Not found.
+// Throws: None.
+//--
+bool CMIUtilFileStd::IsFileExist( const CMIUtilString & vFileNamePath ) const
+{
+ if( vFileNamePath.empty() )
+ return false;
+
+ FILE * pTmp = nullptr;
+ pTmp = ::fopen( vFileNamePath.c_str(), "wb" );
+ if( pTmp != nullptr )
+ {
+ ::fclose( pTmp );
+ return true;
+ }
+
+ return false;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Retrieve the file current carriage line return characters used.
+// Type: Method.
+// Args: None.
+// Return: CMIUtilString & - Text.
+// Throws: None.
+//--
+const CMIUtilString & CMIUtilFileStd::GetLineReturn( void ) const
+{
+ return m_constCharNewLine;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Given a file name directory path, strip off the filename and return the path.
+// It look for either backslash or forward slash.
+// Type: Method.
+// Args: vDirectoryPath - (R) Text directory path.
+// Return: CMIUtilString - Directory path.
+// Throws: None.
+//--
+CMIUtilString CMIUtilFileStd::StripOffFileName( const CMIUtilString & vDirectoryPath ) const
+{
+ const MIint nPos = vDirectoryPath.rfind( '\\' );
+ MIint nPos2 = vDirectoryPath.rfind( '/' );
+ if( (nPos == (MIint) std::string::npos) && (nPos2 == (MIint) std::string::npos) )
+ return vDirectoryPath;
+
+ if( nPos > nPos2 )
+ nPos2 = nPos;
+
+ const CMIUtilString strPath( vDirectoryPath.substr( 0, nPos2 ).c_str() );
+ return strPath;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Return either backslash or forward slash appropriate to the OS this applilcation
+// is running on.
+// Type: Static method.
+// Args: None.
+// Return: MIchar - '/' or '\' character.
+// Throws: None.
+//--
+MIchar CMIUtilFileStd::GetSlash( void )
+{
+#if !defined( _MSC_VER )
+ return '/';
+#else
+ return '\\';
+#endif // !defined( _MSC_VER )
+}