UML 2.0 / CyberiadaML standatd compliance

This commit is contained in:
Alexey Fedoseev
2024-03-03 14:58:08 +03:00
parent 452eedc77c
commit 393bf5d2eb
3 changed files with 690 additions and 236 deletions

View File

@@ -8,7 +8,7 @@ else
endif endif
TEST_TARGET := cyberiada_test TEST_TARGET := cyberiada_test
LIB_SOURCES := cyberiadaml.c LIB_SOURCES := cyberiadaml.c utf8enc.c
TEST_SOURCES := test.c TEST_SOURCES := test.c
LIB_OBJECTS := $(patsubst %.c, %.o, $(LIB_SOURCES)) LIB_OBJECTS := $(patsubst %.c, %.o, $(LIB_SOURCES))
TEST_OBJECTS := $(patsubst %.c, %.o, $(TEST_SOURCES)) TEST_OBJECTS := $(patsubst %.c, %.o, $(TEST_SOURCES))

File diff suppressed because it is too large Load Diff

View File

@@ -23,8 +23,6 @@
#ifndef __CYBERIADA_ML_H #ifndef __CYBERIADA_ML_H
#define __CYBERIADA_ML_H #define __CYBERIADA_ML_H
#include <stdio.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -35,25 +33,38 @@ extern "C" {
/* SM node types: */ /* SM node types: */
typedef enum { typedef enum {
cybNodeSM = 0, /* state machine */ cybNodeSM = 0, /* state machine */
cybNodeSimple, /* simple state */ cybNodeSimpleState, /* simple state */
cybNodeComposite, /* composite state */ cybNodeCompositeState, /* composite state */
cybNodeSubmachineState, /* submachine state */
cybNodeComment, /* comment node */ cybNodeComment, /* comment node */
cybNodeInitial, /* initial pseudostate */ cybNodeInitial, /* initial pseudostate */
cybNodeFinal, /* final pseudostate */ cybNodeFinal, /* final pseudostate */
cybNodeChoice, /* final pseudostate */ cybNodeChoice, /* final pseudostate */
cybNodeJunction, /* junction pseudostate */ cybNodeJunction, /* junction pseudostate */
cybNodeEntry, /* entry pseudostate */ cybNodeEntry, /* entry pseudostate */
cybNodeExit, /* exit pseudostate */ cybNodeExit, /* exit pseudostate */
cybNodeHistory, /* shallow history pseudostate */
cybNodeDeepHistory, /* deep history pseudostate */
cybNodeFork, /* fork pseudostate */
cybNodeJoin, /* join pseudostate */
cybNodeTerminate, /* terminate pseudostate */
} CyberiadaNodeType; } CyberiadaNodeType;
/* SM node types: */ /* SM node types: */
typedef enum { typedef enum {
cybEdgeTransition = 0, cybEdgeTransition = 0,
cybEdgeComment
} CyberiadaEdgeType; } CyberiadaEdgeType;
/* SM node geometry */ /* SM behavior types: */
typedef enum {
cybBehaviorTransition = 0,
cybBehaviorEntry = 1,
cybBehaviorExit = 2,
cybBehaviorDo = 3,
} CyberiadaBehaviorType;
/* SM node & transitions geometry */
typedef struct { typedef struct {
double x, y; double x, y;
@@ -68,6 +79,18 @@ typedef struct _CyberiadaPolyline {
struct _CyberiadaPolyline* next; struct _CyberiadaPolyline* next;
} CyberiadaPolyline; } CyberiadaPolyline;
/* SM behavior */
typedef struct _CyberiadaBehavior {
CyberiadaBehaviorType type;
char* trigger;
size_t trigger_len;
char* guard;
size_t guard_len;
char* action;
size_t action_len;
struct _CyberiadaBehavior* next;
} CyberiadaBehavior;
/* SM node (state) */ /* SM node (state) */
typedef struct _CyberiadaNode { typedef struct _CyberiadaNode {
CyberiadaNodeType type; CyberiadaNodeType type;
@@ -75,8 +98,7 @@ typedef struct _CyberiadaNode {
size_t id_len; size_t id_len;
char* title; char* title;
size_t title_len; size_t title_len;
char* action; CyberiadaBehavior* behavior;
size_t action_len;
CyberiadaRect* geometry_rect; CyberiadaRect* geometry_rect;
struct _CyberiadaNode* next; struct _CyberiadaNode* next;
struct _CyberiadaNode* parent; struct _CyberiadaNode* parent;
@@ -85,67 +107,67 @@ typedef struct _CyberiadaNode {
/* SM edge (transition) */ /* SM edge (transition) */
typedef struct _CyberiadaEdge { typedef struct _CyberiadaEdge {
CyberiadaEdgeType type; CyberiadaEdgeType type;
char* id; char* id;
size_t id_len; size_t id_len;
char* source_id; char* source_id;
size_t source_id_len; size_t source_id_len;
char* target_id; char* target_id;
size_t target_id_len; size_t target_id_len;
CyberiadaNode* source; CyberiadaNode* source;
CyberiadaNode* target; CyberiadaNode* target;
char* action; CyberiadaBehavior* behavior;
size_t action_len;
CyberiadaPoint* geometry_source_point; CyberiadaPoint* geometry_source_point;
CyberiadaPoint* geometry_target_point; CyberiadaPoint* geometry_target_point;
CyberiadaPolyline* geometry_polyline; CyberiadaPolyline* geometry_polyline;
CyberiadaPoint* geometry_label; CyberiadaPoint* geometry_label;
char* color; char* color;
size_t color_len; size_t color_len;
struct _CyberiadaEdge* next; struct _CyberiadaEdge* next;
} CyberiadaEdge; } CyberiadaEdge;
/* SM extentions /* SM extentions
typedef struct _CyberiadaExtension { typedef struct _CyberiadaExtension {
char* id; char* id;
size_t id_len; size_t id_len;
char* title; char* title;
size_t title_len; size_t title_len;
char* data; char* data;
size_t data_len; size_t data_len;
struct _CyberiadaExtension* next; struct _CyberiadaExtension* next;
} CyberiadaExtension;*/ } CyberiadaExtension;*/
/* SM graph (state machine) */ /* SM graph (state machine) */
typedef struct { typedef struct {
char* name; char* name;
size_t name_len; size_t name_len;
char* version; char* version;
size_t version_len; size_t version_len;
char* info; char* info;
size_t info_len; size_t info_len;
CyberiadaNode* nodes; CyberiadaNode* nodes;
CyberiadaEdge* edges; CyberiadaEdge* edges;
/* CyberiadaExtension* extensions;*/ /* CyberiadaExtension* extensions;*/
} CyberiadaSM; } CyberiadaSM;
/* SM GraphML supported formats */ /* SM GraphML supported formats */
typedef enum { typedef enum {
cybxmlYED = 0, cybxmlYED = 0,
cybxmlCyberiada, cybxmlCyberiada,
cybxmlUnknown cybxmlUnknown
} CyberiadaXMLFormat; } CyberiadaXMLFormat;
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* The Cyberiada GraphML error codes * The Cyberiada GraphML error codes
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
#define CYBERIADA_NO_ERROR 0 #define CYBERIADA_NO_ERROR 0
#define CYBERIADA_XML_ERROR 1 #define CYBERIADA_XML_ERROR 1
#define CYBERIADA_FORMAT_ERROR 2 #define CYBERIADA_FORMAT_ERROR 2
#define CYBERIADA_NOT_FOUND 3 #define CYBERIADA_BEHAVIOR_FORMAT_ERROR 3
#define CYBERIADA_BAD_PARAMETER 4 #define CYBERIADA_NOT_FOUND 4
#define CYBERIADA_ASSERT 5 #define CYBERIADA_BAD_PARAMETER 5
#define CYBERIADA_ASSERT 6
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* The Cyberiada GraphML library functions * The Cyberiada GraphML library functions
@@ -165,7 +187,10 @@ typedef enum {
/* Read an XML file and decode the SM structure */ /* Read an XML file and decode the SM structure */
int cyberiada_read_sm(CyberiadaSM* sm, const char* filename, CyberiadaXMLFormat format); int cyberiada_read_sm(CyberiadaSM* sm, const char* filename, CyberiadaXMLFormat format);
/* Encode the SM structure and write the data to an XML file */
int cyberiada_write_sm(CyberiadaSM* sm, const char* filename, CyberiadaXMLFormat format);
/* Print the SM structure to stdout */ /* Print the SM structure to stdout */
int cyberiada_print_sm(CyberiadaSM* sm); int cyberiada_print_sm(CyberiadaSM* sm);