Download NHK English news podcast automatically. XML Parser "spxml" is used. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/
Dependencies: BlinkLed HTTPClient EthernetInterface FatFileSystemCpp MSCFileSystem spxml mbed-rtos mbed
Fork of mpod_nhk_english by
Download NHK English news podcast automatically.
XML Parser "spxml" is used.
This application requires mpod mother board.
See also http://mbed.org/users/geodenx/notebook/mpod/
Diff: spxml/spxmlparser.cpp
- Revision:
- 8:a9541e8897f5
- Parent:
- 7:ad9fcf0e1bc5
--- a/spxml/spxmlparser.cpp Sat Sep 01 04:09:48 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,219 +0,0 @@ -/* - * Copyright 2007 Stephen Liu - * For license terms, see the file COPYING along with this library. - */ - -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <typeinfo> -#include "strdup.h" - -#include "spxmlparser.hpp" -#include "spxmlreader.hpp" -#include "spxmlutils.hpp" -#include "spxmlevent.hpp" -#include "spxmlcodec.hpp" - -SP_XmlPullParser :: SP_XmlPullParser() -{ - mReaderPool = new SP_XmlReaderPool(); - mReader = getReader( SP_XmlReader::eLBracket ); - mEventQueue = new SP_XmlPullEventQueue(); - mEventQueue->enqueue( new SP_XmlStartDocEvent() ); - - mRootTagState = eRootNone; - mTagNameStack = new SP_XmlArrayList(); - mLevel = 0; - - mIgnoreWhitespace = 1; - - mError = NULL; - - memset( mErrorSegment, 0, sizeof( mErrorSegment ) ); - mErrorIndex = 0; - mRowIndex = mColIndex = 0; - - memset( mEncoding, 0, sizeof( mEncoding ) ); -} - -SP_XmlPullParser :: ~SP_XmlPullParser() -{ - mReaderPool->save( mReader ); - - for( int i = 0; i < mTagNameStack->getCount(); i++ ) { - free( (char*)mTagNameStack->getItem( i ) ); - } - delete mTagNameStack; - - delete mEventQueue; - - delete mReaderPool; - - if( NULL != mError ) free( mError ); -} - -const char * SP_XmlPullParser :: getEncoding() -{ - if( '\0' == mEncoding[0] ) { - return SP_XmlStringCodec::DEFAULT_ENCODING; - } - - return mEncoding; -} - -int SP_XmlPullParser :: append( const char * source, int len ) -{ - if( NULL != mError ) return 0; - - int consumed = 0; - - for( int i = 0; i < len && NULL == mError; i++ ) { - - consumed++; - - char c = source[ i ]; - - mErrorSegment[ mErrorIndex++ % sizeof( mErrorSegment ) ] = c; - mReader->read( this, c ); - if( '\n' == c ) { - mRowIndex++; - mColIndex = 0; - } else { - mColIndex++; - } - } - - return consumed; -} - -SP_XmlPullEvent * SP_XmlPullParser :: getNext() -{ - SP_XmlPullEvent * event = mEventQueue->dequeue(); - - if( NULL != event ) { - if( SP_XmlPullEvent::eStartTag == event->getEventType() ) mLevel++; - if( SP_XmlPullEvent::eEndTag == event->getEventType() ) mLevel--; - } - - return event; -} - -int SP_XmlPullParser :: getLevel() -{ - return mLevel; -} - -void SP_XmlPullParser :: setIgnoreWhitespace( int ignoreWhitespace ) -{ - mIgnoreWhitespace = ignoreWhitespace; -} - -int SP_XmlPullParser :: getIgnoreWhitespace() -{ - return mIgnoreWhitespace; -} - -const char * SP_XmlPullParser :: getError() -{ - return mError; -} - -void SP_XmlPullParser :: changeReader( SP_XmlReader * reader ) -{ - SP_XmlPullEvent * event = mReader->getEvent( this ); - if( NULL != event ) { - if( SP_XmlPullEvent::eStartTag == event->getEventType() ) { - if( eRootNone == mRootTagState ) mRootTagState = eRootStart; - const char * name = ((SP_XmlStartTagEvent*)event)->getName(); - mTagNameStack->append( strdup( name ) ); - } - if( SP_XmlPullEvent::eEndTag == event->getEventType() ) { - char error[ 256 ] = { 0 }; - - const char * etag = ((SP_XmlEndTagEvent*)event)->getText(); - char * stag = (char*)mTagNameStack->takeItem( SP_XmlArrayList::LAST_INDEX ); - if( NULL != stag ) { - if( 0 != strcmp( stag, etag ) ) { - snprintf( error, sizeof( error ), - "mismatched tag, start-tag <%s>, end-tag <%s>", stag, etag ); - } - free( stag ); - } else { - snprintf( error, sizeof( error ), - "mismatched tag, start-tag <NULL>, end-tag <%s>", etag ); - } - - if( '\0' != *error ) { - setError( error ); - delete event; - event = NULL; - } - } - - if( NULL != event ) { - if( SP_XmlPullEvent::eDocDecl == event->getEventType() ) { - snprintf( mEncoding, sizeof( mEncoding ), "%s", - ((SP_XmlDocDeclEvent*)event)->getEncoding() ); - } - mEventQueue->enqueue( event ); - if( mTagNameStack->getCount() <= 0 && eRootStart == mRootTagState ) { - mRootTagState = eRootEnd; - mEventQueue->enqueue( new SP_XmlEndDocEvent() ); - } - } - } - - //printf( "\nchange: %s -> %s\n", typeid( *mReader ).name(), typeid( *reader ).name() ); - - mReaderPool->save( mReader ); - mReader = reader; -} - -SP_XmlReader * SP_XmlPullParser :: getReader( int type ) -{ - return mReaderPool->borrow( type ); -} - -void SP_XmlPullParser :: setError( const char * error ) -{ - if( NULL != error ) { - if( NULL != mError ) free( mError ); - - char segment[ 2 * sizeof( mErrorSegment ) + 1 ]; - { - memset( segment, 0, sizeof( segment ) ); - - char temp[ sizeof( mErrorSegment ) + 1 ]; - memset( temp, 0, sizeof( temp ) ); - if( mErrorIndex < (int)sizeof( mErrorSegment ) ) { - strncpy( temp, mErrorSegment, mErrorIndex ); - } else { - int offset = mErrorIndex % sizeof( mErrorSegment ); - strncpy( temp, mErrorSegment + offset, sizeof( mErrorSegment ) - offset ); - strncpy( temp + sizeof( mErrorSegment ) - offset, mErrorSegment, offset ); - } - - for( char * pos = temp, * dest = segment; '\0' != *pos; pos++ ) { - if( '\r' == *pos ) { - *dest++ = '\\'; - *dest++ = 'r'; - } else if( '\n' == *pos ) { - *dest++ = '\\'; - *dest++ = 'n'; - } else if( '\t' == *pos ) { - *dest++ = '\\'; - *dest++ = 't'; - } else { - *dest++ = *pos; - } - } - } - - char msg[ 512 ]; - snprintf( msg, sizeof( msg), "%s ( occured at row(%d), col(%d) : %s )", - error, mRowIndex + 1, mColIndex + 1, segment ); - - mError = strdup( msg ); - } -}