You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
506 lines
21 KiB
C++
506 lines
21 KiB
C++
// XTPSyntaxEditLexCfgFileReader.h
|
|
//
|
|
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
#if !defined(__XTPSYNTAXEDITLEXCFGFILEREADER_H__)
|
|
#define __XTPSYNTAXEDITLEXCFGFILEREADER_H__
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
class CXTPSyntaxEditLexCfgFileReader;
|
|
|
|
namespace XTPSyntaxEditLexAnalyser
|
|
{
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
//===========================================================================
|
|
// Summary:
|
|
// XTPSyntaxEditTokenType type defines type of tokens that read by
|
|
// CXTPSyntaxEditLexCfgFileReader class from configuration files.
|
|
// See also:
|
|
// CXTPSyntaxEditLexCfgFileReader
|
|
//===========================================================================
|
|
enum XTPSyntaxEditTokenType
|
|
{
|
|
xtpEditTokType_Unknown,
|
|
xtpEditTokType_Delim,
|
|
xtpEditTokType_Name,
|
|
xtpEditTokType_Value,
|
|
xtpEditTokType_Quoted,
|
|
xtpEditTokType_Comment,
|
|
xtpEditTokType_EOL,
|
|
xtpEditTokType_Control
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// XTP_EDIT_LEXPROPINFO helper structure is used to group information
|
|
// which describes one Lex Class property pair. The property pair is
|
|
// property name and property value.
|
|
//===========================================================================
|
|
struct _XTP_EXT_CLASS XTP_EDIT_LEXPROPINFO
|
|
{
|
|
XTP_EDIT_LEXPROPINFO();
|
|
|
|
XTP_EDIT_LEXPROPINFO(const XTP_EDIT_LEXPROPINFO& rSrc);
|
|
|
|
const XTP_EDIT_LEXPROPINFO& operator = (const XTP_EDIT_LEXPROPINFO& rSrc);
|
|
|
|
CStringArray arPropName; // stores property name chain
|
|
CStringArray arPropValue; // stores value for property names with corresponding index
|
|
int nLine;
|
|
int nOffset;
|
|
int nPropertyLen;
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// CXTPSyntaxEditLexPropInfoArray type defines custom array type based on
|
|
// CArray to store XTP_EDIT_LEXPROPINFO structures.
|
|
// See also:
|
|
// XTP_EDIT_LEXPROPINFO
|
|
//===========================================================================
|
|
class _XTP_EXT_CLASS CXTPSyntaxEditLexPropInfoArray : public CArray<XTP_EDIT_LEXPROPINFO, XTP_EDIT_LEXPROPINFO&>
|
|
{
|
|
public:
|
|
CXTPSyntaxEditLexPropInfoArray();
|
|
|
|
CXTPSyntaxEditLexPropInfoArray(const CXTPSyntaxEditLexPropInfoArray& rSrc);
|
|
|
|
const CXTPSyntaxEditLexPropInfoArray& operator = (const CXTPSyntaxEditLexPropInfoArray& rSrc);
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// XTP_EDIT_LEXCLASSINFO structure is used to group information which describes
|
|
// a set of properties for one Lex Class.
|
|
// See also:
|
|
// XTP_EDIT_LEXPROPINFO
|
|
//===========================================================================
|
|
struct _XTP_EXT_CLASS XTP_EDIT_LEXCLASSINFO
|
|
{
|
|
XTP_EDIT_LEXCLASSINFO();
|
|
|
|
XTP_EDIT_LEXCLASSINFO(const XTP_EDIT_LEXCLASSINFO& rSrc);
|
|
|
|
const XTP_EDIT_LEXCLASSINFO& operator = (const XTP_EDIT_LEXCLASSINFO& rSrc);
|
|
|
|
CString csClassName; // name to identify lex class
|
|
CXTPSyntaxEditLexPropInfoArray arPropertyDesc; // array to store a set of lex class properties
|
|
int nStartLine;
|
|
int nEndLine;
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// Determines custom array type to store XTP_EDIT_LEXCLASSINFO structures.
|
|
// See also:
|
|
// XTP_EDIT_LEXCLASSINFO.
|
|
//===========================================================================
|
|
class _XTP_EXT_CLASS CXTPSyntaxEditLexClassInfoArray : public CArray<XTP_EDIT_LEXCLASSINFO, XTP_EDIT_LEXCLASSINFO&>
|
|
{
|
|
public:
|
|
CXTPSyntaxEditLexClassInfoArray();
|
|
|
|
CXTPSyntaxEditLexClassInfoArray(const CXTPSyntaxEditLexClassInfoArray& rSrc);
|
|
|
|
const CXTPSyntaxEditLexClassInfoArray& operator = (const CXTPSyntaxEditLexClassInfoArray& rSrc);
|
|
|
|
BOOL m_bModified;
|
|
};
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
}
|
|
|
|
|
|
//===========================================================================
|
|
// Summary: This class provides functionality to read configuration information
|
|
// from configuration files with predefined structure. Its information
|
|
// describes lex class instances that represent various lexical items
|
|
// for given language.
|
|
// You construct instance of CXTPSyntaxEditLexCfgFileReader by calling
|
|
// constructor. Then you should call ReadSource() member function
|
|
// to read data from persistent storage (file for this implementation),
|
|
// and process raw data into XTP_EDIT_LEXCLASSINFO structures. Call
|
|
// GetLexClassInfoArray() member function to return a pointer to an array
|
|
// of XTP_EDIT_LEXCLASSINFO data structures.
|
|
//===========================================================================
|
|
class _XTP_EXT_CLASS CXTPSyntaxEditLexCfgFileReader
|
|
{
|
|
public:
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Destroys a CXTPSyntaxEditLexCfgFileReader object, handles cleanup and
|
|
// de-allocation
|
|
//-----------------------------------------------------------------------
|
|
virtual ~CXTPSyntaxEditLexCfgFileReader();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Reads data from the configuration file.
|
|
// Parameters:
|
|
// csFileName: [in] string, containing full path to the
|
|
// configuration file.
|
|
// bSaveInfo: [in] Set as TRUE to save readed data in the LexClassInfoMap.
|
|
// Remarks:
|
|
// Use this member function to read configuration data from configuration
|
|
// file with predefined structure. Data loaded into internal data buffer.
|
|
//-----------------------------------------------------------------------
|
|
void ReadSource(const CString& csFileName, BOOL bSaveInfo);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Reads data from resources.
|
|
// Parameters:
|
|
// nResourceID: [in] Resource ID of the HTML configuration data.
|
|
// Remarks:
|
|
// Use this member function to read configuration data from application
|
|
// resources with predefined structure. Data loaded into internal data buffer.
|
|
//-----------------------------------------------------------------------
|
|
void ReadSource(UINT nResourceID);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Reads data from resources.
|
|
// Parameters:
|
|
// bSaveInfo : flag to save or not
|
|
// sPassedString : string passed
|
|
// pSyntaxScheme : pointer to string scheme
|
|
// Remarks:
|
|
// used for non-file based settings - formal file name for map = "InternalSyntaxSet"
|
|
//-----------------------------------------------------------------------
|
|
void ReadStringSource(BOOL bSaveInfo, CString sPassedString, CString* pSyntaxScheme);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns pointer to the internal array with XTP_EDIT_LEXCLASSINFO
|
|
// structures.
|
|
// Remarks:
|
|
// Use this member function to get pointer to the internal array with
|
|
// XTP_EDIT_LEXCLASSINFO structures, then you may operate with array members.
|
|
// Returns:
|
|
// Pointer to CXTPSyntaxEditLexClassInfoArray array.
|
|
//-----------------------------------------------------------------------
|
|
XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexClassInfoArray& GetLexClassInfoArray();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Returns pointer to the internal map with CXTPSyntaxEditLexClassInfoArray
|
|
// objects.
|
|
// Remarks:
|
|
// The key is lex class name, the data is pointer to
|
|
// CXTPSyntaxEditLexClassInfoArray object.
|
|
// Returns:
|
|
// Pointer to CMapStringToPtr map.
|
|
//-----------------------------------------------------------------------
|
|
CMapStringToPtr& GetLexClassInfoMap()
|
|
{
|
|
return m_mapLexClassInfo;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Use this member function to clear map and delete its data.
|
|
// Parameters:
|
|
// mapInfo - A reference to map object.
|
|
// See Also:
|
|
// CopyInfoMap
|
|
//-----------------------------------------------------------------------
|
|
void CleanInfoMap(CMapStringToPtr& mapInfo);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Use this member function to internal classes map and its data.
|
|
// Use CleanInfoMap to free (delete) map data.
|
|
// Parameters:
|
|
// mapInfo - [out] A reference to map object.
|
|
// See Also:
|
|
// CleanInfoMap
|
|
//-----------------------------------------------------------------------
|
|
void CopyInfoMap(CMapStringToPtr& mapInfo);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Writes LexClasses to given schema configuration file
|
|
// Parameters:
|
|
// csFileName - Configuration file name.
|
|
// arLexClassDesc - Array with lex class data (description) to save.
|
|
// Returns:
|
|
// TRUE if successful, FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
BOOL WriteCfgFile(const CString& csFileName, XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexClassInfoArray& arLexClassDesc);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Writes LexClasses to given schema configuration file
|
|
// Parameters:
|
|
// arLexClassDesc - Array with lex class data (description) to save.
|
|
// Returns:
|
|
// TRUE if successful, FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
BOOL WriteCfg2String(XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexClassInfoArray& arLexClassDesc);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Converts escape char sequences to corresponding char.
|
|
// Parameters:
|
|
// strSrc: [in] CString with text to convert.
|
|
// bQuoted: [in] Boolean flag determines that text should be interpreted
|
|
// as text enclosed by single quotes(')Boolean flag determines
|
|
// Remarks:
|
|
// Use this member function to convert text with escape char sequences
|
|
// (like \\n, \\t, etc) to corresponding char
|
|
// Returns:
|
|
// CString with converted text.
|
|
//-----------------------------------------------------------------------
|
|
CString StrToES(CString strSrc, BOOL bQuoted);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Converts char to corresponding escape char sequences.
|
|
// Parameters:
|
|
// strSrc: [in] CString with text to convert.
|
|
// bQuoted: [in] Boolean flag determines that text should be interpreted
|
|
// as text enclosed by single quotes(')
|
|
// Remarks:
|
|
// Use this member function to convert text with chars that are represented
|
|
// by escape sequences to corresponding escape char sequences
|
|
// (like \\n, \\t, etc)
|
|
// Returns:
|
|
// CString with converted text.
|
|
//-----------------------------------------------------------------------
|
|
CString ESToStr(CString strSrc, BOOL bQuoted);
|
|
|
|
private:
|
|
|
|
// A map describes whether property description has a flag or not.
|
|
typedef CMap<void*, void*, bool, bool> CMapPtrToBool;
|
|
#ifdef _DEBUG
|
|
// Process error messages of file processing. Writes messages into debug window.
|
|
void ProcessFileException(CFileException* pExc);
|
|
#endif
|
|
// Process next token from file.
|
|
int GetToken();
|
|
// Process next lex class token from file.
|
|
int GetLexToken();
|
|
// Process corresponding token
|
|
int ProcessUnknowToken(TCHAR tchCurrSymbol);
|
|
int ProcessDelimToken(TCHAR tchCurrSymbol);
|
|
int ProcessNameToken(TCHAR tchCurrSymbol);
|
|
int ProcessValueToken(TCHAR tchCurrSymbol);
|
|
int ProcessQuotedToken(TCHAR tchCurrSymbol);
|
|
int ProcessCommentToken(TCHAR tchCurrSymbol);
|
|
int ProcessEOLToken(TCHAR tchCurrSymbol);
|
|
int ProcessControlToken(TCHAR tchCurrSymbol);
|
|
// Parses single lex class.
|
|
void ParseLexClass(XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXCLASSINFO& infoClass);
|
|
// Searches for lex class.
|
|
XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXCLASSINFO* FindClassDesc(XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexClassInfoArray& arInfoClass, const CString& csClassName);
|
|
// Searches for property of lex class.
|
|
XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXPROPINFO* FindPropDesc(XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXCLASSINFO* pInfoClass, XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXPROPINFO* pInfoProp, CMapPtrToBool& mapUsed);
|
|
// Read source string by string into string array.
|
|
void ReadSource2(const CString& csFileName, CStringArray& arBuffer);
|
|
// Writes single string into file.
|
|
void WriteString(CFile& file, LPCTSTR pcszString);
|
|
// Writes a number of string into file.
|
|
void WriteStrings(CFile& file, CStringArray& arBuffer, int nFrom, int nTo);
|
|
// Writes a whole property description into file.
|
|
void WriteProp(CFile& file, CString& csOffset, const XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXPROPINFO& newInfoProp);
|
|
void WriteProp(CFile& file, CString& csOffset, const XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXPROPINFO& oldInfoProp, const XTPSyntaxEditLexAnalyser::XTP_EDIT_LEXPROPINFO& newInfoProp, const CStringArray& arBuffer);
|
|
// Process configuration data.
|
|
void Parse(XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexClassInfoArray& arLexClassDesc);
|
|
|
|
CString* p_sSyntaxScheme;
|
|
CString* p_sColorScheme;
|
|
void SetSyntaxAndColorScheme(CString* pSyntaxScheme, CString* pColorScheme)
|
|
{
|
|
p_sSyntaxScheme = pSyntaxScheme;
|
|
p_sColorScheme = pColorScheme;
|
|
|
|
m_csDataBuffer = *p_sSyntaxScheme;
|
|
}
|
|
|
|
private:
|
|
|
|
int m_nCurrLine; // Current processing line identifier.
|
|
int m_nCurrLine_pos; // Position in current line.
|
|
int m_nCurrPos; // Current position in data buffer.
|
|
int m_nEOFPos; // EOF position.
|
|
int m_nPrevPos; // Previous position in data buffer.
|
|
int m_nTokenType; // Type of processed token.
|
|
BOOL m_bReadNames; // Flag to read names of properties.
|
|
BOOL m_bES;
|
|
CString m_csDataBuffer; // Internal buffer to read file to.
|
|
CString m_strToken; // Text of processed token.
|
|
CMapStringToPtr m_mapLexClassInfo;
|
|
XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexClassInfoArray m_arLexClassInfo; // lex classes array.
|
|
|
|
// Singleton instantiation.
|
|
CXTPSyntaxEditLexCfgFileReader();
|
|
static CXTPSyntaxEditLexCfgFileReader& AFX_CDECL Instance();
|
|
friend CXTPSyntaxEditLexCfgFileReader* AFX_CDECL XTPSyntaxEditLexConfig();
|
|
};
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// Use this function to get CXTPSyntaxEditLexCfgFileReader global object.
|
|
// Returns:
|
|
// A pointer to CXTPSyntaxEditLexCfgFileReader object.
|
|
//===========================================================================
|
|
AFX_INLINE CXTPSyntaxEditLexCfgFileReader* AFX_CDECL XTPSyntaxEditLexConfig()
|
|
{
|
|
return &CXTPSyntaxEditLexCfgFileReader::Instance();
|
|
}
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// This class provides ability of monitoring changes in configuration files
|
|
// and read new data from monitored files in time.
|
|
//===========================================================================
|
|
class CXTPSyntaxEditConfigurationManager;
|
|
|
|
// this class monitors files changes
|
|
class _XTP_EXT_CLASS CXTPSyntaxEditFileChangesMonitor
|
|
{
|
|
public:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Default object constructor.
|
|
//-----------------------------------------------------------------------
|
|
CXTPSyntaxEditFileChangesMonitor();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Destroys a CXTPSyntaxEditFileChangesMonitor() object, handles cleanup
|
|
// and de-allocation. Stops monitoring if it doesn't stop yet.
|
|
//-----------------------------------------------------------------------
|
|
virtual ~CXTPSyntaxEditFileChangesMonitor();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets default monitoring folder.
|
|
// Parameters:
|
|
// strPath: [in] path string.
|
|
//-----------------------------------------------------------------------
|
|
void SetDefaultFolder(const CString& strPath);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Sets associated ConfigurationManager object.
|
|
// Parameters:
|
|
// pConfigMgr: [in] Pointer to the CXTPSyntaxEditConfigurationManager
|
|
// object.
|
|
// See Also: CXTPSyntaxEditConfigurationManager
|
|
//-----------------------------------------------------------------------
|
|
void SetConfigurationManager(CXTPSyntaxEditConfigurationManager* pConfigMgr);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Add file to to be monitored.
|
|
// Parameters:
|
|
// strFilename: [in] file name string.
|
|
// dwOwnerFlags: [in] Additional flags (from enum XTPSyntaxEditCfgObjects).
|
|
// Returns:
|
|
// TRUE if the operation is successful, FALSE else.
|
|
// Remarks:
|
|
// Add file to the bunch of files to monitor changes at. First, try to
|
|
// check file by provided file name string, then tries file in the
|
|
// default folder. Ignores bad file names.
|
|
// See Also: CXTPSyntaxEditConfigurationManager
|
|
//-----------------------------------------------------------------------
|
|
BOOL AddMonitorFile(CString& strFilename, DWORD dwOwnerFlags);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Starts thread which will be monitoring folder changes.
|
|
//-----------------------------------------------------------------------
|
|
void StartMonitoring();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Stops thread which is monitoring folder changes.
|
|
//-----------------------------------------------------------------------
|
|
void StopMonitoring();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Refreshes contents in the folder, update file's status and re-read
|
|
// changed configuration files.
|
|
//-----------------------------------------------------------------------
|
|
void RefreshFiles();
|
|
|
|
private:
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Remove all files which are monitored at the moment
|
|
//-----------------------------------------------------------------------
|
|
void RemoveAll();
|
|
|
|
private:
|
|
CString m_strPath;
|
|
CWinThread* m_pThread;
|
|
HANDLE m_evExitThread;
|
|
static UINT AFX_CDECL ThreadMonitorProc(LPVOID);
|
|
BOOL m_bES;
|
|
|
|
CXTPSyntaxEditConfigurationManager* m_pConfigMgr; // pointer to the associated configuration manager
|
|
|
|
// this class contain information about monitoring file
|
|
class _XTP_EXT_CLASS CFMFileInfo
|
|
{
|
|
public:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Default object constructor.
|
|
//-----------------------------------------------------------------------
|
|
CFMFileInfo();
|
|
|
|
CString m_strFileName; // monitoring file name
|
|
|
|
BY_HANDLE_FILE_INFORMATION m_sysFileInfo; // File information
|
|
BOOL m_bExists; // Is file exist
|
|
DWORD m_dwOwnerFlags; // Additional flags
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Copy operator.
|
|
//-----------------------------------------------------------------------
|
|
const CFMFileInfo& operator = (const CFMFileInfo& rSrc);
|
|
};
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Get file information using file name.
|
|
//-----------------------------------------------------------------------
|
|
BOOL GetFileInfo(LPCTSTR pcszFilePath, BY_HANDLE_FILE_INFORMATION* pInfo);
|
|
|
|
CArray<CFMFileInfo, CFMFileInfo&> m_arFiles; // a bunch of filenames to monitor changes at
|
|
};
|
|
|
|
AFX_INLINE void CXTPSyntaxEditFileChangesMonitor::SetConfigurationManager(CXTPSyntaxEditConfigurationManager* pConfigMgr)
|
|
{
|
|
m_pConfigMgr = pConfigMgr;
|
|
}
|
|
|
|
#endif // !defined(__XTPSYNTAXEDITLEXCFGFILEREADER_H__)
|