tTJSVariant* tTJSBinarySerializer::ReadDictionary( const tjs_uint8* buff, const tjs_uint size, const tjs_uint count, tjs_uint& index ) { if( index > size ) return NULL; tTJSDictionaryObject* dic = CreateDictionary( count ); for( tjs_uint i = 0; i < count; i++ ) { tjs_uint8 type = buff[index]; index++; // 最初に文字を読む tTJSVariantString* name = NULL; switch( type ) { case TYPE_STRING8: { if( (index+sizeof(tjs_uint8)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint8 len = buff[index]; index++; if( (index+(len*sizeof(tjs_char))) > size ) TJS_eTJSError( TJSReadError ); name = ReadString( buff, len, index ); break; } case TYPE_STRING16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 len = Read16( buff, index ); if( (index+(len*sizeof(tjs_char))) > size ) TJS_eTJSError( TJSReadError ); name = ReadString( buff, len, index ); break; } case TYPE_STRING32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 len = Read32( buff, index ); if( (index+(len*sizeof(tjs_char))) > size ) TJS_eTJSError( TJSReadError ); name = ReadString( buff, len, index ); break; } default: if( type >= TYPE_FIX_STRING_MIN && type <= TYPE_FIX_STRING_MAX ) { tjs_int len = type - TYPE_FIX_STRING_MIN; if( (len*sizeof(tjs_char)+index) > size ) TJS_eTJSError( TJSReadError ); name = ReadString( buff, len, index ); } else { // Dictionary形式の場合、最初に文字列がこないといけない TJS_eTJSError( TJSReadError ); } break; } // 次に要素を読む tTJSVariant* value = ReadBasicType( buff, size, index ); AddDictionary( dic, name, value ); delete value; name->Release(); } tTJSVariant* ret = new tTJSVariant( dic, dic ); dic->Release(); return ret; }
int main(void) { std::stringstream source; source.str("1 + 1"); auto Pamela = new Peridot::PamelaIsley<Peridot::Token *>(); auto Lex = new Lexer::Luthor<std::stringstream>(source,true); auto numbers = new Lexer::TokenMonsterDictionary<std::stringstream>(); Lexer::GetPreFabDictionary("Numbers",numbers); Lex->AddDictionary(numbers); // The Parser auto Peter = new Parser::Peter<Lexer::Luthor<std::stringstream> *, Peridot::PamelaIsley<Peridot::Token *>*, Peridot::Token *>(); Peter->SetCreateToken([] () -> Peridot::Token* { auto token = new Peridot::Token; Utils::InitializeToken(token); return token; }); Peter->Parse(); }