Files
Webcam/include/framework/metafile/nml_query.cpp

98 lines
2.4 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "metafile/nml.h"
#include "log/log.h"
using namespace GS;
using namespace GS::NML;
static bool MetatagNameCompare(const Tag *o, const String &name) { return o->name == name; }
//------------------------------------------------------------------------------
Tag *Tag::GetTagEx(const List <Tag *> &tg, const char *s, const File *, bool verbose)
{
if (!s)
return NULL;
const char *path = s;
const List <Tag *> *list = &tg;
Tag *tag = NULL;
while (s[0])
{
while (s[0] == ':')
s++;
if (s[0] == ';')
break;
const char *t = s;
while ((t[0] != ';') && (t[0] != ':') && t[0])
t++;
if (!t[0] && verbose)
{
if (t > s)
__LOG_W__ << "incomplete path '" << path << "' (missing ';').\n";
else __LOG_E__ << "unexpected end of path'" << path << "'.\n";
}
// No more node to search.
if (!list)
{
if (verbose)
__LOG_W__ << "'" << path << "' is deeper than lowest tree node.\n";
return NULL;
}
String node_name(s, t);
s = t;
tag = ListFindEx(*list, MetatagNameCompare, node_name);
if (tag == NULL)
{
if (verbose)
__LOG__ << "!! Error '" << node_name << "' in '" << path << "' not found.\n";
return NULL;
}
switch (tag->GetValue().GetType())
{
case Variant::VariantNone:
list = &tag->tags;
break;
default:
list = NULL;
break;
}
}
return tag;
}
Tag *Tag::GetTag(const char *path, const File *root, bool verbose) const
{
return GetTagEx(tags, path, root, verbose);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
Tag *Tag::GetTypedTag(const char *path, Variant::Type type, const File *root, bool verbose) const
{
Tag *t = Tag::GetTagEx(tags, path, root, verbose);
if ((!t) || (t->GetValue().GetType() != type))
return NULL;
return t;
}
Tag *File::GetTypedTag(const char *path, Variant::Type type, bool verbose) const
{
Tag *t = Tag::GetTagEx(tags, path, this, verbose);
if ((!t) || (t->GetValue().GetType() != type))
return NULL;
return t;
}
//------------------------------------------------------------------------------