* OPT: Check if an element is self-closed only once when getting its string representation.

git-svn-id: svn://localhost/gambas/trunk@5574 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Adrien Prokopowicz 2013-03-04 04:29:20 +00:00
parent a300b16b36
commit 1df7e9baba
3 changed files with 15 additions and 7 deletions

View file

@ -28,10 +28,10 @@
/*************************************** Element ***************************************/
const char* Element::singleElements = "br\0hr\0area\0base\0br\0co\0command\0embed\0hr\0img\0input\0keygen\0link\0meta\0param\0source\0track\0wbr\0\0";
#define LEN_SINGLEELEMENTS 89
const char* Element::singleElements = "br\0img\0meta\0input\0area\0base\0co\0command\0embed\0hr\0keygen\0link\0param\0source\0track\0wbr\0\0";
#define LEN_SINGLEELEMENTS 84
Element::Element() : Node()
Element::Element() : Node(), single(undefined)
{
tagName = 0;
lenTagName = 0;
@ -44,7 +44,7 @@ Element::Element() : Node()
lenLocalName = 0;
}
Element::Element(const char *ntagName, size_t nlenTagName) : Node()
Element::Element(const char *ntagName, size_t nlenTagName) : Node(), single(undefined)
{
tagName = 0;
lenTagName = 0;
@ -101,8 +101,8 @@ void Element::setTagName(const char *ntagName, size_t nlenTagName)
lenTagName = nlenTagName;
tagName = (char*)realloc(tagName, sizeof(char) * lenTagName);
memcpy(tagName, ntagName, lenTagName);
refreshPrefix();
single = undefined;
refreshPrefix();
}
@ -162,6 +162,7 @@ void Element::refreshPrefix()
bool Element::isSingle()
{
if(single != undefined) return single;
const char *start = Element::singleElements;
char *end = (char*)memchr(start, 0, LEN_SINGLEELEMENTS);
unsigned char lenTag = end - start;
@ -172,6 +173,7 @@ bool Element::isSingle()
{
if(!memcmp(tagName, start, lenTagName))
{
single = true;
return true;
}
}
@ -181,6 +183,7 @@ bool Element::isSingle()
lenTag = end - start;
}
single = false;
return false;
}

View file

@ -63,6 +63,7 @@ public:
bool isSingle();
char *tagName;
size_t lenTagName;
undefbool single;
void setPrefix(const char *nprefix, size_t nlenPrefix);
char *prefix;

View file

@ -27,6 +27,10 @@
typedef unsigned int uint;
typedef char undefbool;//A boolean with an "undefined" state
#define undefined 2//The "undefined" state of an undefbool
#define DELETE(_ob) if(_ob) {delete _ob; _ob = 0;}
#define UNREF(_ob) if(_ob) GB.Unref(POINTER(&(_ob)))