Skip to content
Snippets Groups Projects
Unverified Commit 8d2061a7 authored by Jayesh Badwaik's avatar Jayesh Badwaik
Browse files

- yaml_parse_flow_sequence: implemented parsing of flow sequences

parent 953afef6
No related branches found
No related tags found
1 merge request!25Flowsequence
Pipeline #53152 passed
//------------------------------------------------------------------------------
// SPDX-License-Identifier: "Apache-2.0 OR MIT"
// Copyright (C) 2020, Jayesh Badwaik <jayesh@badwaik.in>
//------------------------------------------------------------------------------
#ifndef RADLE_DETAIL_YAML_PARSE_FLOW_SEQUENCE_H
#define RADLE_DETAIL_YAML_PARSE_FLOW_SEQUENCE_H
#include <radle/detail/yaml_result.h>
#include <radle/detail/yaml_schema.h>
#include <radle/detail/yaml_value.h>
#include <yaml.h>
radle_yaml_value* radle_yaml_parse_flow_sequence(
yaml_parser_t* parser_ptr,
radle_yaml_schema schema,
radle_yaml_result* result_ptr);
#endif // RADLE_DETAIL_YAML_PARSE_FLOW_SEQUENCE_H
...@@ -13,6 +13,7 @@ target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_kvp.c) ...@@ -13,6 +13,7 @@ target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_kvp.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_kvp_find.c) target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_kvp_find.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_mapping.c) target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_mapping.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_flow_mapping.c) target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_flow_mapping.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_flow_sequence.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_block_mapping.c) target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_block_mapping.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_block_sequence.c) target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_parse_block_sequence.c)
target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_token_parse_file.c) target_sources(${LIBNAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/yaml_token_parse_file.c)
......
//------------------------------------------------------------------------------
// SPDX-License-Identifier: "Apache-2.0 OR MIT"
// Copyright (C) 2020, Jayesh Badwaik <jayesh@badwaik.in>
//------------------------------------------------------------------------------
#include <radle/detail/yaml_end_token.h>
#include <radle/detail/yaml_parse_flow_sequence.h>
#include <radle/detail/yaml_parse_value.h>
radle_yaml_value* radle_yaml_parse_flow_sequence(
yaml_parser_t* parser_ptr,
radle_yaml_schema schema,
radle_yaml_result* result_ptr)
{
*result_ptr = radle_yaml_result_success;
yaml_token_t token;
radle_yaml_value* value_ptr
= (radle_yaml_value*)malloc(sizeof(radle_yaml_value));
if (value_ptr == NULL) {
*result_ptr = radle_yaml_result_unknown_error;
return value_ptr;
}
radle_yaml_initialize_value(value_ptr);
value_ptr->category = radle_yaml_sequence_c;
radle_yaml_sequence* sequence_ptr = &value_ptr->storage.sequence;
radle_yaml_initialize_sequence(sequence_ptr);
bool continue_parsing = true;
do {
if (sequence_ptr->nvalue != 0) {
yaml_parser_scan(parser_ptr, &token);
if (token.type != YAML_FLOW_ENTRY_TOKEN) {
*result_ptr = radle_yaml_result_unknown_error;
continue_parsing = false;
continue;
}
yaml_token_delete(&token);
}
radle_yaml_value* nested_value_ptr = radle_yaml_parse_value(
parser_ptr, YAML_FLOW_SEQUENCE_START_TOKEN, schema, result_ptr);
if (*result_ptr == radle_yaml_result_end_token_encountered) {
*result_ptr = radle_yaml_result_success;
continue_parsing = false;
continue;
}
++sequence_ptr->nvalue;
sequence_ptr->value_ptr_array = realloc(
sequence_ptr->value_ptr_array,
sizeof(radle_yaml_value*) * (size_t)sequence_ptr->nvalue);
sequence_ptr->value_ptr_array[sequence_ptr->nvalue - 1] = nested_value_ptr;
} while (continue_parsing);
yaml_token_delete(&token);
return value_ptr;
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <radle/detail/yaml_parse_block_mapping.h> #include <radle/detail/yaml_parse_block_mapping.h>
#include <radle/detail/yaml_parse_block_sequence.h> #include <radle/detail/yaml_parse_block_sequence.h>
#include <radle/detail/yaml_parse_flow_mapping.h> #include <radle/detail/yaml_parse_flow_mapping.h>
#include <radle/detail/yaml_parse_flow_sequence.h>
#include <radle/detail/yaml_parse_scalar.h> #include <radle/detail/yaml_parse_scalar.h>
#include <radle/detail/yaml_parse_value.h> #include <radle/detail/yaml_parse_value.h>
...@@ -38,6 +39,9 @@ radle_yaml_value* radle_yaml_parse_value( ...@@ -38,6 +39,9 @@ radle_yaml_value* radle_yaml_parse_value(
case YAML_SCALAR_TOKEN: case YAML_SCALAR_TOKEN:
value_ptr = radle_yaml_parse_scalar(&token, schema, result_ptr); value_ptr = radle_yaml_parse_scalar(&token, schema, result_ptr);
break; break;
case YAML_FLOW_SEQUENCE_START_TOKEN:
value_ptr = radle_yaml_parse_flow_sequence(parser_ptr, schema, result_ptr);
break;
case YAML_FLOW_MAPPING_START_TOKEN: case YAML_FLOW_MAPPING_START_TOKEN:
value_ptr = radle_yaml_parse_flow_mapping(parser_ptr, schema, result_ptr); value_ptr = radle_yaml_parse_flow_mapping(parser_ptr, schema, result_ptr);
break; break;
......
...@@ -24,6 +24,7 @@ void test_radle_token_yaml_file_05(__attribute__((unused)) void** state); ...@@ -24,6 +24,7 @@ void test_radle_token_yaml_file_05(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_06(__attribute__((unused)) void** state); void test_radle_token_yaml_file_06(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_07(__attribute__((unused)) void** state); void test_radle_token_yaml_file_07(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_08(__attribute__((unused)) void** state); void test_radle_token_yaml_file_08(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_09(__attribute__((unused)) void** state);
void test_radle_yaml_value_01(__attribute__((unused)) void** state); void test_radle_yaml_value_01(__attribute__((unused)) void** state);
void test_radle_yaml_value_02(__attribute__((unused)) void** state); void test_radle_yaml_value_02(__attribute__((unused)) void** state);
void test_radle_yaml_value_03(__attribute__((unused)) void** state); void test_radle_yaml_value_03(__attribute__((unused)) void** state);
...@@ -49,6 +50,7 @@ int main(void) ...@@ -49,6 +50,7 @@ int main(void)
cmocka_unit_test(test_radle_token_yaml_file_06), cmocka_unit_test(test_radle_token_yaml_file_06),
cmocka_unit_test(test_radle_token_yaml_file_07), cmocka_unit_test(test_radle_token_yaml_file_07),
cmocka_unit_test(test_radle_token_yaml_file_08), cmocka_unit_test(test_radle_token_yaml_file_08),
cmocka_unit_test(test_radle_token_yaml_file_09),
cmocka_unit_test(test_radle_yaml_value_01), cmocka_unit_test(test_radle_yaml_value_01),
cmocka_unit_test(test_radle_yaml_value_02), cmocka_unit_test(test_radle_yaml_value_02),
cmocka_unit_test(test_radle_yaml_value_03), cmocka_unit_test(test_radle_yaml_value_03),
......
...@@ -23,6 +23,7 @@ void test_radle_token_yaml_file_05(__attribute__((unused)) void** state); ...@@ -23,6 +23,7 @@ void test_radle_token_yaml_file_05(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_06(__attribute__((unused)) void** state); void test_radle_token_yaml_file_06(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_07(__attribute__((unused)) void** state); void test_radle_token_yaml_file_07(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_08(__attribute__((unused)) void** state); void test_radle_token_yaml_file_08(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_09(__attribute__((unused)) void** state);
void test_radle_token_yaml_file_01(__attribute__((unused)) void** state) void test_radle_token_yaml_file_01(__attribute__((unused)) void** state)
{ {
...@@ -201,3 +202,32 @@ void test_radle_token_yaml_file_08(__attribute__((unused)) void** state) ...@@ -201,3 +202,32 @@ void test_radle_token_yaml_file_08(__attribute__((unused)) void** state)
radle_yaml_delete_file(&file); radle_yaml_delete_file(&file);
free(filename); free(filename);
} }
void test_radle_token_yaml_file_09(__attribute__((unused)) void** state)
{
radle_yaml_result result = radle_yaml_result_success;
char* filename = radle_strcat(directory_prefix, "/09.yml");
radle_yaml_file file = radle_yaml_token_parse_file(
filename, &result, radle_yaml_schema_failsafe);
assert_true(result == radle_yaml_result_success);
assert_true(file.ndocument == 1);
radle_yaml_value* document_ptr = file.document_ptr_array[0];
assert_true(document_ptr->category == radle_yaml_sequence_c);
radle_yaml_sequence* sequence_ptr = &document_ptr->storage.sequence;
assert_true(sequence_ptr->nvalue == 4);
assert_true(
strcmp(sequence_ptr->value_ptr_array[0]->storage.string, "alpha") == 0);
assert_true(
strcmp(sequence_ptr->value_ptr_array[1]->storage.string, "beta") == 0);
assert_true(
strcmp(sequence_ptr->value_ptr_array[2]->storage.string, "delta") == 0);
assert_true(
strcmp(sequence_ptr->value_ptr_array[3]->storage.string, "gamma") == 0);
radle_yaml_delete_file(&file);
free(filename);
}
---
[
alpha,
beta,
delta,
gamma
]
...
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment