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/
spxml/spxmlutils.cpp@4:7dae52cf560f, 2012-08-20 (annotated)
- Committer:
- togayan
- Date:
- Mon Aug 20 13:27:17 2012 +0000
- Revision:
- 4:7dae52cf560f
1st revision
Who changed what in which revision?
User | Revision | Line number | New 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 | } |