Removed files.
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@481 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
582
sql/src/fxml.h
582
sql/src/fxml.h
@@ -1,582 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// Desc: This file contains the FLAIM XML wrapper class
|
||||
//
|
||||
// Tabs: 3
|
||||
//
|
||||
// Copyright (c) 1999-2000, 2002-2006 Novell, Inc. All Rights Reserved.
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of version 2 of the GNU General Public
|
||||
// License as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, contact Novell, Inc.
|
||||
//
|
||||
// To contact Novell about this file by physical or electronic mail,
|
||||
// you may find current contact information at www.novell.com
|
||||
//
|
||||
// $Id: fxml.h 3109 2006-01-19 13:07:07 -0700 (Thu, 19 Jan 2006) dsanders $
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef FXML_H
|
||||
#define FXML_H
|
||||
|
||||
/*============================================================================
|
||||
Desc: FLAIM's XML namespace class
|
||||
============================================================================*/
|
||||
class F_XMLNamespace : public F_Object
|
||||
{
|
||||
public:
|
||||
|
||||
FINLINE F_XMLNamespace()
|
||||
{
|
||||
m_puzPrefix = NULL;
|
||||
m_puzURI = NULL;
|
||||
m_pNext = NULL;
|
||||
}
|
||||
|
||||
FINLINE ~F_XMLNamespace()
|
||||
{
|
||||
flmAssert( !m_pNext);
|
||||
|
||||
if( m_puzPrefix)
|
||||
{
|
||||
f_free( &m_puzPrefix);
|
||||
}
|
||||
|
||||
if( m_puzURI)
|
||||
{
|
||||
f_free( &m_puzURI);
|
||||
}
|
||||
}
|
||||
|
||||
RCODE setPrefix(
|
||||
FLMUNICODE * puzPrefix);
|
||||
|
||||
RCODE setURI(
|
||||
FLMUNICODE * puzURI);
|
||||
|
||||
RCODE setup(
|
||||
FLMUNICODE * puzPrefix,
|
||||
FLMUNICODE * puzURI,
|
||||
F_XMLNamespace * pNext);
|
||||
|
||||
FINLINE FLMUNICODE * getPrefixPtr( void)
|
||||
{
|
||||
return( m_puzPrefix);
|
||||
}
|
||||
|
||||
FINLINE FLMUNICODE * getURIPtr( void)
|
||||
{
|
||||
return( m_puzURI);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
FLMUNICODE * m_puzPrefix;
|
||||
FLMUNICODE * m_puzURI;
|
||||
F_XMLNamespace * m_pNext;
|
||||
|
||||
friend class F_XMLNamespaceMgr;
|
||||
};
|
||||
|
||||
/*============================================================================
|
||||
Desc: Namespace manager class
|
||||
============================================================================*/
|
||||
class F_XMLNamespaceMgr : public F_Object
|
||||
{
|
||||
public:
|
||||
|
||||
F_XMLNamespaceMgr();
|
||||
|
||||
~F_XMLNamespaceMgr();
|
||||
|
||||
RCODE findNamespace(
|
||||
FLMUNICODE * puzPrefix,
|
||||
F_XMLNamespace ** ppNamespace,
|
||||
FLMUINT uiMaxSearchSize = ~((FLMUINT)0));
|
||||
|
||||
RCODE pushNamespace(
|
||||
FLMUNICODE * puzPrefix,
|
||||
FLMUNICODE * puzNamespaceURI);
|
||||
|
||||
RCODE pushNamespace(
|
||||
F_XMLNamespace * pNamespace);
|
||||
|
||||
void popNamespaces(
|
||||
FLMUINT uiCount);
|
||||
|
||||
FLMUINT getNamespaceCount( void)
|
||||
{
|
||||
return( m_uiNamespaceCount);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
F_XMLNamespace * m_pFirstNamespace;
|
||||
FLMUINT m_uiNamespaceCount;
|
||||
};
|
||||
|
||||
// Typedefs
|
||||
|
||||
typedef enum
|
||||
{
|
||||
XML_STATS
|
||||
} eXMLStatus;
|
||||
|
||||
// This callback is currently only used by the non-com utilities,
|
||||
// which is why we haven't bothered to make it an interface
|
||||
typedef RCODE (* XML_STATUS_HOOK)(
|
||||
eXMLStatus eStatusType,
|
||||
void * pvArg1,
|
||||
void * pvArg2,
|
||||
void * pvArg3,
|
||||
void * pvUserData);
|
||||
|
||||
/*============================================================================
|
||||
Desc: FLAIM's XML import class
|
||||
============================================================================*/
|
||||
class F_XMLImport : public F_XMLNamespaceMgr
|
||||
{
|
||||
public:
|
||||
|
||||
F_XMLImport();
|
||||
|
||||
~F_XMLImport();
|
||||
|
||||
RCODE setup( void);
|
||||
|
||||
void reset( void);
|
||||
|
||||
RCODE import(
|
||||
IF_IStream * pStream,
|
||||
F_Db * pDb,
|
||||
FLMUINT uiCollection,
|
||||
FLMUINT uiFlags,
|
||||
F_DOMNode * pNodeToLinkTo,
|
||||
eNodeInsertLoc eInsertLoc,
|
||||
F_DOMNode ** ppNewNode,
|
||||
XFLM_IMPORT_STATS * pImportStats);
|
||||
|
||||
FINLINE void setStatusCallback(
|
||||
XML_STATUS_HOOK fnStatus,
|
||||
void * pvUserData)
|
||||
{
|
||||
m_fnStatus = fnStatus;
|
||||
m_pvCallbackData = pvUserData;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
#define F_DEFAULT_NS_DECL 0x01
|
||||
#define F_PREFIXED_NS_DECL 0x02
|
||||
|
||||
typedef struct xmlattr
|
||||
{
|
||||
FLMUINT uiLineNum;
|
||||
FLMUINT uiLineOffset;
|
||||
FLMUINT uiLineFilePos;
|
||||
FLMUINT uiLineBytes;
|
||||
FLMUINT uiValueLineNum;
|
||||
FLMUINT uiValueLineOffset;
|
||||
FLMUNICODE * puzPrefix;
|
||||
FLMUNICODE * puzLocalName;
|
||||
FLMUNICODE * puzVal;
|
||||
FLMUINT uiFlags;
|
||||
xmlattr * pPrev;
|
||||
xmlattr * pNext;
|
||||
} XML_ATTR;
|
||||
|
||||
// Methods
|
||||
|
||||
RCODE getFieldTagAndType(
|
||||
FLMUNICODE * puzName,
|
||||
FLMBOOL bOkToAdd,
|
||||
FLMUINT * puiTagNum,
|
||||
FLMUINT * puiDataType);
|
||||
|
||||
RCODE getByte(
|
||||
FLMBYTE * pucByte);
|
||||
|
||||
FINLINE void ungetByte(
|
||||
FLMBYTE ucByte)
|
||||
{
|
||||
// Can only unget a single byte.
|
||||
|
||||
flmAssert( !m_ucUngetByte);
|
||||
m_ucUngetByte = ucByte;
|
||||
m_importStats.uiChars--;
|
||||
}
|
||||
|
||||
RCODE getLine( void);
|
||||
|
||||
FINLINE FLMUNICODE getChar( void)
|
||||
{
|
||||
if (m_uiCurrLineOffset == m_uiCurrLineNumChars)
|
||||
{
|
||||
return( (FLMUNICODE)0);
|
||||
}
|
||||
else
|
||||
{
|
||||
FLMUNICODE uzChar = m_puzCurrLineBuf [m_uiCurrLineOffset++];
|
||||
return( uzChar);
|
||||
}
|
||||
}
|
||||
|
||||
FINLINE FLMUNICODE peekChar( void)
|
||||
{
|
||||
if (m_uiCurrLineOffset == m_uiCurrLineNumChars)
|
||||
{
|
||||
return( (FLMUNICODE)0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return( m_puzCurrLineBuf [m_uiCurrLineOffset]);
|
||||
}
|
||||
}
|
||||
|
||||
FINLINE void ungetChar( void)
|
||||
{
|
||||
|
||||
// There should never be a reason to unget past the beginning of the current
|
||||
// line.
|
||||
|
||||
flmAssert( m_uiCurrLineOffset);
|
||||
m_uiCurrLineOffset--;
|
||||
}
|
||||
|
||||
RCODE getName(
|
||||
FLMUINT * puiChars);
|
||||
|
||||
RCODE getQualifiedName(
|
||||
FLMUINT * puiChars,
|
||||
FLMUNICODE ** ppuzPrefix,
|
||||
FLMUNICODE ** ppuzLocal,
|
||||
FLMBOOL * pbNamespaceDecl,
|
||||
FLMBOOL * pbDefaultNamespaceDecl);
|
||||
|
||||
void getNmtoken(
|
||||
FLMUINT * puiChars);
|
||||
|
||||
RCODE getPubidLiteral( void);
|
||||
|
||||
RCODE getSystemLiteral( void);
|
||||
|
||||
RCODE getElementValue(
|
||||
FLMUNICODE * puBuf,
|
||||
FLMUINT * puiMaxChars,
|
||||
FLMBOOL * pbEntity);
|
||||
|
||||
RCODE processEntityValue( void);
|
||||
|
||||
RCODE getEntity(
|
||||
FLMUNICODE * puBuf,
|
||||
FLMUINT * puiChars,
|
||||
FLMBOOL * pbTranslated,
|
||||
FLMUNICODE * puTransChar);
|
||||
|
||||
RCODE processReference(
|
||||
FLMUNICODE * puChar = NULL);
|
||||
|
||||
RCODE processCDATA(
|
||||
F_DOMNode * pParent,
|
||||
FLMUINT uiSavedLineNum,
|
||||
FLMUINT uiSavedOffset,
|
||||
FLMUINT uiSavedFilePos,
|
||||
FLMUINT uiSavedLineBytes);
|
||||
|
||||
RCODE processAttributeList( void);
|
||||
|
||||
RCODE processComment(
|
||||
F_DOMNode * pParent,
|
||||
FLMUINT uiSavedLineNum,
|
||||
FLMUINT uiSavedOffset,
|
||||
FLMUINT uiSavedFilePos,
|
||||
FLMUINT uiSavedLineBytes);
|
||||
|
||||
RCODE processProlog( void);
|
||||
|
||||
RCODE processXMLDecl( void);
|
||||
|
||||
RCODE processVersion( void);
|
||||
|
||||
RCODE processEncodingDecl( void);
|
||||
|
||||
RCODE processSDDecl( void);
|
||||
|
||||
RCODE processMisc( void);
|
||||
|
||||
RCODE processDocTypeDecl( void);
|
||||
|
||||
RCODE processPI(
|
||||
F_DOMNode * pParent,
|
||||
FLMUINT uiSavedLineNum,
|
||||
FLMUINT uiSavedOffset,
|
||||
FLMUINT uiSavedFilePos,
|
||||
FLMUINT uiSavedLineBytes);
|
||||
|
||||
RCODE processElement(
|
||||
F_DOMNode * pNodeToLinkTo,
|
||||
eNodeInsertLoc eInsertLoc,
|
||||
F_DOMNode ** ppNewNode);
|
||||
|
||||
RCODE unicodeToNumber64(
|
||||
FLMUNICODE * puzVal,
|
||||
FLMUINT64 * pui64Val,
|
||||
FLMBOOL * pbNeg);
|
||||
|
||||
RCODE flushElementValue(
|
||||
F_DOMNode * pParent,
|
||||
FLMBYTE * pucValue,
|
||||
FLMUINT uiValueLen);
|
||||
|
||||
RCODE getBinaryVal(
|
||||
FLMUINT * puiLength);
|
||||
|
||||
RCODE fixNamingTag(
|
||||
F_DOMNode * pNode);
|
||||
|
||||
FLMBOOL lineHasToken(
|
||||
const char * pszToken);
|
||||
|
||||
RCODE processMarkupDecl( void);
|
||||
|
||||
RCODE processPERef( void);
|
||||
|
||||
RCODE processElementDecl( void);
|
||||
|
||||
RCODE processEntityDecl( void);
|
||||
|
||||
RCODE processNotationDecl( void);
|
||||
|
||||
RCODE processAttListDecl( void);
|
||||
|
||||
RCODE processContentSpec( void);
|
||||
|
||||
RCODE processMixedContent( void);
|
||||
|
||||
RCODE processChildContent( void);
|
||||
|
||||
RCODE processAttDef( void);
|
||||
|
||||
RCODE processAttType( void);
|
||||
|
||||
RCODE processAttValue(
|
||||
XML_ATTR * pAttr);
|
||||
|
||||
RCODE processDefaultDecl( void);
|
||||
|
||||
RCODE processID(
|
||||
FLMBOOL bPublicId);
|
||||
|
||||
RCODE processSTag(
|
||||
F_DOMNode * pNodeToLinkTo,
|
||||
eNodeInsertLoc eInsertLoc,
|
||||
FLMBOOL * pbHasContent,
|
||||
F_DOMNode ** ppElement);
|
||||
|
||||
RCODE skipWhitespace(
|
||||
FLMBOOL bRequired);
|
||||
|
||||
RCODE resizeValBuffer(
|
||||
FLMUINT uiSize);
|
||||
|
||||
// Attribute management
|
||||
|
||||
void resetAttrList( void)
|
||||
{
|
||||
m_pFirstAttr = NULL;
|
||||
m_pLastAttr = NULL;
|
||||
m_attrPool.poolReset( NULL);
|
||||
}
|
||||
|
||||
RCODE allocAttribute(
|
||||
XML_ATTR ** ppAttr)
|
||||
{
|
||||
XML_ATTR * pAttr = NULL;
|
||||
RCODE rc = NE_SFLM_OK;
|
||||
|
||||
if( RC_BAD( rc = m_attrPool.poolCalloc(
|
||||
sizeof( XML_ATTR), (void **)&pAttr)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if( (pAttr->pPrev = m_pLastAttr) == NULL)
|
||||
{
|
||||
m_pFirstAttr = pAttr;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pLastAttr->pNext = pAttr;
|
||||
}
|
||||
|
||||
m_pLastAttr = pAttr;
|
||||
|
||||
Exit:
|
||||
|
||||
*ppAttr = pAttr;
|
||||
return( rc);
|
||||
}
|
||||
|
||||
RCODE setPrefix(
|
||||
XML_ATTR * pAttr,
|
||||
FLMUNICODE * puzPrefix)
|
||||
{
|
||||
RCODE rc = NE_SFLM_OK;
|
||||
FLMUINT uiStrLen;
|
||||
|
||||
if( !puzPrefix)
|
||||
{
|
||||
pAttr->puzPrefix = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
uiStrLen = f_unilen( puzPrefix);
|
||||
|
||||
if( RC_BAD( rc = m_attrPool.poolAlloc(
|
||||
sizeof( FLMUNICODE) * (uiStrLen + 1), (void **)&pAttr->puzPrefix)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
f_memcpy( pAttr->puzPrefix, puzPrefix,
|
||||
sizeof( FLMUNICODE) * (uiStrLen + 1));
|
||||
|
||||
Exit:
|
||||
|
||||
return( rc);
|
||||
}
|
||||
|
||||
RCODE setLocalName(
|
||||
XML_ATTR * pAttr,
|
||||
FLMUNICODE * puzLocalName)
|
||||
{
|
||||
RCODE rc = NE_SFLM_OK;
|
||||
FLMUINT uiStrLen;
|
||||
|
||||
if( !puzLocalName)
|
||||
{
|
||||
pAttr->puzLocalName = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
uiStrLen = f_unilen( puzLocalName);
|
||||
|
||||
if( RC_BAD( rc = m_attrPool.poolAlloc(
|
||||
sizeof( FLMUNICODE) * (uiStrLen + 1),
|
||||
(void **)&pAttr->puzLocalName)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
f_memcpy( pAttr->puzLocalName, puzLocalName,
|
||||
sizeof( FLMUNICODE) * (uiStrLen + 1));
|
||||
|
||||
Exit:
|
||||
|
||||
return( rc);
|
||||
}
|
||||
|
||||
RCODE setUnicode(
|
||||
XML_ATTR * pAttr,
|
||||
FLMUNICODE * puzUnicode)
|
||||
{
|
||||
RCODE rc = NE_SFLM_OK;
|
||||
FLMUINT uiStrLen;
|
||||
|
||||
if( !puzUnicode)
|
||||
{
|
||||
pAttr->puzVal = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
uiStrLen = f_unilen( puzUnicode);
|
||||
|
||||
if( RC_BAD( rc = m_attrPool.poolAlloc(
|
||||
sizeof( FLMUNICODE) * (uiStrLen + 1),
|
||||
(void **)&pAttr->puzVal)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
f_memcpy( pAttr->puzVal, puzUnicode,
|
||||
sizeof( FLMUNICODE) * (uiStrLen + 1));
|
||||
|
||||
Exit:
|
||||
|
||||
return( rc);
|
||||
}
|
||||
|
||||
RCODE addAttributesToElement(
|
||||
F_DOMNode * pElement);
|
||||
|
||||
FINLINE void setErrInfo(
|
||||
FLMUINT uiErrLineNum,
|
||||
FLMUINT uiErrLineOffset,
|
||||
XMLParseError eErrorType,
|
||||
FLMUINT uiErrLineFilePos,
|
||||
FLMUINT uiErrLineBytes)
|
||||
{
|
||||
m_importStats.uiErrLineNum = uiErrLineNum;
|
||||
m_importStats.uiErrLineOffset = uiErrLineOffset;
|
||||
m_importStats.eErrorType = eErrorType;
|
||||
m_importStats.uiErrLineFilePos = uiErrLineFilePos;
|
||||
m_importStats.uiErrLineBytes = uiErrLineBytes;
|
||||
}
|
||||
|
||||
// Data
|
||||
|
||||
F_Db * m_pDb;
|
||||
FLMUINT m_uiCollection;
|
||||
FLMBYTE m_ucUngetByte;
|
||||
FLMUNICODE * m_puzCurrLineBuf;
|
||||
FLMUINT m_uiCurrLineBufMaxChars;
|
||||
FLMUINT m_uiCurrLineNumChars;
|
||||
FLMUINT m_uiCurrLineOffset;
|
||||
FLMUINT m_uiCurrLineNum;
|
||||
FLMUINT m_uiCurrLineFilePos;
|
||||
FLMUINT m_uiCurrLineBytes;
|
||||
#define FLM_XML_MAX_CHARS 128
|
||||
FLMUNICODE m_uChars[ FLM_XML_MAX_CHARS];
|
||||
FLMBOOL m_bSetup;
|
||||
IF_IStream * m_pStream;
|
||||
FLMBYTE * m_pucValBuf;
|
||||
FLMUINT m_uiValBufSize; // Number of Unicode characters
|
||||
FLMUINT m_uiFlags;
|
||||
FLMBOOL m_bExtendDictionary;
|
||||
XMLEncoding m_eXMLEncoding;
|
||||
XML_STATUS_HOOK m_fnStatus;
|
||||
void * m_pvCallbackData;
|
||||
XFLM_IMPORT_STATS m_importStats;
|
||||
F_Pool m_tmpPool;
|
||||
|
||||
// Attribute management
|
||||
|
||||
XML_ATTR * m_pFirstAttr;
|
||||
XML_ATTR * m_pLastAttr;
|
||||
F_Pool m_attrPool;
|
||||
};
|
||||
|
||||
#define FLM_XML_EXTEND_DICT_FLAG 0x00000001
|
||||
#define FLM_XML_COMPRESS_WHITESPACE_FLAG 0x00000002
|
||||
#define FLM_XML_TRANSLATE_ESC_FLAG 0x00000004
|
||||
|
||||
FINLINE FLMBOOL isXMLNS(
|
||||
FLMUNICODE * puzName)
|
||||
{
|
||||
return( (puzName [0] == FLM_UNICODE_x || puzName [0] == FLM_UNICODE_X) &&
|
||||
(puzName [1] == FLM_UNICODE_m || puzName [1] == FLM_UNICODE_M) &&
|
||||
(puzName [2] == FLM_UNICODE_l || puzName [2] == FLM_UNICODE_L) &&
|
||||
(puzName [3] == FLM_UNICODE_n || puzName [3] == FLM_UNICODE_N) &&
|
||||
(puzName [4] == FLM_UNICODE_s || puzName [4] == FLM_UNICODE_S)
|
||||
? TRUE
|
||||
: FALSE);
|
||||
}
|
||||
|
||||
#endif // FXML_H
|
||||
454
sql/src/fxpath.h
454
sql/src/fxpath.h
@@ -1,454 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// Desc: This file contains the FLAIM XML import and export utility classes
|
||||
//
|
||||
// Tabs: 3
|
||||
//
|
||||
// Copyright (c) 1999-2006 Novell, Inc. All Rights Reserved.
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of version 2 of the GNU General Public
|
||||
// License as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, contact Novell, Inc.
|
||||
//
|
||||
// To contact Novell about this file by physical or electronic mail,
|
||||
// you may find current contact information at www.novell.com
|
||||
//
|
||||
// $Id: fxpath.h 3109 2006-01-19 13:07:07 -0700 (Thu, 19 Jan 2006) dsanders $
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef FXPATH_H
|
||||
#define FXPATH_H
|
||||
|
||||
typedef enum
|
||||
{
|
||||
UNKNOWN_TOKEN = 0, // 0
|
||||
OP_AND_TOKEN = XFLM_AND_OP, // 1
|
||||
OP_OR_TOKEN = XFLM_OR_OP, // 2
|
||||
OP_NOT_TOKEN = XFLM_NOT_OP, // 3
|
||||
OP_EQ_TOKEN = XFLM_EQ_OP, // 4
|
||||
OP_NE_TOKEN = XFLM_NE_OP, // 5
|
||||
OP_APPROX_EQ_TOKEN = XFLM_APPROX_EQ_OP, // 6
|
||||
OP_LT_TOKEN = XFLM_LT_OP, // 7
|
||||
OP_LE_TOKEN = XFLM_LE_OP, // 8
|
||||
OP_GT_TOKEN = XFLM_GT_OP, // 9
|
||||
OP_GE_TOKEN = XFLM_GE_OP, // 10
|
||||
OP_BITAND_TOKEN = XFLM_BITAND_OP, // 11
|
||||
OP_BITOR_TOKEN = XFLM_BITOR_OP, // 12
|
||||
OP_BITXOR_TOKEN = XFLM_BITXOR_OP, // 13
|
||||
OP_MULT_TOKEN = XFLM_MULT_OP, // 14
|
||||
OP_DIV_TOKEN = XFLM_DIV_OP, // 15
|
||||
OP_MOD_TOKEN = XFLM_MOD_OP, // 16
|
||||
OP_PLUS_TOKEN = XFLM_PLUS_OP, // 17
|
||||
OP_MINUS_TOKEN = XFLM_MINUS_OP, // 18
|
||||
OP_NEG_TOKEN = XFLM_NEG_OP, // 19
|
||||
OP_LPAREN_TOKEN = XFLM_LPAREN_OP, // 20
|
||||
OP_RPAREN_TOKEN = XFLM_RPAREN_OP, // 21
|
||||
OP_COMMA_TOKEN = XFLM_COMMA_OP, // 22
|
||||
OP_LBRACKET_TOKEN = XFLM_LBRACKET_OP, // 23
|
||||
OP_RBRACKET_TOKEN = XFLM_RBRACKET_OP, // 24
|
||||
OP_FSLASH_TOKEN, // 25
|
||||
OP_DOUBLE_FSLASH_TOKEN, // 26
|
||||
OP_UNION_TOKEN, // 27
|
||||
PERIOD_TOKEN, // 28
|
||||
DOUBLE_PERIOD_TOKEN, // 29
|
||||
COMMA_TOKEN, // 30
|
||||
DOUBLE_COLON_TOKEN, // 31
|
||||
NAME_TEST_WILD_TOKEN, // 32
|
||||
NAME_TEST_NCWILD_TOKEN, // 33
|
||||
NAME_TEST_QNAME_TOKEN, // 34
|
||||
NODE_TYPE_COMMENT_TOKEN, // 35
|
||||
NODE_TYPE_TEXT_TOKEN, // 36
|
||||
NODE_TYPE_PI_TOKEN, // 37
|
||||
NODE_TYPE_NODE_TOKEN, // 38
|
||||
AXIS_ANCESTOR_TOKEN, // 39
|
||||
AXIS_ANCESTOR_OR_SELF_TOKEN, // 40
|
||||
AXIS_ATTRIB_TOKEN, // 41
|
||||
AXIS_CHILD_TOKEN, // 42
|
||||
AXIS_DESCENDANT_TOKEN, // 43
|
||||
AXIS_DESCENDANT_OR_SELF_TOKEN, // 44
|
||||
AXIS_FOLLOWING_TOKEN, // 45
|
||||
AXIS_FOLLOWING_SIB_TOKEN, // 46
|
||||
AXIS_NAMESPACE_TOKEN, // 47
|
||||
AXIS_PARENT_TOKEN, // 48
|
||||
AXIS_PRECEDING_TOKEN, // 49
|
||||
AXIS_PRECEDING_SIB_TOKEN, // 50
|
||||
AXIS_SELF_TOKEN, // 51
|
||||
AXIS_ATSIGN_TOKEN, // 52
|
||||
AXIS_META_TOKEN, // 53
|
||||
LITERAL_TOKEN, // 54
|
||||
NUMBER_TOKEN, // 55
|
||||
VAR_REF_TOKEN, // 56
|
||||
LBRACE_TOKEN, // 57
|
||||
RBRACE_TOKEN, // 58
|
||||
FUNC_LAST_TOKEN, // 59
|
||||
FUNC_POSITION_TOKEN, // 60
|
||||
FUNC_COUNT_TOKEN, // 61
|
||||
FUNC_ID_TOKEN, // 62
|
||||
FUNC_LOCAL_NAME_TOKEN, // 63
|
||||
FUNC_NAMESPACE_URI_TOKEN, // 64
|
||||
FUNC_NAME_TOKEN, // 65
|
||||
FUNC_STRING_TOKEN, // 66
|
||||
FUNC_CONCAT_TOKEN, // 67
|
||||
FUNC_STARTS_WITH_TOKEN, // 68
|
||||
FUNC_CONTAINS_TOKEN, // 69
|
||||
FUNC_SUBSTR_BEFORE_TOKEN, // 70
|
||||
FUNC_SUBSTR_AFTER_TOKEN, // 71
|
||||
FUNC_SUBSTR_TOKEN, // 72
|
||||
FUNC_STR_LEN_TOKEN, // 73
|
||||
FUNC_NORM_SPACE_TOKEN, // 74
|
||||
FUNC_TRANSLATE_TOKEN, // 75
|
||||
FUNC_NOT_TOKEN, // 76
|
||||
FUNC_TRUE_TOKEN, // 77
|
||||
FUNC_FALSE_TOKEN, // 78
|
||||
FUNC_UNKNOWN_TOKEN, // 79
|
||||
FUNC_LANG_TOKEN, // 80
|
||||
FUNC_NUMBER_TOKEN, // 81
|
||||
FUNC_SUM_TOKEN, // 82
|
||||
FUNC_FLOOR_TOKEN, // 83
|
||||
FUNC_CEILING_TOKEN, // 84
|
||||
FUNC_ROUND_TOKEN, // 85
|
||||
BINARY_TOKEN, // 86
|
||||
FUNC_CB_TOKEN, // 87
|
||||
END_TOKEN // 88
|
||||
} eXPathTokenType;
|
||||
|
||||
class F_XPathBase : public F_Object
|
||||
{
|
||||
public:
|
||||
|
||||
FINLINE FLMBOOL isOperator(
|
||||
eXPathTokenType eType)
|
||||
{
|
||||
switch( eType)
|
||||
{
|
||||
case OP_AND_TOKEN:
|
||||
case OP_OR_TOKEN:
|
||||
case OP_MOD_TOKEN:
|
||||
case OP_DIV_TOKEN:
|
||||
case OP_MULT_TOKEN:
|
||||
case OP_FSLASH_TOKEN:
|
||||
case OP_DOUBLE_FSLASH_TOKEN:
|
||||
case OP_UNION_TOKEN:
|
||||
case OP_PLUS_TOKEN:
|
||||
case OP_MINUS_TOKEN:
|
||||
case OP_EQ_TOKEN:
|
||||
case OP_NE_TOKEN:
|
||||
case OP_LT_TOKEN:
|
||||
case OP_LE_TOKEN:
|
||||
case OP_GT_TOKEN:
|
||||
case OP_GE_TOKEN:
|
||||
return( TRUE);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return( FALSE);
|
||||
}
|
||||
|
||||
FINLINE FLMBOOL tokenCanHaveFlags(
|
||||
eXPathTokenType eType)
|
||||
{
|
||||
switch( eType)
|
||||
{
|
||||
case OP_EQ_TOKEN:
|
||||
case OP_NE_TOKEN:
|
||||
case OP_LT_TOKEN:
|
||||
case OP_LE_TOKEN:
|
||||
case OP_GT_TOKEN:
|
||||
case OP_GE_TOKEN:
|
||||
return( TRUE);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return( FALSE);
|
||||
}
|
||||
|
||||
FINLINE FLMBOOL isAxisSpecifier(
|
||||
eXPathTokenType eType)
|
||||
{
|
||||
switch( eType)
|
||||
{
|
||||
case AXIS_ANCESTOR_TOKEN:
|
||||
case AXIS_ANCESTOR_OR_SELF_TOKEN:
|
||||
case AXIS_ATTRIB_TOKEN:
|
||||
case AXIS_CHILD_TOKEN:
|
||||
case AXIS_DESCENDANT_TOKEN:
|
||||
case AXIS_DESCENDANT_OR_SELF_TOKEN:
|
||||
case AXIS_FOLLOWING_TOKEN:
|
||||
case AXIS_FOLLOWING_SIB_TOKEN:
|
||||
case AXIS_NAMESPACE_TOKEN:
|
||||
case AXIS_PARENT_TOKEN:
|
||||
case AXIS_PRECEDING_TOKEN:
|
||||
case AXIS_PRECEDING_SIB_TOKEN:
|
||||
case AXIS_SELF_TOKEN:
|
||||
case AXIS_ATSIGN_TOKEN:
|
||||
return( TRUE);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return( FALSE);
|
||||
}
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
Desc:
|
||||
******************************************************************************/
|
||||
class F_XPathToken : public F_XPathBase
|
||||
{
|
||||
public:
|
||||
|
||||
F_XPathToken()
|
||||
{
|
||||
m_pValBuf = NULL;
|
||||
m_uiValBufSize = 0;
|
||||
reset();
|
||||
}
|
||||
|
||||
~F_XPathToken()
|
||||
{
|
||||
if( m_pValBuf)
|
||||
{
|
||||
f_free( &m_pValBuf);
|
||||
}
|
||||
}
|
||||
|
||||
FINLINE void reset( void)
|
||||
{
|
||||
m_eTokenType = UNKNOWN_TOKEN;
|
||||
m_uiTokenFlags = 0;
|
||||
m_ui64Val = 0;
|
||||
m_puzPrefix = NULL;
|
||||
m_puzLocal = NULL;;
|
||||
}
|
||||
|
||||
FINLINE RCODE resizeBuffer(
|
||||
FLMUINT uiNewSize)
|
||||
{
|
||||
RCODE rc = NE_SFLM_OK;
|
||||
void * pOrigBuf = m_pValBuf;
|
||||
|
||||
if( !m_pValBuf)
|
||||
{
|
||||
if( RC_BAD( rc = f_alloc( uiNewSize, &m_pValBuf)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( RC_BAD( rc = f_realloc( uiNewSize, &m_pValBuf)))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if( m_puzPrefix)
|
||||
{
|
||||
m_puzPrefix = (FLMUNICODE *)(((FLMBYTE *)m_puzPrefix -
|
||||
(FLMBYTE *)pOrigBuf) + (FLMBYTE *)m_pValBuf);
|
||||
}
|
||||
|
||||
if( m_puzLocal)
|
||||
{
|
||||
m_puzLocal = (FLMUNICODE *)(((FLMBYTE *)m_puzLocal -
|
||||
(FLMBYTE *)pOrigBuf) + (FLMBYTE *)m_pValBuf);
|
||||
}
|
||||
}
|
||||
|
||||
m_uiValBufSize = uiNewSize;
|
||||
|
||||
Exit:
|
||||
|
||||
return( rc);
|
||||
}
|
||||
|
||||
FINLINE eXPathTokenType getType( void)
|
||||
{
|
||||
return( m_eTokenType);
|
||||
}
|
||||
|
||||
FINLINE FLMUNICODE * getPrefixPtr( void)
|
||||
{
|
||||
return( m_puzPrefix);
|
||||
}
|
||||
|
||||
FINLINE FLMUNICODE * getLocalPtr( void)
|
||||
{
|
||||
return( m_puzLocal);
|
||||
}
|
||||
|
||||
FINLINE FLMUINT64 getNumber( void)
|
||||
{
|
||||
return( m_ui64Val);
|
||||
}
|
||||
|
||||
FINLINE FLMUINT getTokenFlags( void)
|
||||
{
|
||||
return( m_uiTokenFlags);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
eXPathTokenType m_eTokenType;
|
||||
FLMUINT m_uiTokenFlags;
|
||||
void * m_pValBuf;
|
||||
FLMUINT m_uiValBufSize;
|
||||
FLMUINT m_uiValBufLen;
|
||||
FLMUINT64 m_ui64Val;
|
||||
FLMUNICODE * m_puzPrefix;
|
||||
FLMUNICODE * m_puzLocal;
|
||||
|
||||
friend class F_XPathTokenizer;
|
||||
friend class F_XPath;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
Desc:
|
||||
******************************************************************************/
|
||||
class F_XPathTokenizer : public F_XPathBase, public F_XMLNamespaceMgr
|
||||
{
|
||||
public:
|
||||
|
||||
F_XPathTokenizer()
|
||||
{
|
||||
m_pIStream = NULL;
|
||||
m_uiUngetCount = 0;
|
||||
m_eLastTokenType = UNKNOWN_TOKEN;
|
||||
}
|
||||
|
||||
~F_XPathTokenizer()
|
||||
{
|
||||
if( m_pIStream)
|
||||
{
|
||||
m_pIStream->Release();
|
||||
}
|
||||
}
|
||||
|
||||
RCODE setup(
|
||||
IF_IStream * pIStream);
|
||||
|
||||
RCODE getNextToken(
|
||||
F_XPathToken * pToken);
|
||||
|
||||
private:
|
||||
|
||||
RCODE skipWhitespace( void);
|
||||
|
||||
RCODE getChar(
|
||||
FLMUNICODE * puChar);
|
||||
|
||||
RCODE peekChar(
|
||||
FLMUNICODE * puChar);
|
||||
|
||||
RCODE ungetChar(
|
||||
FLMUNICODE uChar);
|
||||
|
||||
RCODE getNumber(
|
||||
F_XPathToken * pToken);
|
||||
|
||||
RCODE getName(
|
||||
F_XPathToken * pToken);
|
||||
|
||||
RCODE getBinary(
|
||||
F_XPathToken * pToken);
|
||||
|
||||
RCODE getLiteral(
|
||||
F_XPathToken * pToken);
|
||||
|
||||
IF_IStream * m_pIStream;
|
||||
eXPathTokenType m_eLastTokenType;
|
||||
FLMUINT m_uiUngetCount;
|
||||
#define XPATH_MAX_UNGET_CHARS 4
|
||||
FLMUNICODE m_uUngetBuf[ XPATH_MAX_UNGET_CHARS];
|
||||
};
|
||||
|
||||
class F_XPathExpr;
|
||||
class F_XPathPredicate;
|
||||
class F_XPathAxisProducer;
|
||||
class F_XPathStep;
|
||||
|
||||
/*****************************************************************************
|
||||
Desc:
|
||||
******************************************************************************/
|
||||
class F_XPath : public F_XPathBase, public F_XMLNamespaceMgr
|
||||
{
|
||||
public:
|
||||
|
||||
F_XPath()
|
||||
{
|
||||
}
|
||||
|
||||
~F_XPath()
|
||||
{
|
||||
}
|
||||
|
||||
RCODE parseQuery(
|
||||
F_Db * pDb,
|
||||
IF_IStream * pIStream,
|
||||
IF_Query * pQuery);
|
||||
|
||||
RCODE parseQuery(
|
||||
F_Db * pDb,
|
||||
char * pszQuery,
|
||||
IF_Query * pQuery);
|
||||
|
||||
private:
|
||||
|
||||
RCODE processFilterExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processPathExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processUnionExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processNodeTest(
|
||||
FLMBOOL bAttr,
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processStep(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processRelativeLocationPath(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processUnaryExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processOrExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processAndExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processEqualityExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processRelationalExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processAdditiveExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processMultiplicativeExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE processPrimaryExpr(
|
||||
F_XPathExpr ** ppExpr);
|
||||
|
||||
RCODE getNextToken( void);
|
||||
|
||||
F_XPathTokenizer m_tokenizer;
|
||||
F_XPathToken m_curToken;
|
||||
};
|
||||
|
||||
#endif // FXPATH_H
|
||||
Reference in New Issue
Block a user