Esempio n. 1
0
void XMLReader_Free(struct XMLReader_t *r) 
{
	int i;
	if (!r) return;
	if (r->parser) XMLParser_Free(r->parser);
	if (r->atts) XMLVector_Free(r->atts);
	if (r->eventbuffer) XMLVector_Free(r->eventbuffer);
	for (i=0; i<sizeof(r->buf)/sizeof(r->buf[0]); i++) {
		XMLStringbuf_Free(&r->buf[i]);
	}
	if (r->dtdv) XMLParser_FreeDTDValidator(r->dtdv);
	if (r->dynamicalloc) free(r);
}
Esempio n. 2
0
void vfilter_Cleanup(LPXMLDTDVALIDATOR dtd)
{
	if (dtd && filteredAtts) {
		XMLVector_Free(filteredAtts);
		filteredAtts = NULL;
	}
}
Esempio n. 3
0
static void FreeDTDValidator(LPXMLDTDVALIDATOR p, int ForReuse)
{
	if (p->ElementDecls) {
		struct ElementDecl *pEl, *pEnd;
		struct FSAState **pS, **pSEnd;
		pEnd = (struct ElementDecl *)_XMLVector_GetIterP(p->ElementDecls, pEl);
		for (; pEl!=pEnd; pEl++) {
			if (pEl->fsa) {
				pSEnd = (struct FSAState **)_XMLVector_GetIterP(pEl->fsa, pS);
				for (; pS!=pSEnd; pS++) {
					if ((*pS)->trans) XMLVector_Free((*pS)->trans);
				}
				XMLVector_Free(pEl->fsa);
			}
		}
		if (ForReuse) _XMLVector_RemoveAll(p->ElementDecls);
		else XMLVector_Free(p->ElementDecls);
	}
	
	/* these are allocated by the parser when XMLFLAG_REPORT_DTD_EXT
		is set, we're responsible for freeing them: */
	if (p->cpNodesPool) 
		XMLPool_FreePool(p->cpNodesPool);
	if (p->ElementTable) 
		XMLHTable_Destroy(p->ElementTable, NULL, 0);
	if (p->idTable)
		XMLHTable_Destroy(p->idTable, NULL, 0);

	if (ForReuse) {
		if (p->StatePool && p->StatePool->blocksAllocated) {
			XMLPool_FreePool(p->StatePool);
			p->StatePool = XMLPool_Create(sizeof(struct FSAState), 16);
			if (!p->StatePool) Er_(p, NULL, ERR_XMLDTDV_MEMORY_ALLOC);
		}
		return;
	}
	
	if (p->StatePool) 
		XMLPool_FreePool(p->StatePool);
	if (p->ContextStack) 
		XMLVector_Free(p->ContextStack);
	free(p);
}
Esempio n. 4
0
static void CleanupIds(LPXMLVECTOR v)
{	
	int i;
	for (i=0; i<v->length; i++) {
		struct IDs *id = XMLVector_Get(v, i);
		if (id->id) free(id->id);
		if (id->uri) free(id->uri);
	}
	XMLVector_Free(v);
}
Esempio n. 5
0
void Catalogs_Cleanup(void) 
{	
	if (publicIDS) CleanupIds(publicIDS);
	if (systemIDS) CleanupIds(systemIDS);
	if (nextCatalog) {
		int i;
		char **uri;
		for (i=0; i<nextCatalog->length; i++) {
			uri = XMLVector_Get(nextCatalog, i);
			if (*uri) free(*uri);
		}
		XMLVector_Free(nextCatalog);
	}
}
Esempio n. 6
0
LPXMLDTDVALIDATOR XMLAPI XMLParser_CreateDTDValidator(void)
{
	LPXMLDTDVALIDATOR v = malloc(sizeof(XMLDTDVALIDATOR));
	if (!v) return NULL;
	memset(v, 0, sizeof(XMLDTDVALIDATOR));
	XMLVector_Create(&v->ElementDecls, 16, sizeof(struct ElementDecl));
	if (!v->ElementDecls) goto ExitErr;
	XMLVector_Create(&v->ContextStack, 0, sizeof(struct vContext));
	if (!v->ContextStack) goto ExitErr;
	v->StatePool = XMLPool_Create(sizeof(struct FSAState), 16);
	if (!v->StatePool) goto ExitErr;
	v->startElementHandlerFilter = DTDValidate_StartElement;
	v->endElementHandlerFilter = DTDValidate_EndElement;
	v->charactersHandlerFilter = DTDValidate_Characters;
	v->ignorableWhitespaceHandlerFilter = DTDValidate_IgnorableWhitespace; 
	return v;

ExitErr:
	if (v->ElementDecls) XMLVector_Free(v->ElementDecls);
	if (v->ContextStack) XMLVector_Free(v->ContextStack);
	if (v->StatePool) XMLPool_FreePool(v->StatePool);
	free(v);
	return NULL;
}
Esempio n. 7
0
int main(int argc, char* argv[])
{	
	NSVALIDPARSER nsparser;
	LPXMLPARSER parser;	
	LPXMLDTDVALIDATOR vp;
	FILE *f;
	int i;
	XMLCH *filename = NULL;
	
	if (argc < 2 || argc > 4) goto USAGE;

	nsparser.elemCount = 0;
	nsparser.wantedUri = "";
	*nsparser.userDTD = '\0';
	*nsparser.base = '\0';
		
	for (i=1; i<argc; i++) {
		if (!strncmp(argv[i], "/DTD:", 5))
			strcpy(nsparser.userDTD, argv[i]+5);
		else if (!strncmp(argv[i], "/URI:", 5))
			nsparser.wantedUri = argv[i]+5;
		else {
			if (filename) goto USAGE;
			filename = argv[i];
		}
	}
	
	if (!filename) goto USAGE;
		
	if (!XMLParser_Create(&parser)) {
		puts("Out of memory!");
		return 1;
	}
	
	vp = XMLParser_CreateDTDValidator();
	if (!vp) {
		puts("Out of memory!");
		return 1;
	}

	if (!XMLVector_Create(&nsparser.filteredAtts, 0, sizeof(XMLRUNTIMEATT))) {
		puts("Out of memory!");
		return 1;
	}

	vp->UserData = &nsparser;
	parser->errorHandler = ErrorHandler;
	parser->resolveEntityHandler = ResolveEntity;
	parser->externalEntityParsedHandler = FreeInputData;

	if (*nsparser.userDTD) {
		int filepos = GetBaseDir(nsparser.base, nsparser.userDTD);
		if (filepos) strcpy(nsparser.userDTD, nsparser.userDTD+filepos);		
		XMLParser_SetExternalSubset(parser, NULL, nsparser.userDTD);
	}

	if (!*nsparser.base) 
		GetBaseDir(nsparser.base, filename);
	
	if (*nsparser.wantedUri) {
		vp->startElementHandlerFilter = StartElement;
		vp->endElementHandlerFilter = EndElement;
		vp->charactersHandlerFilter = Characters;
		vp->ignorableWhitespaceHandlerFilter = IgnorableWS;
	}
	else /* simple validator w/o namespace filter: */
		parser->startElementHandler = StartElementSimple;

	if (!(f = fopen(filename, "rb"))) {
		printf("Error opening file %s\n", filename);
		return 1;
	}
	
	if (XMLParser_ParseValidateDTD(vp, parser, cstream, f, 0)) {
		printf("Elements (total: %d) in namespace \"%s\" were valid\nin the" 
			" document %s\n", nsparser.elemCount, 
			((*nsparser.wantedUri) ? nsparser.wantedUri : "not specified"),
			filename);		
	}
		
	fclose(f);
	XMLVector_Free(nsparser.filteredAtts);
	XMLParser_FreeDTDValidator(vp);
	XMLParser_Free(parser);
	return 0;

USAGE:
	puts("Usage: nsvalid document.xml /DTD:<optional> /URI:<optional>\n"
		"Example: nsvalid my.xml /DTD:/home/my.dtd /URI:http://my.org");
	return 1;
}
Esempio n. 8
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;
}
Esempio n. 9
0
int main(int argc, char* argv[])
{	
	BOOKPARSER bparser;
	BOOK *b;
	LPXMLPARSER parser;	
	LPXMLDTDVALIDATOR vp;
	int i, success;
	
	if (!XMLParser_Create(&parser)) {
		puts("Error creating parser!");
		return 1;
	}
	
	vp = XMLParser_CreateDTDValidator();
	if (!vp) {
		puts("Error creating DTDValidator in main()");
		return 1;
	}
	
	if (!XMLVector_Create(&bparser.books, 6, sizeof(BOOK))) {
		puts("Error creating books vector in main()");
		return 1;
	}
	
	/* init Stringbuf: blockSize 256, no pre-allocation: */
	XMLStringbuf_Init(&bparser.textBuf, 256, 0);

	vp->UserData = &bparser;
	
	parser->errorHandler = ErrorHandler;
	parser->startElementHandler = StartElement;
	parser->endElementHandler = EndElement;
	parser->charactersHandler = Characters;

	success = XMLParser_ParseValidateDTD(vp, parser, cstream, stdin, 0);
				
	for (i=0; i<bparser.books->length; i++) {
		b = XMLVector_Get(bparser.books, i);
		if (success)
			printf("id: %d\n"
			   "author: %s\n"
			   "title: %s\n"
			   "genre: %s\n"
			   "price: %f\n"
			   "publish_date: %s\n"
			   "description: %s\n\n",
			   b->id, b->author, b->title, b->genre, 
			   b->price, b->publish_date, b->description
			);
		SAFE_FREE(b->author);
		SAFE_FREE(b->title);
		SAFE_FREE(b->genre);
		SAFE_FREE(b->publish_date);
		SAFE_FREE(b->description);
	}
	
	XMLParser_FreeDTDValidator(vp);
	XMLParser_Free(parser);	
	XMLStringbuf_Free(&bparser.textBuf);
	XMLVector_Free(bparser.books);
	return 0;
}