124 lines
2.4 KiB
C++
124 lines
2.4 KiB
C++
/**
|
|
* @author Edouard DUPIN
|
|
*
|
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
*
|
|
* @license APACHE v2.0 (see license file)
|
|
*/
|
|
|
|
#include <exml/Node.h>
|
|
#include <exml/debug.h>
|
|
|
|
#undef __class__
|
|
#define __class__ "Node"
|
|
|
|
static bool isWhiteChar(char32_t _val) {
|
|
if( _val == ' '
|
|
|| _val == '\t'
|
|
|| _val == '\n'
|
|
|| _val == '\r') {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
std::ostream& exml::operator <<(std::ostream& _os, const exml::filePos& _obj) {
|
|
_os << "(l=";
|
|
_os << _obj.getLine();
|
|
_os << ",c=";
|
|
_os << _obj.getCol();
|
|
_os << ")";
|
|
return _os;
|
|
}
|
|
|
|
exml::Node::Node(const std::string& _value) :
|
|
m_pos(0,0),
|
|
m_value(_value) {
|
|
// nothing to do.
|
|
}
|
|
|
|
|
|
void exml::Node::addIndent(std::string& _data, int32_t _indent) const {
|
|
for (int32_t iii=0; iii<_indent; iii++) {
|
|
_data += "\t";
|
|
}
|
|
}
|
|
|
|
void exml::Node::drawElementParsed(char32_t _val, const exml::filePos& _filePos) const {
|
|
if (_val == '\n') {
|
|
EXML_DEBUG(_filePos << " parse '\\n'");
|
|
} else if (_val == '\t') {
|
|
EXML_DEBUG(_filePos << " parse '\\t'");
|
|
} else {
|
|
EXML_DEBUG(_filePos << " parse '" << _val << "'");
|
|
}
|
|
}
|
|
|
|
bool exml::Node::checkAvaillable(char32_t _val, bool _firstChar) const {
|
|
if( _val == '!'
|
|
|| _val == '"'
|
|
|| _val == '#'
|
|
|| _val == '$'
|
|
|| _val == '%'
|
|
|| _val == '&'
|
|
|| _val == '\'' // '
|
|
|| _val == '('
|
|
|| _val == ')'
|
|
|| _val == '*'
|
|
|| _val == '+'
|
|
|| _val == ','
|
|
|| _val == '/'
|
|
|| _val == ';'
|
|
|| _val == '<'
|
|
|| _val == '='
|
|
|| _val == '>'
|
|
|| _val == '?'
|
|
|| _val == '@'
|
|
|| _val == '['
|
|
|| _val == '\\'
|
|
|| _val == ']'
|
|
|| _val == '^'
|
|
|| _val == '`'
|
|
|| _val == '{'
|
|
|| _val == '|'
|
|
|| _val == '}'
|
|
|| _val == '~'
|
|
|| _val == ' '
|
|
|| _val == '\n'
|
|
|| _val == '\t'
|
|
|| _val == '\r') {
|
|
return false;
|
|
}
|
|
if (_firstChar == true) {
|
|
if( _val == '-'
|
|
|| _val == '.'
|
|
|| ( _val >= '0'
|
|
&& _val <= '9') ) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
int32_t exml::Node::countWhiteChar(const std::string& _data, int32_t _pos, exml::filePos& _filePos) const {
|
|
_filePos.clear();
|
|
int32_t white=0;
|
|
for (size_t iii=_pos; iii<_data.size(); iii++) {
|
|
_filePos.check(_data[iii]);
|
|
if(isWhiteChar(_data[iii]) == true) {
|
|
white++;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
--_filePos;
|
|
return white;
|
|
}
|
|
|
|
void exml::Node::clear() {
|
|
m_value = "";
|
|
m_pos.clear();
|
|
}
|
|
|