34 #include "gwenhywfar/debug.h"
35 #include "gwenhywfar/misc.h"
36 #include "gwenhywfar/text.h"
37 #include "gwenhywfar/path.h"
68 assert(ctx->_refCount);
69 if (ctx->_refCount==1) {
83 assert(ctx->_refCount);
136 return ctx->finishedElements;
143 ctx->finishedElements++;
150 ctx->finishedElements=0;
164 return ctx->currentNode;
171 ctx->currentHeader=n;
178 return ctx->currentHeader;
237 of=ctx->addCommentFn;
249 return ctx->startTagFn(ctx, tagName);
262 return ctx->endTagFn(ctx, closing);
275 return ctx->addDataFn(ctx, data);
287 if (ctx->addCommentFn)
288 return ctx->addCommentFn(ctx, data);
298 const char *attrName,
299 const char *attrData) {
303 return ctx->addAttrFn(ctx, attrName, attrData);
354 else if (strcasecmp(tagName,
"!DOCTYPE")==0) {
363 else if (*tagName==
'/') {
374 if (strcasecmp(s, tagName)!=0) {
377 "Endtag does not match curent tag (%s != %s)", s, tagName);
386 if (strcasecmp(s, tagName)==0)
442 closing?
"closing":
"not closing");
490 uint8_t *lastBlankPos;
495 if (!(flags & GWEN_XML_FLAGS_KEEP_BLANKS)) {
496 if (flags & GWEN_XML_FLAGS_KEEP_CNTRL) {
497 while(*src && (*src==32 || *src==9))
501 while(*src && *src<33)
512 for (i=0; i<size; i++) {
516 if (!(flags & GWEN_XML_FLAGS_KEEP_CNTRL) && c<32)
520 if (!(flags & GWEN_XML_FLAGS_NO_CONDENSE) && c==32) {
566 const char *attrName,
567 const char *attrData) {
577 int isNormalProperty=1;
586 if (strcasecmp(attrName,
"xmlns")==0) {
596 else if (strncasecmp(attrName,
"xmlns:", 6)==0) {
599 name=strchr(attrName,
':');
616 if (isNormalProperty) {
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
struct GWEN_XMLNODE_NAMESPACE GWEN_XMLNODE_NAMESPACE
void GWEN_XMLNode_AddHeader(GWEN_XMLNODE *n, GWEN_XMLNODE *nh)
#define GWEN_INHERIT_FINI(t, element)
#define GWEN_ERROR_INVALID
GWEN_XMLCTX_ADDATTR_FN GWEN_XmlCtx_SetAddAttrFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ADDATTR_FN f)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
GWEN_XMLCTX_STARTTAG_FN GWEN_XmlCtx_SetStartTagFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_STARTTAG_FN f)
int(* GWEN_XMLCTX_ADDCOMMENT_FN)(GWEN_XML_CONTEXT *ctx, const char *data)
#define GWEN_XML_FLAGS_KEEP_BLANKS
#define GWEN_FREE_OBJECT(varname)
void GWEN_XmlCtx_ResetFinishedElement(GWEN_XML_CONTEXT *ctx)
#define DBG_VERBOUS(dbg_logger, format, args...)
int GWEN_XmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
void GWEN_XMLNode_SetProperty(GWEN_XMLNODE *n, const char *name, const char *value)
int GWEN_XmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
GWEN_XML_CONTEXT * GWEN_XmlCtx_new(uint32_t flags)
GWEN_XMLCTX_ENDTAG_FN GWEN_XmlCtx_SetEndTagFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ENDTAG_FN f)
void GWEN_XMLNode_AddNameSpace(GWEN_XMLNODE *n, const GWEN_XMLNODE_NAMESPACE *ns)
int GWEN_XmlCtx_GetDepth(const GWEN_XML_CONTEXT *ctx)
void GWEN_XmlCtx_Attach(GWEN_XML_CONTEXT *ctx)
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
void GWEN_XMLNode_NameSpace_free(GWEN_XMLNODE_NAMESPACE *ns)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
uint32_t GWEN_XmlCtx_GetFinishedElement(const GWEN_XML_CONTEXT *ctx)
GWEN_XMLNODE_NAMESPACE * GWEN_XMLNode_NameSpace_new(const char *name, const char *url)
void GWEN_XmlCtx_free(GWEN_XML_CONTEXT *ctx)
#define GWEN_ERROR_BAD_DATA
#define GWEN_NEW_OBJECT(typ, varname)
void GWEN_XmlCtx_SetCurrentHeader(GWEN_XML_CONTEXT *ctx, GWEN_XMLNODE *n)
int GWEN_XmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
int GWEN_XmlCtxStore_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName)
#define GWEN_XML_FLAGS_NO_CONDENSE
int(* GWEN_XMLCTX_ADDATTR_FN)(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
void GWEN_XmlCtx_SetDepth(GWEN_XML_CONTEXT *ctx, int i)
int GWEN_XmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data)
GWEN_XMLCTX_ADDCOMMENT_FN GWEN_XmlCtx_SetAddCommentFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ADDCOMMENT_FN f)
void GWEN_XmlCtx_IncDepth(GWEN_XML_CONTEXT *ctx)
#define GWEN_XML_FLAGS_TOLERANT_ENDTAGS
void GWEN_XmlCtx_IncFinishedElement(GWEN_XML_CONTEXT *ctx)
GWEN_XMLNODE * GWEN_XmlCtx_GetCurrentHeader(const GWEN_XML_CONTEXT *ctx)
GWEN_XML_CONTEXT * GWEN_XmlCtxStore_new(GWEN_XMLNODE *n, uint32_t flags)
#define GWEN_INHERIT_INIT(t, element)
int GWEN_Text_UnescapeXmlToBuffer(const char *src, GWEN_BUFFER *buf)
int GWEN_XmlCtxStore_AddComment(GWEN_UNUSED GWEN_XML_CONTEXT *ctx, GWEN_UNUSED const char *data)
void GWEN_XmlCtx_SetFlags(GWEN_XML_CONTEXT *ctx, uint32_t f)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
#define GWEN_XML_FLAGS_KEEP_CNTRL
GWEN_XMLNODE * GWEN_XMLNode_GetParent(const GWEN_XMLNODE *n)
int GWEN_XmlCtxStore_AddAttr(GWEN_XML_CONTEXT *ctx, const char *attrName, const char *attrData)
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
int GWEN_XmlCtx_DecDepth(GWEN_XML_CONTEXT *ctx)
uint32_t GWEN_XmlCtx_GetFlags(const GWEN_XML_CONTEXT *ctx)
void GWEN_XmlCtx_SetCurrentNode(GWEN_XML_CONTEXT *ctx, GWEN_XMLNODE *n)
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
int(* GWEN_XMLCTX_ADDDATA_FN)(GWEN_XML_CONTEXT *ctx, const char *data)
#define DBG_INFO(dbg_logger, format, args...)
int GWEN_XmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data)
GWEN_XMLCTX_ADDDATA_FN GWEN_XmlCtx_SetAddDataFn(GWEN_XML_CONTEXT *ctx, GWEN_XMLCTX_ADDDATA_FN f)
int GWEN_XmlCtxStore_EndTag(GWEN_XML_CONTEXT *ctx, int closing)
int(* GWEN_XMLCTX_ENDTAG_FN)(GWEN_XML_CONTEXT *ctx, int closing)
#define GWEN_XML_FLAGS_HANDLE_HEADERS
#define GWEN_XML_FLAGS_HANDLE_NAMESPACES
int(* GWEN_XMLCTX_STARTTAG_FN)(GWEN_XML_CONTEXT *ctx, const char *tagName)
GWEN_XMLNODE * GWEN_XmlCtx_GetCurrentNode(const GWEN_XML_CONTEXT *ctx)
#define GWEN_INHERIT_FUNCTIONS(t)
struct GWEN__XMLNODE GWEN_XMLNODE
struct GWEN_XML_CONTEXT GWEN_XML_CONTEXT
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
int GWEN_XmlCtxStore_AddData(GWEN_XML_CONTEXT *ctx, const char *data)