eina: add Eina_Simple_Xml parser by Gustavo.

TODO: fix docs (but today, eina doc need some love again)
      use iconv and handle encoding (can get entity-to-utf8 from evas)
      description of what to do at :
http://marc.info/?l=enlightenment-devel&m=129975452006699&w=3

NOTE: this mean this API is not stable yet and will be broken soon.


SVN revision: 58387
This commit is contained in:
Cedric BAIL 2011-04-06 10:14:03 +00:00
parent fe933e7b34
commit 30fda98e76
7 changed files with 1441 additions and 3 deletions

View File

@ -37,3 +37,7 @@
* Use stringshare for eina_error messages
* add eina_error_find to match an error message with its Eina_Error
2011-04-06 Gustavo Sverzut Barbieri
* Add Simple XML parser API.

View File

@ -52,7 +52,8 @@ eina_inline_str.x \
eina_strbuf.h \
eina_ustrbuf.h \
eina_unicode.h \
eina_quadtree.h
eina_quadtree.h \
eina_simple_xml_parser.h
installed_mainheaderdir = $(includedir)/eina-@VMAJ@
dist_installed_mainheader_DATA = Eina.h eina_config.h

View File

@ -0,0 +1,145 @@
/* EINA - EFL data type library
* Copyright (C) 2011 Gustavo Sverzut Barbieri
* Cedric Bail
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library;
* if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EINA_SIMPLE_XML_H_
#define EINA_SIMPLE_XML_H_
#include "eina_config.h"
#include "eina_types.h"
#include "eina_magic.h"
#include "eina_inlist.h"
/**
* @addtogroup Eina_Tools_Group Tools
*
* @{
*/
/**
* @defgroup Eina_Simple_XML_Group Simple_XML
*
* @{
*/
typedef struct _Eina_Simple_XML_Node Eina_Simple_XML_Node;
typedef struct _Eina_Simple_XML_Node_Tag Eina_Simple_XML_Node_Root;
typedef struct _Eina_Simple_XML_Node_Tag Eina_Simple_XML_Node_Tag;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Data;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_CData;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Processing;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Doctype;
typedef struct _Eina_Simple_XML_Node_Data Eina_Simple_XML_Node_Comment;
typedef struct _Eina_Simple_XML_Attribute Eina_Simple_XML_Attribute;
struct _Eina_Simple_XML_Attribute
{
EINA_INLIST;
EINA_MAGIC;
Eina_Simple_XML_Node_Tag *parent;
const char *key;
const char *value;
};
typedef enum _Eina_Simple_XML_Node_Type
{
EINA_SIMPLE_XML_NODE_ROOT = 0,
EINA_SIMPLE_XML_NODE_TAG,
EINA_SIMPLE_XML_NODE_DATA,
EINA_SIMPLE_XML_NODE_CDATA,
EINA_SIMPLE_XML_NODE_PROCESSING,
EINA_SIMPLE_XML_NODE_DOCTYPE,
EINA_SIMPLE_XML_NODE_COMMENT
} Eina_Simple_XML_Node_Type;
struct _Eina_Simple_XML_Node
{
EINA_INLIST;
EINA_MAGIC;
Eina_Simple_XML_Node_Tag *parent;
Eina_Simple_XML_Node_Type type;
};
struct _Eina_Simple_XML_Node_Tag
{
Eina_Simple_XML_Node base;
Eina_Inlist *children;
Eina_Inlist *attributes;
const char *name;
};
struct _Eina_Simple_XML_Node_Data
{
Eina_Simple_XML_Node base;
size_t length;
char data[];
};
typedef enum _Eina_Simple_XML_Type
{
EINA_SIMPLE_XML_OPEN = 0, /* <tag attribute="value"> */
EINA_SIMPLE_XML_OPEN_EMPTY, /* <tag attribute="value" /> */
EINA_SIMPLE_XML_CLOSE, /* </tag> */
EINA_SIMPLE_XML_DATA, /* tag text data */
EINA_SIMPLE_XML_CDATA, /* <![CDATA[something]]> */
EINA_SIMPLE_XML_ERROR, /* error contents */
EINA_SIMPLE_XML_PROCESSING, /* <?xml ... ?> <?php .. ?> */
EINA_SIMPLE_XML_DOCTYPE, /* <!DOCTYPE html */
EINA_SIMPLE_XML_COMMENT, /* <!-- something --> */
EINA_SIMPLE_XML_IGNORED /* whatever is ignored by parser, like whitespace */
} Eina_Simple_XML_Type;
typedef Eina_Bool (*Eina_Simple_XML_Cb)(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offset, unsigned length);
typedef Eina_Bool (*Eina_Simple_XML_Attribute_Cb)(void *data, const char *key, const char *value);
EAPI Eina_Bool eina_simple_xml_parse(const char *buf, unsigned buflen,
Eina_Bool strip,
Eina_Simple_XML_Cb func, const void *data);
EAPI const char * eina_simple_xml_tag_attributes_find(const char *buf, unsigned buflen);
EAPI Eina_Bool eina_simple_xml_attributes_parse(const char *buf, unsigned buflen,
Eina_Simple_XML_Attribute_Cb func, const void *data);
EAPI Eina_Simple_XML_Attribute * eina_simple_xml_attribute_new(Eina_Simple_XML_Node_Tag *parent, const char *key, const char *value);
EAPI void eina_simple_xml_attribute_free(Eina_Simple_XML_Attribute *attr);
EAPI Eina_Simple_XML_Node_Tag * eina_simple_xml_node_tag_new(Eina_Simple_XML_Node_Tag *parent, const char *name);
EAPI void eina_simple_xml_node_tag_free(Eina_Simple_XML_Node_Tag *tag);
EAPI Eina_Simple_XML_Node_Data * eina_simple_xml_node_data_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length);
EAPI void eina_simple_xml_node_data_free(Eina_Simple_XML_Node_Data *node);
EAPI Eina_Simple_XML_Node_CData * eina_simple_xml_node_cdata_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length);
EAPI void eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node);
EAPI Eina_Simple_XML_Node_Processing * eina_simple_xml_node_processing_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length);
EAPI void eina_simple_xml_node_processing_free(Eina_Simple_XML_Node_Data *node);
EAPI Eina_Simple_XML_Node_Doctype * eina_simple_xml_node_doctype_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length);
EAPI void eina_simple_xml_node_doctype_free(Eina_Simple_XML_Node_Data *node);
EAPI Eina_Simple_XML_Node_Comment * eina_simple_xml_node_comment_new(Eina_Simple_XML_Node_Tag *parent, const char *contents, size_t length);
EAPI void eina_simple_xml_node_comment_free(Eina_Simple_XML_Node_Data *node);
EAPI Eina_Simple_XML_Node_Root * eina_simple_xml_node_load(const char *buf, unsigned buflen, Eina_Bool strip);
EAPI void eina_simple_xml_node_root_free(Eina_Simple_XML_Node_Root *root);
EAPI char * eina_simple_xml_node_dump(Eina_Simple_XML_Node *node, const char *indent);
#endif /* EINA_SIMPLE_XML_H_ */

View File

@ -45,7 +45,8 @@ eina_tiler.c \
eina_unicode.c \
eina_ustrbuf.c \
eina_ustringshare.c \
eina_value.c
eina_value.c \
eina_simple_xml_parser.c
if EINA_HAVE_WIN32
base_sources += eina_file_win32.c

View File

@ -123,6 +123,7 @@ static HANDLE _mutex = NULL;
S(strbuf);
S(ustrbuf);
S(quadtree);
S(simple_xml);
#undef S
struct eina_desc_setup
@ -154,7 +155,8 @@ static const struct eina_desc_setup _eina_desc_setup[] = {
S(rectangle),
S(strbuf),
S(ustrbuf),
S(quadtree)
S(quadtree),
S(simple_xml)
#undef S
};
static const size_t _eina_desc_setup_len = sizeof(_eina_desc_setup) /

View File

@ -90,6 +90,10 @@
#define EINA_MAGIC_QUADTREE_ROOT 0x98761252
#define EINA_MAGIC_QUADTREE_ITEM 0x98761253
#define EINA_MAGIC_SIMPLE_XML_TAG 0x98761260
#define EINA_MAGIC_SIMPLE_XML_DATA 0x98761261
#define EINA_MAGIC_SIMPLE_XML_ATTRIBUTE 0x98761262
/* undef the following, we want out version */
#undef FREE
#define FREE(ptr) \

File diff suppressed because it is too large Load Diff