aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan sinclair <dj2@everburning.com>2019-04-02 09:02:33 -0400
committerGitHub <noreply@github.com>2019-04-02 09:02:33 -0400
commit0c050473aaba12d27e21604a2362f9eaa6e7af09 (patch)
treecfc3981b54c21d65099ba61e2a566658c9e9b28e /src
parenta80dbbd3b1233b274ee2e5bdec8f30e1e8ea73f7 (diff)
downloadamber-0c050473aaba12d27e21604a2362f9eaa6e7af09.tar.gz
[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 ```
Diffstat (limited to 'src')
-rw-r--r--src/amberscript/parser.cc10
-rw-r--r--src/amberscript/parser_buffer_test.cc34
2 files changed, 34 insertions, 10 deletions
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<Value> 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<uint32_t> results = {1, 2, 3, 4};
+ const auto* data = buffer->GetValues<uint32_t>();
+ 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"},