From 9638b621fa567555e51c9bc61351a708221fd2ee Mon Sep 17 00:00:00 2001 From: dautor Date: Sat, 16 Nov 2024 20:12:45 +0100 Subject: Add ng_pipe link --- src/base/state.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) (limited to 'src/base/state.c') diff --git a/src/base/state.c b/src/base/state.c index 50ebe4e..652c943 100644 --- a/src/base/state.c +++ b/src/base/state.c @@ -103,12 +103,50 @@ error: return Error; } +int +FromString_link_type(char const *S, link_type *Type) +{ + for(link_type i = 0; i < link_type_COUNT; ++i) + { + if(strcmp(link_type_Names[i], S) == 0) + { + *Type = i; + return 0; + } + } + return -1; +} + +char * +Parse_link_type(link_type *E, ucl_object_t const *root, char const *Position) +{ + if(root == NULL) + { + *E = link_type_direct; + return NULL; + } + char *Error; + UCL_CHECK_ROOT(STRING); + char const *S = ucl_object_tostring(root); + if(FromString_link_type(S, E) == 0) return NULL; + asprintf(&Error, "%s invalid link type '%s'", Position, S); +error: + return Error; +} + char * Parse_link_configuration(link_configuration *E, ucl_object_t const *root, char const *Position) { char *Error; size_t EndpointAt = 0; UCL_CHECK_ROOT(OBJECT); + { + char *NewPosition; + asprintf(&NewPosition, "%s.type", Position); + Error = Parse_link_type(&E->Type, ucl_object_lookup(root, "type"), NewPosition); + free(NewPosition); + if(Error != NULL) goto error; + } ucl_object_t const *peer0 = ucl_object_lookup(root, "peer0"); { char *NewPosition; @@ -149,6 +187,25 @@ Parse_link(link_ *E, ucl_object_t const *root, char const *Position) if(Error != NULL) goto error; Configuration = true; } + switch(E->Configuration.Type) + { + case link_type_direct: break; + case link_type_pipe: + { + ucl_object_t const *id = ucl_object_lookup(root, "id"); + UCL_CHECK(id, INT); + s64 ID = ucl_object_toint(id); + if(ID < 0 || ID > INT32_MAX) + { + asprintf(&Error, "%s id invalid (%ld)", Position, ID); + goto error; + } + E->pipe.ID = (u32)ID; + break; + } + case link_type_COUNT: + default: __builtin_unreachable(); + } ucl_object_t const *peer0 = ucl_object_lookup(root, "peer0"); { char *NewPosition; @@ -308,6 +365,8 @@ void Save_link_configuration(jprint_state *S, link_configuration const *E) { JPrintObjectBegin(S); + JPrintMember(S, "type"); + JPrint_string(S, link_type_Names[E->Type]); JPrintMember(S, "peer0"); Save_endpoint_configuration(S, E->Peer + 0); JPrintMember(S, "peer1"); @@ -321,6 +380,18 @@ Save_link(jprint_state *S, link_ const *E) JPrintObjectBegin(S); JPrintMember(S, "configuration"); Save_link_configuration(S, &E->Configuration); + switch(E->Configuration.Type) + { + case link_type_direct: break; + case link_type_pipe: + { + JPrintMember(S, "id"); + JPrint_ssize_t(S, E->pipe.ID); + break; + } + case link_type_COUNT: + default: __builtin_unreachable(); + } JPrintMember(S, "peer0"); Save_endpoint(S, E->Peer + 0); JPrintMember(S, "peer1"); -- cgit v1.2.3