xmlparser.h
来自「用bcg库编写的java IDE 源码」· C头文件 代码 · 共 864 行 · 第 1/2 页
H
864 行
switch ( diff )
{
// no attribute case
case 0:
case 1:
case 2:
return false;
// no attribute case but has null tag
case 3:
return false;
}
// init attributes start, move past space after name
_attrStart = _nameEnd + 2;
// init attribute end move before right tag marker
// if null tag move before null tag marker
_attrEnd = _firstTagEnd - 1;
if ( hasNullTag() )
_attrEnd -= -1;
return true;
}
bool parseAttributes ( string & attributes )
{
// set name state
if ( !parseAttributes() )
return false;
attributes = getAttributes();
return true;
}
// data search methods
bool parseValue ()
{
// if first tag search failed show failed
if ( _firstTagStart < 0 || _lastTagEnd < 0 ||
_lastTagEnd <= _firstTagStart )
{
_valueStart = -1;
_valueEnd = -1;
return false;
}
// init value start/end positions
_valueStart = _firstTagEnd + 1;
_valueEnd = _lastTagStart - 1;
return true;
}
bool parseValue ( string & value )
{
// set name state
if ( !parseValue() )
return false;
value = getValue();
return true;
}
public:
// name access methods
char * getNamePos ()
{
if ( hasName() )
return _buffer + _nameStart;
else
return NULL;
}
bool hasName ()
{
if ( getNameLength() > 0 )
return true;
else
return false;
}
long getNameLength ()
{
long length = getLength(_nameStart,_nameEnd);
return length;
}
string getName ()
{
// get name length
long length = getNameLength();
// if length invalid show null string
// else get string
if ( length <= 0 )
return string("");
else
return substr(_nameStart,length);
}
// attribute access methods
char * getAttributesPos ()
{
if ( hasAttributes() )
return _buffer + _attrStart;
else
return NULL;
}
bool hasAttributes ()
{
if ( getValueLength() > 0 )
return true;
else
return false;
}
long getAttributesLength ()
{
long length = getLength(_attrStart,_attrEnd);
return length;
}
string getAttributes ()
{
// get attribute length
long length = getAttributesLength();
// if length invalid show null string
// else get string
if ( length <= 0 )
return string("");
else
return substr(_attrStart,length);
}
// value access methods
char * getValuePos ()
{
if ( hasValue() )
return _buffer + _valueStart;
else
return NULL;
}
bool hasValue ()
{
if ( getValueLength() > 0 )
return true;
else
return false;
}
long getValueLength ()
{
long length = getLength(_valueStart,_valueEnd);
return length;
}
string getValue ()
{
// get tag data length
long length = getValueLength();
// if length invalid show null string
// else get string
if ( length <= 0 )
return string("");
else
return substr(_valueStart,length);
}
char * getValueState ( long & valueLength )
{
// get value state
valueLength = getValueLength();
// return value buffer pos
return _buffer + _valueStart;
}
bool valueHasTag ()
{
// if find end tag
long pos = find( idTagLeft, _valueStart, getValueLength() );
// if found tag
if ( pos != -1 )
return true;
else
return false;
}
// tag access methods
long getTagLength ()
{
long length = getLength( _firstTagStart, _firstTagEnd );
return length;
}
long getLastTagLength ()
{
long length = getLength( _lastTagStart, _lastTagEnd );
return length;
}
bool hasTag ()
{
if ( getTagLength() > 0 )
return true;
else
return false;
}
bool hasLastTag ()
{
if ( getLastTagLength() > 0 )
return true;
else
return false;
}
char * getTagPos ()
{
if ( hasTag() )
return _buffer + _firstTagStart;
else
return NULL;
}
char * getLastTagPos ()
{
if ( hasTag() )
return _buffer + _lastTagStart;
else
return NULL;
}
string getTag ()
{
// get tag data length
long length = getTagLength();
return substr(_firstTagStart,length);
}
// string utility methods
long getLength ( long startPos,
long endPos )
{
// if positions invalid show no length
if ( startPos < 0 || endPos < 0 ||
endPos < startPos )
return 0;
// get length
long length = endPos - startPos + 1;
return length;
}
string ::iterator begin ()
{
string::iterator buf = _buffer;
return string::iterator(buf);
}
string ::iterator end ()
{
string::iterator buf = _buffer + _parseLength;
return string::iterator(buf);
}
long find ( char srchChar, long offset, long length = -1 )
{
// if no length set to length to
// end of parse buffer
if ( length == -1 )
length = getOffsetLength(offset);
// set start and end of search
string::iterator start = _buffer + offset;
string::iterator end = _buffer + (offset + length);
// search for it
string::iterator found = std::find( start, end, srchChar );
// if at end did not find it
if ( found >= end )
{
return -1;
}
else
{
// as a last check make sure found is valid
if ( found < start )
return -1;
// set position
long pos = (found - start);
pos += offset;
return pos;
}
}
long find ( char * srchStr, long offset, long length = -1 )
{
// if no length set to length to
// end of parse buffer
if ( length == -1 )
length = getOffsetLength(offset);
// set start and end of search
string::iterator start = _buffer + offset;
string::iterator end = _buffer + (offset + length);
string::iterator srchStart = srchStr;
string::iterator srchEnd = srchStr + strlen(srchStr);
// search for it
string::iterator found = std::search( start, end, srchStart, srchEnd );
// if at end did not find it
if ( found >= end )
{
return -1;
}
else
{
// as a last check make sure found is valid
if ( found < start )
return -1;
// set position
long pos = (found - start);
pos += offset;
return pos;
}
}
long find ( string & srchStr, long offset, long length = -1 )
{
// if no length set to length to
// end of parse buffer
if ( length == -1 )
length = getOffsetLength(offset);
// set start and end of search
string::iterator start = _buffer + offset;
string::iterator end = _buffer + (offset + length);
string::iterator srchStart = srchStr.begin();
string::iterator srchEnd = srchStr.end();
// search for it
string::iterator found = std::search( start, end, srchStart, srchEnd );
// if at end did not find it
if ( found >= end )
{
return -1;
}
else
{
// as a last check make sure found is valid
if ( found < start )
return -1;
// set position
long pos = (found - start);
pos += offset;
return pos;
}
}
long rfind ( char srchChar, long offset, long length )
{
// setup srch string
char srchStr[2];
srchStr[0] = srchChar;
srchStr[1] = '\0';
return rfind(srchStr,offset,length);
}
long rfind ( char * srchStr, long offset, long length )
{
/*
// set start and end of search
string::reverse_iterator revStart = _buffer + (offset + length)
string::reverse_iterator revEnd = _buffer + offset;
// search for it
string::reverse_iterator found = std::find( start, end, srchStr );
// get position
long pos = found - revStart;
*/
long pos = 0;
return pos;
}
string substr ( long offset, long length )
{
// get start of sub string
char * ptr = _buffer + offset;
// create string for it
string str;
str.assign( ptr, length );
return string(str);
}
};
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?