From 0c050473aaba12d27e21604a2362f9eaa6e7af09 Mon Sep 17 00:00:00 2001 From: dan sinclair Date: Tue, 2 Apr 2019 09:02:33 -0400 Subject: [amberscript] Allow buffer data on same line as declaration. (#439) This CL extends the BUFFER DATA parsing to allow giving the data on the same line as the declaration. This can make having similar buffers in a row easier to read. ``` BUFFER my_buffer1 DATA_TYPE uint32 DATA 1 2 3 4 END BUFFER my_buffer2 DATA_TYPE uint32 DATA 5 6 7 8 END ``` --- src/amberscript/parser.cc | 10 +++------- src/amberscript/parser_buffer_test.cc | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index f3acb79..48ae4ce 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -850,15 +850,11 @@ Result Parser::ParseBufferInitializerSeries(DataBuffer* buffer, } Result Parser::ParseBufferInitializerData(DataBuffer* buffer) { - auto token = tokenizer_->NextToken(); - if (!token->IsEOL()) - return Result("extra parameters after BUFFER data command"); - auto& type = buffer->GetDatumType(); bool is_double_type = type.IsFloat() || type.IsDouble(); std::vector values; - for (token = tokenizer_->NextToken();; token = tokenizer_->NextToken()) { + for (auto token = tokenizer_->NextToken();; token = tokenizer_->NextToken()) { if (token->IsEOL()) continue; if (token->IsEOS()) @@ -866,10 +862,10 @@ Result Parser::ParseBufferInitializerData(DataBuffer* buffer) { if (token->IsString() && token->AsString() == "END") break; if (!token->IsInteger() && !token->IsDouble() && !token->IsHex()) - return Result("invalid BUFFER data value"); + return Result("invalid BUFFER data value: " + token->ToOriginalString()); if (!is_double_type && token->IsDouble()) - return Result("invalid BUFFER data value"); + return Result("invalid BUFFER data value: " + token->ToOriginalString()); Value v; if (is_double_type) { diff --git a/src/amberscript/parser_buffer_test.cc b/src/amberscript/parser_buffer_test.cc index 00463a0..0c0bbec 100644 --- a/src/amberscript/parser_buffer_test.cc +++ b/src/amberscript/parser_buffer_test.cc @@ -52,6 +52,34 @@ END)"; } } +TEST_F(AmberScriptParserTest, BufferDataOneLine) { + std::string in = "BUFFER my_buffer DATA_TYPE uint32 DATA 1 2 3 4 END"; + + Parser parser; + Result r = parser.Parse(in); + ASSERT_TRUE(r.IsSuccess()) << r.Error(); + + auto script = parser.GetScript(); + const auto& buffers = script->GetBuffers(); + ASSERT_EQ(1U, buffers.size()); + + ASSERT_TRUE(buffers[0] != nullptr); + EXPECT_EQ("my_buffer", buffers[0]->GetName()); + + ASSERT_TRUE(buffers[0]->IsDataBuffer()); + auto* buffer = buffers[0]->AsDataBuffer(); + EXPECT_TRUE(buffer->GetDatumType().IsUint32()); + EXPECT_EQ(4U, buffer->GetSize()); + EXPECT_EQ(4U * sizeof(uint32_t), buffer->GetSizeInBytes()); + + std::vector results = {1, 2, 3, 4}; + const auto* data = buffer->GetValues(); + ASSERT_EQ(results.size(), buffer->GetSize()); + for (size_t i = 0; i < results.size(); ++i) { + EXPECT_EQ(results[i], data[i]); + } +} + TEST_F(AmberScriptParserTest, BufferFill) { std::string in = "BUFFER my_buffer DATA_TYPE uint8 SIZE 5 FILL 5"; @@ -407,13 +435,13 @@ INSTANTIATE_TEST_CASE_P( "1: BUFFER series_from invalid command"}, BufferParseError{ "BUFFER my_index_buffer DATA_TYPE int32 DATA\n1.234\nEND", - "2: invalid BUFFER data value"}, + "2: invalid BUFFER data value: 1.234"}, BufferParseError{ "BUFFER my_index_buffer DATA_TYPE int32 DATA\nINVALID\nEND", - "2: invalid BUFFER data value"}, + "2: invalid BUFFER data value: INVALID"}, BufferParseError{ "BUFFER my_index_buffer DATA_TYPE int32 DATA INVALID\n123\nEND", - "1: extra parameters after BUFFER data command"}, + "1: invalid BUFFER data value: INVALID"}, BufferParseError{"BUFFER my_index_buffer DATA_TYPE int32 SIZE 256 FILL " "5 INVALID\n123\nEND", "1: extra parameters after BUFFER fill command"}, -- cgit v1.2.3