int XmlPullParser::next()

in src/xml/tspp/XmlPullParser.cpp [321:406]


int XmlPullParser::next()
{
	reset();
	if (parse() != -1) {
		if (STag == event || EmptyElemTag == event || ETag == event) {
			TOKEN *p= token->get();
			int ii= 0;
			if (p->type == TOKEN::Prefix) {
				_ns= 0xffff;
				name= 1;
				p += 2;
				ii += 2;
			}
			else {
				_ns = -1;
				name= 0;
				p++;
				ii++;
			}
			if (ETag == event)
				return event;
			int count= token->count();
			while (ii < count) {
				if (p->type == TOKEN::Prefix) {
					if (!p->compare("xmlns", 5)) {
						NAMESPACE &n= ns->append();
						p++;
						n.prefix= p->toString();
						p++;
						n.uri= p->toString();
						p++;
						ii += 3;					
					}
					else {
						ATTR &a= attr->append();
						a.prefix= ii++;
						a.name= ii++;
						a.value= ii++;
						a.ns= -1;
						p += 3;
					}					
				}
				else {
					if (!p->compare("xmlns", 5)) {
						NAMESPACE &n= ns->append();
						n.prefix= NULL;
						p++;
						n.uri= p->toString();
						p++;
						ii += 2;					
					}
					else {
						ATTR &a= attr->append();
						a.prefix= -1;
						a.name= ii++;
						a.value= ii++;
						a.ns= -1;						
						p += 2;
					}
				}
			}
			if (depth->count()) {
				DEPTH &l= depth->getLast();			
				DEPTH &m= depth->append();
				m.first= l.first+l.count;
				m.total= ns->count();
				m.count= m.total-l.total;			
			}
			else {
				DEPTH &m= depth->append();
				m.first= 0;
				m.total= ns->count();
				m.count= m.total;			
			}
			_ns= resolve(_ns == -1 ? NULL : token->get());
		}
        else if (XMLDecl == event) 
        {
            //Do not return this event. Process it for internal use only
            //Get and return next event.
            return next();
        }
		return event;
	}
	return -1;
}