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 Satoshi Togawa

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/

Committer:
togayan
Date:
Mon Aug 20 13:27:17 2012 +0000
Revision:
4:7dae52cf560f
1st revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
togayan 4:7dae52cf560f 1 /*
togayan 4:7dae52cf560f 2 * Copyright 2007 Stephen Liu
togayan 4:7dae52cf560f 3 * For license terms, see the file COPYING along with this library.
togayan 4:7dae52cf560f 4 */
togayan 4:7dae52cf560f 5
togayan 4:7dae52cf560f 6 #include <stdio.h>
togayan 4:7dae52cf560f 7 #include <stdlib.h>
togayan 4:7dae52cf560f 8 #include <string.h>
togayan 4:7dae52cf560f 9 #include <assert.h>
togayan 4:7dae52cf560f 10 #include <stdarg.h>
togayan 4:7dae52cf560f 11 #include <ctype.h>
togayan 4:7dae52cf560f 12
togayan 4:7dae52cf560f 13 #include "spxmlutils.hpp"
togayan 4:7dae52cf560f 14
togayan 4:7dae52cf560f 15 //=========================================================
togayan 4:7dae52cf560f 16
togayan 4:7dae52cf560f 17 const int SP_XmlArrayList::LAST_INDEX = -1;
togayan 4:7dae52cf560f 18
togayan 4:7dae52cf560f 19 SP_XmlArrayList :: SP_XmlArrayList( int initCount )
togayan 4:7dae52cf560f 20 {
togayan 4:7dae52cf560f 21 mMaxCount = initCount <= 0 ? 2 : initCount;
togayan 4:7dae52cf560f 22 mCount = 0;
togayan 4:7dae52cf560f 23 mFirst = (void**)malloc( sizeof( void * ) * mMaxCount );
togayan 4:7dae52cf560f 24 }
togayan 4:7dae52cf560f 25
togayan 4:7dae52cf560f 26 SP_XmlArrayList :: ~SP_XmlArrayList()
togayan 4:7dae52cf560f 27 {
togayan 4:7dae52cf560f 28 free( mFirst );
togayan 4:7dae52cf560f 29 mFirst = NULL;
togayan 4:7dae52cf560f 30 }
togayan 4:7dae52cf560f 31
togayan 4:7dae52cf560f 32 int SP_XmlArrayList :: getCount() const
togayan 4:7dae52cf560f 33 {
togayan 4:7dae52cf560f 34 return mCount;
togayan 4:7dae52cf560f 35 }
togayan 4:7dae52cf560f 36
togayan 4:7dae52cf560f 37 int SP_XmlArrayList :: append( void * value )
togayan 4:7dae52cf560f 38 {
togayan 4:7dae52cf560f 39 if( NULL == value ) return -1;
togayan 4:7dae52cf560f 40
togayan 4:7dae52cf560f 41 if( mCount >= mMaxCount ) {
togayan 4:7dae52cf560f 42 mMaxCount = ( mMaxCount * 3 ) / 2 + 1;
togayan 4:7dae52cf560f 43 mFirst = (void**)realloc( mFirst, sizeof( void * ) * mMaxCount );
togayan 4:7dae52cf560f 44 assert( NULL != mFirst );
togayan 4:7dae52cf560f 45 memset( mFirst + mCount, 0, ( mMaxCount - mCount ) * sizeof( void * ) );
togayan 4:7dae52cf560f 46 }
togayan 4:7dae52cf560f 47
togayan 4:7dae52cf560f 48 mFirst[ mCount++ ] = value;
togayan 4:7dae52cf560f 49
togayan 4:7dae52cf560f 50 return 0;
togayan 4:7dae52cf560f 51 }
togayan 4:7dae52cf560f 52
togayan 4:7dae52cf560f 53 void * SP_XmlArrayList :: takeItem( int index )
togayan 4:7dae52cf560f 54 {
togayan 4:7dae52cf560f 55 void * ret = NULL;
togayan 4:7dae52cf560f 56
togayan 4:7dae52cf560f 57 if( LAST_INDEX == index ) index = mCount -1;
togayan 4:7dae52cf560f 58 if( index < 0 || index >= mCount ) return ret;
togayan 4:7dae52cf560f 59
togayan 4:7dae52cf560f 60 ret = mFirst[ index ];
togayan 4:7dae52cf560f 61
togayan 4:7dae52cf560f 62 mCount--;
togayan 4:7dae52cf560f 63
togayan 4:7dae52cf560f 64 if( ( index + 1 ) < mMaxCount ) {
togayan 4:7dae52cf560f 65 memmove( mFirst + index, mFirst + index + 1,
togayan 4:7dae52cf560f 66 ( mMaxCount - index - 1 ) * sizeof( void * ) );
togayan 4:7dae52cf560f 67 } else {
togayan 4:7dae52cf560f 68 mFirst[ index ] = NULL;
togayan 4:7dae52cf560f 69 }
togayan 4:7dae52cf560f 70
togayan 4:7dae52cf560f 71 return ret;
togayan 4:7dae52cf560f 72 }
togayan 4:7dae52cf560f 73
togayan 4:7dae52cf560f 74 const void * SP_XmlArrayList :: getItem( int index ) const
togayan 4:7dae52cf560f 75 {
togayan 4:7dae52cf560f 76 const void * ret = NULL;
togayan 4:7dae52cf560f 77
togayan 4:7dae52cf560f 78 if( LAST_INDEX == index ) index = mCount - 1;
togayan 4:7dae52cf560f 79 if( index < 0 || index >= mCount ) return ret;
togayan 4:7dae52cf560f 80
togayan 4:7dae52cf560f 81 ret = mFirst[ index ];
togayan 4:7dae52cf560f 82
togayan 4:7dae52cf560f 83 return ret;
togayan 4:7dae52cf560f 84 }
togayan 4:7dae52cf560f 85
togayan 4:7dae52cf560f 86 void SP_XmlArrayList :: sort( int ( * cmpFunc )( const void *, const void * ) )
togayan 4:7dae52cf560f 87 {
togayan 4:7dae52cf560f 88 for( int i = 0; i < mCount - 1; i++ ) {
togayan 4:7dae52cf560f 89 int min = i;
togayan 4:7dae52cf560f 90 for( int j = i + 1; j < mCount; j++ ) {
togayan 4:7dae52cf560f 91 if( cmpFunc( mFirst[ min ], mFirst[ j ] ) > 0 ) {
togayan 4:7dae52cf560f 92 min = j;
togayan 4:7dae52cf560f 93 }
togayan 4:7dae52cf560f 94 }
togayan 4:7dae52cf560f 95
togayan 4:7dae52cf560f 96 if( min != i ) {
togayan 4:7dae52cf560f 97 void * temp = mFirst[ i ];
togayan 4:7dae52cf560f 98 mFirst[ i ] = mFirst[ min ];
togayan 4:7dae52cf560f 99 mFirst[ min ] = temp;
togayan 4:7dae52cf560f 100 }
togayan 4:7dae52cf560f 101 }
togayan 4:7dae52cf560f 102 }
togayan 4:7dae52cf560f 103
togayan 4:7dae52cf560f 104 //=========================================================
togayan 4:7dae52cf560f 105
togayan 4:7dae52cf560f 106 SP_XmlQueue :: SP_XmlQueue()
togayan 4:7dae52cf560f 107 {
togayan 4:7dae52cf560f 108 mMaxCount = 8;
togayan 4:7dae52cf560f 109 mEntries = (void**)malloc( sizeof( void * ) * mMaxCount );
togayan 4:7dae52cf560f 110
togayan 4:7dae52cf560f 111 mHead = mTail = mCount = 0;
togayan 4:7dae52cf560f 112 }
togayan 4:7dae52cf560f 113
togayan 4:7dae52cf560f 114 SP_XmlQueue :: ~SP_XmlQueue()
togayan 4:7dae52cf560f 115 {
togayan 4:7dae52cf560f 116 free( mEntries );
togayan 4:7dae52cf560f 117 mEntries = NULL;
togayan 4:7dae52cf560f 118 }
togayan 4:7dae52cf560f 119
togayan 4:7dae52cf560f 120 void SP_XmlQueue :: push( void * item )
togayan 4:7dae52cf560f 121 {
togayan 4:7dae52cf560f 122 if( mCount >= mMaxCount ) {
togayan 4:7dae52cf560f 123 mMaxCount = ( mMaxCount * 3 ) / 2 + 1;
togayan 4:7dae52cf560f 124 void ** newEntries = (void**)malloc( sizeof( void * ) * mMaxCount );
togayan 4:7dae52cf560f 125
togayan 4:7dae52cf560f 126 unsigned int headLen = 0, tailLen = 0;
togayan 4:7dae52cf560f 127 if( mHead < mTail ) {
togayan 4:7dae52cf560f 128 headLen = mTail - mHead;
togayan 4:7dae52cf560f 129 } else {
togayan 4:7dae52cf560f 130 headLen = mCount - mTail;
togayan 4:7dae52cf560f 131 tailLen = mTail;
togayan 4:7dae52cf560f 132 }
togayan 4:7dae52cf560f 133
togayan 4:7dae52cf560f 134 memcpy( newEntries, &( mEntries[ mHead ] ), sizeof( void * ) * headLen );
togayan 4:7dae52cf560f 135 if( tailLen ) {
togayan 4:7dae52cf560f 136 memcpy( &( newEntries[ headLen ] ), mEntries, sizeof( void * ) * tailLen );
togayan 4:7dae52cf560f 137 }
togayan 4:7dae52cf560f 138
togayan 4:7dae52cf560f 139 mHead = 0;
togayan 4:7dae52cf560f 140 mTail = headLen + tailLen;
togayan 4:7dae52cf560f 141
togayan 4:7dae52cf560f 142 free( mEntries );
togayan 4:7dae52cf560f 143 mEntries = newEntries;
togayan 4:7dae52cf560f 144 }
togayan 4:7dae52cf560f 145
togayan 4:7dae52cf560f 146 mEntries[ mTail++ ] = item;
togayan 4:7dae52cf560f 147 mTail = mTail % mMaxCount;
togayan 4:7dae52cf560f 148 mCount++;
togayan 4:7dae52cf560f 149 }
togayan 4:7dae52cf560f 150
togayan 4:7dae52cf560f 151 void * SP_XmlQueue :: pop()
togayan 4:7dae52cf560f 152 {
togayan 4:7dae52cf560f 153 void * ret = NULL;
togayan 4:7dae52cf560f 154
togayan 4:7dae52cf560f 155 if( mCount > 0 ) {
togayan 4:7dae52cf560f 156 ret = mEntries[ mHead++ ];
togayan 4:7dae52cf560f 157 mHead = mHead % mMaxCount;
togayan 4:7dae52cf560f 158 mCount--;
togayan 4:7dae52cf560f 159 }
togayan 4:7dae52cf560f 160
togayan 4:7dae52cf560f 161 return ret;
togayan 4:7dae52cf560f 162 }
togayan 4:7dae52cf560f 163
togayan 4:7dae52cf560f 164 void * SP_XmlQueue :: top()
togayan 4:7dae52cf560f 165 {
togayan 4:7dae52cf560f 166 return mCount > 0 ? mEntries[ mHead ] : NULL;
togayan 4:7dae52cf560f 167 }
togayan 4:7dae52cf560f 168
togayan 4:7dae52cf560f 169 //=========================================================
togayan 4:7dae52cf560f 170
togayan 4:7dae52cf560f 171 SP_XmlStringBuffer :: SP_XmlStringBuffer()
togayan 4:7dae52cf560f 172 {
togayan 4:7dae52cf560f 173 init();
togayan 4:7dae52cf560f 174 }
togayan 4:7dae52cf560f 175
togayan 4:7dae52cf560f 176 void SP_XmlStringBuffer :: init()
togayan 4:7dae52cf560f 177 {
togayan 4:7dae52cf560f 178 mSize = 0;
togayan 4:7dae52cf560f 179 mMaxSize = 8;
togayan 4:7dae52cf560f 180 mBuffer = (char*)malloc( mMaxSize );
togayan 4:7dae52cf560f 181 memset( mBuffer, 0, mMaxSize );
togayan 4:7dae52cf560f 182 }
togayan 4:7dae52cf560f 183
togayan 4:7dae52cf560f 184 SP_XmlStringBuffer :: ~SP_XmlStringBuffer()
togayan 4:7dae52cf560f 185 {
togayan 4:7dae52cf560f 186 free( mBuffer );
togayan 4:7dae52cf560f 187 }
togayan 4:7dae52cf560f 188
togayan 4:7dae52cf560f 189 int SP_XmlStringBuffer :: append( char c )
togayan 4:7dae52cf560f 190 {
togayan 4:7dae52cf560f 191 if( mSize >= ( mMaxSize - 1 ) ) {
togayan 4:7dae52cf560f 192 mMaxSize += ( mMaxSize * 3 ) / 2 + 1;
togayan 4:7dae52cf560f 193 mBuffer = (char*)realloc( mBuffer, mMaxSize );
togayan 4:7dae52cf560f 194 assert( NULL != mBuffer );
togayan 4:7dae52cf560f 195 memset( mBuffer + mSize, 0, mMaxSize - mSize );
togayan 4:7dae52cf560f 196 }
togayan 4:7dae52cf560f 197 mBuffer[ mSize++ ] = c;
togayan 4:7dae52cf560f 198
togayan 4:7dae52cf560f 199 return 0;
togayan 4:7dae52cf560f 200 }
togayan 4:7dae52cf560f 201
togayan 4:7dae52cf560f 202 int SP_XmlStringBuffer :: append( const char * value, int size )
togayan 4:7dae52cf560f 203 {
togayan 4:7dae52cf560f 204 if( NULL == value ) return -1;
togayan 4:7dae52cf560f 205
togayan 4:7dae52cf560f 206 size = ( size <= 0 ? strlen( value ) : size );
togayan 4:7dae52cf560f 207 if( size <= 0 ) return -1;
togayan 4:7dae52cf560f 208
togayan 4:7dae52cf560f 209 if( ( size + mSize ) > ( mMaxSize - 1 ) ) {
togayan 4:7dae52cf560f 210 mMaxSize += size;
togayan 4:7dae52cf560f 211 mBuffer = (char*)realloc( mBuffer, mMaxSize );
togayan 4:7dae52cf560f 212 assert( NULL != mBuffer );
togayan 4:7dae52cf560f 213 memset( mBuffer + mSize, 0, mMaxSize - mSize );
togayan 4:7dae52cf560f 214 }
togayan 4:7dae52cf560f 215
togayan 4:7dae52cf560f 216 memcpy( mBuffer + mSize, value, size );
togayan 4:7dae52cf560f 217 mSize += size;
togayan 4:7dae52cf560f 218
togayan 4:7dae52cf560f 219 return 0;
togayan 4:7dae52cf560f 220 }
togayan 4:7dae52cf560f 221
togayan 4:7dae52cf560f 222 int SP_XmlStringBuffer :: getSize() const
togayan 4:7dae52cf560f 223 {
togayan 4:7dae52cf560f 224 return mSize;
togayan 4:7dae52cf560f 225 }
togayan 4:7dae52cf560f 226
togayan 4:7dae52cf560f 227 const char * SP_XmlStringBuffer :: getBuffer() const
togayan 4:7dae52cf560f 228 {
togayan 4:7dae52cf560f 229 return mBuffer;
togayan 4:7dae52cf560f 230 }
togayan 4:7dae52cf560f 231
togayan 4:7dae52cf560f 232 char * SP_XmlStringBuffer :: takeBuffer()
togayan 4:7dae52cf560f 233 {
togayan 4:7dae52cf560f 234 char * ret = mBuffer;
togayan 4:7dae52cf560f 235
togayan 4:7dae52cf560f 236 mBuffer = NULL;
togayan 4:7dae52cf560f 237 init();
togayan 4:7dae52cf560f 238
togayan 4:7dae52cf560f 239 return ret;
togayan 4:7dae52cf560f 240 }
togayan 4:7dae52cf560f 241
togayan 4:7dae52cf560f 242 void SP_XmlStringBuffer :: clean()
togayan 4:7dae52cf560f 243 {
togayan 4:7dae52cf560f 244 memset( mBuffer, 0, mMaxSize );
togayan 4:7dae52cf560f 245 mSize = 0;
togayan 4:7dae52cf560f 246 }