Beispiel #1
0
int StartElement(struct XMLReader_t *r, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName, LPXMLVECTOR atts)
{
	union XMLReaderNode_t *rn = XMLVector_Append(r->eventbuffer, NULL);
	ASSERT_MEM_ABORT(rn);
	rn->type = XMLREADERTYPE_STARTELEMENT;
	
	ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[1], (XMLCH*)uri, rn->startelement.ibuf[0]));
	ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[1], (XMLCH*)localName, rn->startelement.ibuf[1]));
	ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[1], (XMLCH*)qName, rn->startelement.ibuf[2]));

	if (r->atts->length) ASSERT_MEM_ABORT(_XMLVector_RemoveAll(r->atts));

	if (atts->length) {
		struct XMLReaderAttribute_t *a;
		int i;		
		for (i=0; i<atts->length; i++) {
			LPXMLRUNTIMEATT aa = XMLVector_Get(atts, i);
			ASSERT_MEM_ABORT(a = XMLVector_Append(r->atts, NULL));
			ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[2], aa->uri, a->ibuf[0]));
			ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[2], aa->localName, a->ibuf[1]));
			ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[2], aa->qname, a->ibuf[2]));
			ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[2], aa->value, a->ibuf[3]));
		}
	}
	return XML_OK;
}
int StartElement(void *UserData, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName, LPXMLVECTOR atts)
{	
	LPXMLDTDVALIDATOR v = (LPXMLDTDVALIDATOR)UserData;
	if (!strcmp(uri, NSVALIDP->wantedUri)) {
		LPXMLVECTOR attsF;

		if (v->UserFlag) v->UserFlag = 0;
		NSVALIDP->elemCount++;
		
		if (!atts->length)
			attsF = atts;
		else {
			int i;
			LPXMLRUNTIMEATT a;
			
			if (NSVALIDP->filteredAtts->length) 
				_XMLVector_RemoveAll(NSVALIDP->filteredAtts);
			
			for (i=0; i<atts->length; i++) {
				a = XMLVector_Get(atts, i);
				if (!*a->uri || !strcmp(a->uri, NSVALIDP->wantedUri))
					a = XMLVector_Append(NSVALIDP->filteredAtts, a);
					ASSERT_MEM_ABORT(a);
			}
			attsF = NSVALIDP->filteredAtts;
		}
		
		return DTDValidate_StartElement(v, uri, localName, localName, attsF);
	}
	v->UserFlag++;
	return XML_OK;
}
int StartElement(void *UserData, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName, LPXMLVECTOR atts)
{	
	LPXMLDTDVALIDATOR v = (LPXMLDTDVALIDATOR)UserData;
	
	if (!strcmp(qName, "book")) {
		int ret;
		LPXMLRUNTIMEATT a; 
		/* append and initialize new book: */
		BOOKP->curBook = XMLVector_Append(BOOKP->books, NULL);
		ASSERT_MEM_ABORT(BOOKP->curBook);
		memset(BOOKP->curBook, 0, sizeof(struct tagBOOK));
		BOOKP->fld = -1;
		/* get book id: */
		a = XMLParser_GetNamedItem(v->parser, "id");
		/* a == NULL doesn't happen 'cos id is #REQUIRED */
		ret = sscanf(a->value, "bk%d", &BOOKP->curBook->id);
		ASSERT_SCANF_ABORT(ret, 1, a->qname);
	}
	else if (!strcmp(qName, "author")) BOOKP->fld = offsetof(BOOK, author);
	else if (!strcmp(qName, "title")) BOOKP->fld = offsetof(BOOK, title);
	else if (!strcmp(qName, "genre")) BOOKP->fld = offsetof(BOOK, genre);
	else if (!strcmp(qName, "price")) BOOKP->fld = offsetof(BOOK, price);
	else if (!strcmp(qName, "publish_date")) BOOKP->fld = offsetof(BOOK, publish_date);
	else if (!strcmp(qName, "description")) BOOKP->fld = offsetof(BOOK, description);
	return XML_OK;
}
Beispiel #4
0
static int CommonChars(struct XMLReader_t *r, int type, const XMLCH *chars, int cbSize)
{
	if (!r->buf[0].len) {
		union XMLReaderNode_t *rn = XMLVector_Append(r->eventbuffer, NULL);
		ASSERT_MEM_ABORT(rn);
		rn->type = type;
	}
	ASSERT_MEM_ABORT(XMLStringbuf_Append(&r->buf[0], (XMLCH*)chars, cbSize));
	return XML_OK;
}
Beispiel #5
0
int EndElement(struct XMLReader_t *r, const XMLCH *uri, const XMLCH *localName, const XMLCH *qName)
{	
	union XMLReaderNode_t *rn = XMLVector_Append(r->eventbuffer, NULL);
	ASSERT_MEM_ABORT(rn);
	rn->type = XMLREADERTYPE_ENDELEMENT;

	ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[1], (XMLCH*)uri, rn->endelement.ibuf[0]));
	ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[1], (XMLCH*)localName, rn->endelement.ibuf[1]));
	ASSERT_MEM_ABORT(IBUF_PUT(&r->buf[1], (XMLCH*)qName, rn->endelement.ibuf[2]));
	return XML_OK;
}
Beispiel #6
0
static struct FSAState *AddState(LPXMLDTDVALIDATOR p)
{
	struct FSAState **s2, *s = XMLPool_Alloc(p->StatePool);
	CHKMEM(s);
	s->mark = 0;
	s->trans = NULL;
	s2 = XMLVector_Append(p->fsa, NULL);
	CHKMEM(s2);
	*s2 = s;
	return s;
}
static int AddNextCatalog(LPXMLRUNTIMEATT cat)
{
	XMLCH **uri;
	ASSERT_MEM_ABORT(cat); /* shouldn't happen */
	if (!nextCatalog) {
		XMLVector_Create(&nextCatalog, 0, sizeof(char*));
		ASSERT_MEM_ABORT(nextCatalog);
	}
	uri = XMLVector_Append(nextCatalog, NULL);
	ASSERT_MEM_ABORT(uri);
	return GetUriAndBase(cat, uri);
}
Beispiel #8
0
static int Pi(struct XMLReader_t *r, const XMLCH *target, const XMLCH *data)
{	
	union XMLReaderNode_t *rn = XMLVector_Append(r->eventbuffer, NULL);
	int idata;
	ASSERT_MEM_ABORT(rn);
	rn->type = XMLREADERTYPE_PI;
	ASSERT_MEM_ABORT(XMLStringbuf_Append(&r->buf[0], (XMLCH*)target, strlen((const char*)target)+1));
	idata = r->buf[0].len;
	rn->pi.target = XMLStringbuf_Append(&r->buf[0], (XMLCH*)data, strlen((const char*)data)+1);
	ASSERT_MEM_ABORT(rn->pi.target);
	rn->pi.data = r->buf[0].str+idata;
	return XML_OK;
}
Beispiel #9
0
static struct FSATran *AddTran(struct FSAState *src, struct FSAState *dst, void *label)
{
	struct FSATran *t;
	if (!src->trans) {
		XMLVector_Create(&src->trans, 4, sizeof(struct FSATran));
		CHKMEM(src->trans);
	}
	t = XMLVector_Append(src->trans, NULL);
	CHKMEM(t);
	t->label = label;
	t->src = src;
	t->dst = dst;
	return t;
}
Beispiel #10
0
static int AddElementDecl(LPXMLDTDVALIDATOR vp, XMLCH *name, XMLCP *cm)
{
	struct ElementDecl *e;
	e = XMLVector_Append(vp->ElementDecls, NULL);
	if (!e) { 
		Er_(vp, NULL, ERR_XMLDTDV_MEMORY_ALLOC);
		return 0;
	}
	/* We set the initial startState value to SimpleState and not to NULL;
	this is good for types ANY, EMPTY or simple (#PCDATA) */
	e->startState = (struct FSAState*)SimpleState; 
	e->fsa = e->declAtts = NULL;
	e->name = name;
	e->type = cm->type;
	e->cp = cm;
	return 1;
}
static int AddUri(LPXMLVECTOR *v, LPXMLRUNTIMEATT idAtt)
{
	struct IDs *id;
	LPXMLRUNTIMEATT a;
		
	ASSERT_MEM_ABORT(idAtt); /* shouldn't happen */
	if (!*v) {
		XMLVector_Create(v, 0, sizeof(struct IDs));
		ASSERT_MEM_ABORT(*v);
	}
	id = XMLVector_Append(*v, NULL);
	ASSERT_MEM_ABORT(id);
	id->uri = NULL;
	id->id = strdup(idAtt->value);
	ASSERT_MEM_ABORT(id->id);
	a = XMLParser_GetNamedItem(parser, "uri");
	ASSERT_MEM_ABORT(a);
	return GetUriAndBase(a, &id->uri);
}
Beispiel #12
0
static int NFAtoDFA(LPXMLDTDVALIDATOR vp, struct ElementDecl *e)
{
	struct FSAState **sw, **s, **se;
	struct FSATran *t, *te;
	LPXMLVECTOR o;
	int i;

	XMLVector_Create(&o, 0, sizeof(struct FSAState*));
	if (!o) return 0;

	SET_SMARK(e->startState, SMARK_USEFUL, 1);

	se = (struct FSAState **)_XMLVector_GetIterP(e->fsa, s);
	for (;s!=se;s++) {
		if ((*s)->trans) {
			te = (struct FSATran *)_XMLVector_GetIterP((*s)->trans, t);
			for (; t!=te; t++) {
				if (t->label != epsilon) {
					SET_SMARK(t->dst, SMARK_USEFUL, 1);
				}
			}
		}
	}

	se = (struct FSAState **)_XMLVector_GetIterP(e->fsa, s);
	for (;s!=se;s++) {
		if ((*s)->mark & SMARK_USEFUL) {		
			SET_SMARK((*s), SMARK_INUSE, 1);
			if ((*s)->trans) {		
				for (i=0; i<(*s)->trans->length; i++) {		
					t = XMLVector_Get((*s)->trans, i);
					if (t->label == epsilon) {
						if (!AddEpsilonClosure(*s, t->dst)) return 0;
					}
				}
			}
			UnMarkFSA(e->fsa, SMARK_INUSE);
		}
	}

	se = (struct FSAState **)_XMLVector_GetIterP(e->fsa, s);
	for (;s!=se;s++) {
		if ((*s)->mark & SMARK_USEFUL) {
			if ((*s)->trans) {
				for (i=0; i<(*s)->trans->length; i++) {
					t = XMLVector_Get((*s)->trans, i);
					if (t->label == epsilon) {	
						if (!XMLVector_Remove((*s)->trans, i)) return 0;
						i--;
					}
				}
			}
			sw = XMLVector_Append(o, NULL);
			if (!sw) return 0;
			*sw = *s;
		}
		else if ((*s)->trans) {
			XMLVector_Free((*s)->trans);
		}
	}
	XMLVector_Free(e->fsa);
	e->fsa = o;
	return 1;
}