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;
}
Example #2
0
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();
}