This repository has been archived on 2024-08-13. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libcyberiadaml/cyberiadaml.h
2024-03-03 14:58:08 +03:00

202 lines
6.8 KiB
C

/* -----------------------------------------------------------------------------
* The Cyberiada GraphML library implemention
*
* The C library header
*
* Copyright (C) 2024 Alexey Fedoseev <aleksey@fedoseev.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see https://www.gnu.org/licenses/
*
* ----------------------------------------------------------------------------- */
#ifndef __CYBERIADA_ML_H
#define __CYBERIADA_ML_H
#ifdef __cplusplus
extern "C" {
#endif
/* -----------------------------------------------------------------------------
* The Cyberiada GraphML format library types
* ----------------------------------------------------------------------------- */
/* SM node types: */
typedef enum {
cybNodeSM = 0, /* state machine */
cybNodeSimpleState, /* simple state */
cybNodeCompositeState, /* composite state */
cybNodeSubmachineState, /* submachine state */
cybNodeComment, /* comment node */
cybNodeInitial, /* initial pseudostate */
cybNodeFinal, /* final pseudostate */
cybNodeChoice, /* final pseudostate */
cybNodeJunction, /* junction pseudostate */
cybNodeEntry, /* entry pseudostate */
cybNodeExit, /* exit pseudostate */
cybNodeHistory, /* shallow history pseudostate */
cybNodeDeepHistory, /* deep history pseudostate */
cybNodeFork, /* fork pseudostate */
cybNodeJoin, /* join pseudostate */
cybNodeTerminate, /* terminate pseudostate */
} CyberiadaNodeType;
/* SM node types: */
typedef enum {
cybEdgeTransition = 0,
} CyberiadaEdgeType;
/* SM behavior types: */
typedef enum {
cybBehaviorTransition = 0,
cybBehaviorEntry = 1,
cybBehaviorExit = 2,
cybBehaviorDo = 3,
} CyberiadaBehaviorType;
/* SM node & transitions geometry */
typedef struct {
double x, y;
} CyberiadaPoint;
typedef struct {
double x, y, width, height;
} CyberiadaRect;
typedef struct _CyberiadaPolyline {
CyberiadaPoint point;
struct _CyberiadaPolyline* next;
} 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) */
typedef struct _CyberiadaNode {
CyberiadaNodeType type;
char* id;
size_t id_len;
char* title;
size_t title_len;
CyberiadaBehavior* behavior;
CyberiadaRect* geometry_rect;
struct _CyberiadaNode* next;
struct _CyberiadaNode* parent;
struct _CyberiadaNode* children;
} CyberiadaNode;
/* SM edge (transition) */
typedef struct _CyberiadaEdge {
CyberiadaEdgeType type;
char* id;
size_t id_len;
char* source_id;
size_t source_id_len;
char* target_id;
size_t target_id_len;
CyberiadaNode* source;
CyberiadaNode* target;
CyberiadaBehavior* behavior;
CyberiadaPoint* geometry_source_point;
CyberiadaPoint* geometry_target_point;
CyberiadaPolyline* geometry_polyline;
CyberiadaPoint* geometry_label;
char* color;
size_t color_len;
struct _CyberiadaEdge* next;
} CyberiadaEdge;
/* SM extentions
typedef struct _CyberiadaExtension {
char* id;
size_t id_len;
char* title;
size_t title_len;
char* data;
size_t data_len;
struct _CyberiadaExtension* next;
} CyberiadaExtension;*/
/* SM graph (state machine) */
typedef struct {
char* name;
size_t name_len;
char* version;
size_t version_len;
char* info;
size_t info_len;
CyberiadaNode* nodes;
CyberiadaEdge* edges;
/* CyberiadaExtension* extensions;*/
} CyberiadaSM;
/* SM GraphML supported formats */
typedef enum {
cybxmlYED = 0,
cybxmlCyberiada,
cybxmlUnknown
} CyberiadaXMLFormat;
/* -----------------------------------------------------------------------------
* The Cyberiada GraphML error codes
* ----------------------------------------------------------------------------- */
#define CYBERIADA_NO_ERROR 0
#define CYBERIADA_XML_ERROR 1
#define CYBERIADA_FORMAT_ERROR 2
#define CYBERIADA_BEHAVIOR_FORMAT_ERROR 3
#define CYBERIADA_NOT_FOUND 4
#define CYBERIADA_BAD_PARAMETER 5
#define CYBERIADA_ASSERT 6
/* -----------------------------------------------------------------------------
* The Cyberiada GraphML library functions
* ----------------------------------------------------------------------------- */
/* Allocate the SM structure in memory (for heap usage) */
CyberiadaSM* cyberiada_create_sm(void);
/* Initialize the SM structure. Do not use the structure before the initialization! */
int cyberiada_init_sm(CyberiadaSM* sm);
/* Cleanup the content of the SM structure, free the conents memory */
int cyberiada_cleanup_sm(CyberiadaSM* sm);
/* Free the allocated SM structure (for heap usage) */
int cyberiada_destroy_sm(CyberiadaSM* sm);
/* Read an XML file and decode the SM structure */
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 */
int cyberiada_print_sm(CyberiadaSM* sm);
#ifdef __cplusplus
}
#endif
#endif