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/spxmlstag.cpp
- Revision:
- 8:a9541e8897f5
- Parent:
- 7:ad9fcf0e1bc5
--- a/spxml/spxmlstag.cpp Sat Sep 01 04:09:48 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,251 +0,0 @@ -/* - * Copyright 2007 Stephen Liu - * For license terms, see the file COPYING along with this library. - */ - -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <typeinfo> -#include "strdup.h" - -#include "spxmlstag.hpp" -#include "spxmlutils.hpp" -#include "spxmlevent.hpp" -#include "spxmlcodec.hpp" - -SP_XmlSTagParser :: SP_XmlSTagParser( const char * encoding ) -{ - mEvent = new SP_XmlStartTagEvent(); - mReader = new SP_XmlSTagNameReader(); - mStartTagName = new SP_XmlStringBuffer(); - mError = NULL; - - snprintf( mEncoding, sizeof( mEncoding ), "%s", encoding ); -} - -SP_XmlSTagParser :: ~SP_XmlSTagParser() -{ - if( NULL != mEvent ) delete mEvent; - mEvent = NULL; - - if( NULL != mReader ) delete mReader; - mReader = NULL; - - if( NULL != mStartTagName ) delete mStartTagName; - mStartTagName = NULL; - - if( NULL != mError ) free( mError ); - mError = NULL; -} - -const char * SP_XmlSTagParser :: getEncoding() -{ - return mEncoding; -} - -SP_XmlStartTagEvent * SP_XmlSTagParser :: takeEvent() -{ - SP_XmlStartTagEvent * event = mEvent; - - mEvent = NULL; - - return event; -} - -const char * SP_XmlSTagParser :: getError() -{ - return mError; -} - -void SP_XmlSTagParser :: changeReader( SP_XmlSTagReader * reader ) -{ - delete mReader; - mReader = reader; -} - -void SP_XmlSTagParser :: setError( const char * error ) -{ - if( NULL != error ) { - if( NULL != mError ) free( mError ); - mError = strdup( error ); - } -} - -void SP_XmlSTagParser :: append( const char * source, int len ) -{ - for( int i = 0; i < len && NULL == mError; i++ ) { - mReader->read( this, source[ i ] ); - } -} - -//========================================================= - -SP_XmlSTagReader :: SP_XmlSTagReader() -{ - mBuffer = new SP_XmlStringBuffer(); -} - -SP_XmlSTagReader :: ~SP_XmlSTagReader() -{ - delete mBuffer; - mBuffer = NULL; -} - -void SP_XmlSTagReader :: changeReader( SP_XmlSTagParser * parser, - SP_XmlSTagReader * reader ) -{ - //printf( "\nchange: %s\n", typeid( *reader ).name() ); - parser->changeReader( reader ); -} - -void SP_XmlSTagReader :: setError( SP_XmlSTagParser * parser, const char * error ) -{ - parser->setError( error ); -} - -void SP_XmlSTagReader :: setName( SP_XmlSTagParser * parser, const char * name ) -{ - parser->mEvent->setName( name ); -} - -void SP_XmlSTagReader :: addAttrName( SP_XmlSTagParser * parser, const char * name ) -{ - parser->mStartTagName->append( name ); -} - -void SP_XmlSTagReader :: addAttrValue( SP_XmlSTagParser * parser, const char * value ) -{ - SP_XmlStringBuffer decodeValue; - SP_XmlStringCodec::decode( parser->getEncoding(), value, &decodeValue ); - - parser->mEvent->addAttr( parser->mStartTagName->getBuffer(), decodeValue.getBuffer() ); - parser->mStartTagName->clean(); -} - -//========================================================= - -SP_XmlSTagNameReader :: SP_XmlSTagNameReader() -{ -} - -SP_XmlSTagNameReader :: ~SP_XmlSTagNameReader() -{ -} - -void SP_XmlSTagNameReader :: read( SP_XmlSTagParser * parser, char c ) -{ - if( isspace( c ) ) { - if( 0 == mBuffer->getSize() ) { - //leading space, skip - } else { - setName( parser, mBuffer->getBuffer() ); - changeReader( parser, new SP_XmlSTagAttrNameReader() ); - } - } else { - mBuffer->append( c ); - } -} - -//========================================================= - -SP_XmlSTagAttrNameReader :: SP_XmlSTagAttrNameReader() -{ - mWait4Quot = 0; -} - -SP_XmlSTagAttrNameReader :: ~SP_XmlSTagAttrNameReader() -{ -} - -void SP_XmlSTagAttrNameReader :: read( SP_XmlSTagParser * parser, char c ) -{ - if( 1 == mWait4Quot ) { - if( '"' == c ) { - addAttrName( parser, mBuffer->getBuffer() ); - changeReader( parser, new SP_XmlSTagEqualMarkReader() ); - } else { - mBuffer->append( c ); - } - } else { - if( isspace( c ) ) { - if( 0 == mBuffer->getSize() ) { - //leading space, skip - } else { - addAttrName( parser, mBuffer->getBuffer() ); - changeReader( parser, new SP_XmlSTagEqualMarkReader() ); - } - } else { - if( '"' == c && 0 == mBuffer->getSize() ) { - mWait4Quot = 1; - } else if( '=' == c ) { - addAttrName( parser, mBuffer->getBuffer() ); - SP_XmlSTagReader * reader = new SP_XmlSTagEqualMarkReader(); - changeReader( parser, reader ); - reader->read( parser, c ); - } else { - mBuffer->append( c ); - } - } - } -} - -//========================================================= - -SP_XmlSTagEqualMarkReader :: SP_XmlSTagEqualMarkReader() -{ -} - -SP_XmlSTagEqualMarkReader :: ~SP_XmlSTagEqualMarkReader() -{ -} - -void SP_XmlSTagEqualMarkReader :: read( SP_XmlSTagParser * parser, char c ) -{ - if( isspace( c ) ) { - //skip - } else if( '=' == c ) { - changeReader( parser, new SP_XmlSTagAttrValueReader() ); - } else { - addAttrValue( parser, "" ); - SP_XmlSTagReader * reader = new SP_XmlSTagAttrNameReader(); - changeReader( parser, reader ); - reader->read( parser, c ); - - //setError( parser, "miss '=' between name & value" ); - } -} - -//========================================================= - -SP_XmlSTagAttrValueReader :: SP_XmlSTagAttrValueReader() -{ - mHasReadQuot = 0; -} - -SP_XmlSTagAttrValueReader :: ~SP_XmlSTagAttrValueReader() -{ -} - -void SP_XmlSTagAttrValueReader :: read( SP_XmlSTagParser * parser, char c ) -{ - if( 0 == mHasReadQuot ) { - if( isspace( c ) ) { - //skip - } else if( '"' == c ) { - mHasReadQuot = 1; - } else if( '\'' == c ) { - mHasReadQuot = 2; - } else { - setError( parser, "unknown attribute value start" ); - } - } else { - if( ( 1 == mHasReadQuot && '"' == c ) - || ( 2 == mHasReadQuot && '\'' == c ) ) { - addAttrValue( parser, mBuffer->getBuffer() ); - changeReader( parser, new SP_XmlSTagAttrNameReader() ); - } else { - mBuffer->append( c ); - } - } -}